计算机、UNIX、Linux、Java等的时间为何从1970年1月1日开始计算?
简单解释: 很多编程语言起源于UNIX系统,而UNIX系统认为1970年1月1日0点是时间纪元,所以我们常说的UNIX时间戳是以1970年1月1日0点为计时起点时间的。 详细解释: Integer在JAVA内用32位表示,因此...
简单解释: 很多编程语言起源于UNIX系统,而UNIX系统认为1970年1月1日0点是时间纪元,所以我们常说的UNIX时间戳是以1970年1月1日0点为计时起点时间的。 详细解释: Integer在JAVA内用32位表示,因此...
DNS是域名系统(Domain Name System)的缩写,它是一种用于将域名转换为IP地址的互联网标准协议。当你在浏览器中输入网址时,浏览器会向本地DNS服务器发出请求,本地DNS服务器会解析该网址的IP地址,并将结果发送回浏览器,以便浏览器可以连接到相应的网站。
一、114DNS
二、阿里DNS:
三、腾讯DNS
四、百度DNS
五、谷歌DNS
循环就是重复执行语句。
循环的另一种重要类型是一直循环到给定的条件满足为止。
一、do循环
do循环的执行方式:执行标记为循环的代码,然后进行一个布尔测试,如果测试结果为true,就再次执行这段代码,并重复这个过程。当测试结果为false时,就退出循环。
do
{
<code to be looped>
} while(<Test>);
其中,计算<Test>会得到一个布尔值。while语句之后必须使用分号。
二、while循环
while循环中的布尔测试实在循环开始时进行,而不是最后进行。如果测试结果为false,就不会执行循环。程序的执行会直接跳转到循环之后的代码。
while(<Test>)
{
<code to looped>
}
三、for循环
for循环可以执行指定的次数,并维护它自己的计数器。要定义for循环,需要下列信息:
for(<initialization>; <condition>; <operation>)
{
<code to loop>
}
例:使用do循环和while循环输出了从1到10的数字:
int i;
for (i = 1; i <= 10; ++i)
{
WriteLine($"{i}");
}
计数器变量是整数i,它的初始值时1,在每次循环的最后递增1。在每次循环过程中,把i的值写到控制台。
可以将计数器变量声明为for语句的一部分(但无法在循环外使用变量i):
for (int i = 1; i <= 10; ++i)
{
WriteLine($"{i}");
}
四、循环的中断
五、无限循环
在代码编写错误或者故意进行设计时,可以定义永不终止的循环,即所谓的无限循环(infinite loop)。
while (true)
{
<code in loop>
}
本软件用于航测项目的各个阶段,可以使用程序内置的相机和无人机数据,也可以自定义相关数据,快捷地计算并显示航测的相关数据,作为航测作业人员的重要参考,降低作业人员的计算难度,提高计算效率;并且对于分区情况进行粗略概算,以便对分区有个初步了解。
程序界面包含三个分块,分别为:
1.“航测设备”:包含选择各种相机、无人机的型号,并自动匹配相应设备参数,也可以自定义参数;
2.“航拍参数”:调整详细参数,并实时得到相关航测数据。
3.“分区计算”:根据分区大小以及前面提到的各种参数,计算分区内相关数据,以便对分区航测情况简单了解。
在“相机”下拉菜单中,列举了经常使用的相机型号,选中相应的相机后,对右侧的影像尺寸、感光器尺寸、像元尺寸、镜头焦距信息进行快速赋值,程序内置数据见表1。
相机选择“自定义参数”时,可以解锁相机参数文本框,可以自定义相关参数进行计算。
表1 相机参数
相机 | 影像宽度 | 影像高度 | 传感器宽度 | 传感器高度 | 镜头焦距 |
Canon 5D | 4368 | 2912 | 35.9 | 24 | 35 |
Canon 5D Mark2 | 5616 | 3744 | 35.9 | 24 | 35 |
Canon 5D Mark3 | 5760 | 3840 | 35.9 | 24 | 35 |
Canon 5D Mark4 | 6720 | 4480 | 35.9 | 24 | 35 |
Canon 6D | 5472 | 3648 | 35.9 | 24 | 35 |
Canon 6D Mark2 | 6240 | 4160 | 35.9 | 24 | 35 |
DJI Phantom 4 | 4000 | 3000 | 6.16 | 4.62 | 3.6 |
DJI Phantom 4 Pro | 5472 | 3648 | 13.2 | 8.8 | 8.8 |
DJI Phantom 4 RTK | 5472 | 3648 | 13.2 | 8.8 | 8.8 |
Nikon D750 | 6016 | 4016 | 35.9 | 24 | 35 |
Nikon D810 | 7360 | 4912 | 35.9 | 24 | 35 |
SONY A5100 | 6000 | 4000 | 23.4 | 15.6 | 20 |
SONY A6400 | 6000 | 4000 | 23.4 | 15.6 | 35 |
SONY A7R | 7360 | 4912 | 35.9 | 24 | 35 |
SONY A7R2 | 7952 | 5304 | 35.9 | 24 | 35 |
SONY A7R3 | 7952 | 5304 | 35.9 | 24 | 35 |
SONY A7R4 | 9600 | 6400 | 35.9 | 24 | 35 |
SONY NEX-5N | 4912 | 3264 | 23.4 | 15.6 | 20 |
SONY NEX-7 | 6000 | 4000 | 23.4 | 15.6 | 20 |
SONY RX100 | 5472 | 3648 | 13.2 | 8.8 | 20 |
禅思 L1 | 5472 | 3648 | 13.2 | 8.8 | 8.8 |
禅思 P1 | 8192 | 5460 | 35.9 | 24 | 35 |
禅思 Zenmuse X5 | 4608 | 3456 | 17.3 | 13 | 15 |
禅思 Zenmuse X5S | 5280 | 3956 | 17.3 | 13 | 15 |
禅思 Zenmuse X7 | 6016 | 4008 | 23.4 | 15.6 | 35 |
赛尔 PSDK 102S | 6000 | 4000 | 23.4 | 15.6 | 35 |
赛尔 PSDK 202S Pro | 7952 | 5304 | 35.9 | 24 | 40 |
DJI Mavic 3E | 5280 | 3956 | 17.3 | 13 | 12.3 |
飞思 iXU-RS1000 | 11608 | 8708 | 53.4 | 40 | 50 |
在“无人机”下拉菜单中,列举了经常使用的无人机型号,选中相应的无人机后,对于相机设备可以快速匹配,并且下方的航测参数区域内的“航拍高度”和“飞行速度”等信息进行快速赋值,减少手动调整。
图1 航测计算器计算实例
根据相机参数的设定和无人机设备的选取,可以展示多种与航测相关的数据,既可以快速计算避免出错,也可以根据相关数据进行无人机飞行任务的可行性判断,如:“航拍间隔”不得小于相机最小曝光间隔、“像点位移”须小于规范规定的像点位移值(超限变为红色显示)、“地面分辨率”符合相应的绘图比例尺要求等等。
分区计算根据界面现有的数据,简要地计算了分区的面积、航程、时间、照片数量等信息,对于分区航测概况有一个简单的了解,便于后续工作展开有个预估。
分支
一、三元运算符
<test> ? <resultIfTrue> : <resultIfFalse>
计算<test>可以得到一个布尔值,运算符的结果根据这个值来确定是<resultIfTrue>还是<resultIfFalse>。
二、if语句
if语句基本语法:
if (<test>)
<code executed if <test> is true>;
先执行<test>,如果<test>是true,则执行该语句之后的代码。在代码执行完后,或者因为<test>是false,不执行这段代码,继续执行后面的代码。
else语句和if语句合并使用:
if (<test>)
<code executed if <test> is true>;
else
<code executed if <test> is false>;
先执行<test>,如果是true,执行if语句,如果是false,执行else语句。
if (<test>)
{
<code executed if <test> is true>;
}
else
{
<code executed if <test> is false>;
}
两段代码可以使用花括号将他们放在多个代码行。
if-else语句与三元运算符形式比较,冗长,但便于阅读和理解。
三、switch语句
switch语句非常类似于if语句,可以一次将测试变量与多个值进行比较,而不是仅测试一个条件。
switch基本语法:
switch (<testVar>)
{
case <comparisonVal1>:
<code to execute if <testVar> == <comparisonVal1> >
break;
case <comparisonVal2>:
<code to execute if <testVar> == <comparisonVal2> >
break;
……
case <comparisonValN>:
<code to execute if <testVar> == <comparisonValN> >
break;
default:
<code to execute if <testVar> != comparisonVals>
break;
}
<testVar>中的值与每一个<comparisonVal>值进行比较,如果有一个匹配,就执行为该匹配提供的语句。如果没有匹配,但有default语句,就执行default语句,就执行default部分的代码。
执行完每一部分的代码后,还需要有另一个语句break。
如果把多个case语句堆叠到一起,在后面加上代码块,可以一次检查多个条件,如果满足这些条件中的任何一个,就会执行代码:
switch (<testVar>)
{
case <comparisonVal1>:
case <comparisonVal2>:
<code to execute if <testVar> == <comparisonVal1> or
<testVar> == <comparisonVal2>>
break;
……
}
布尔(bool)类型可以有两个值:true 或 false。这种类型常用于记录某些操作的结果,以便处理这些结果。bool类型可用于存储比较的结果。
运算符 | 类别 | 示例表达式 | 结果 |
---|---|---|---|
== | 二元 | var1 = var2 == var3; | 如果var2等于var3,var1的值就是true,否则为false |
!= | 二元 | var1 = var2 != var3; | 如果var2不等于var3,var1的值就是true,否则为false |
< | 二元 | var1 = var2 < var3; | 如果var2小于var3,var1的值就是true,否则为false |
> | 二元 | var1 = var2 > var3; | 如果var2大于var3,var1的值就是true,否则为false |
<= | 二元 | var1 = var2 <= var3; | 如果var2小于或等于var3,var1的值就是true,否则为false |
>= | 二元 | var1 = var2 >= var3; | 如果var2大于或等于var3,var1的值就是true,否则为false |
表中var1都是bool类型的变量,var2和var3则可以使不同类型。
& 和 | 运算符也有两个类似的运算符,称为条件布尔运算符:
运算符 | 类别 | 示例表达式 | 结果 |
---|---|---|---|
&& | 二元 | var1 = var2 && var3; | 如果var2和var3都是true,var1的值就是true,否则为false(逻辑与) |
|| | 二元 | var1 = var2 || var3; | 如果var2或var3是true(或两者都是),var1的值就是true,否则为false(逻辑或) |
这些运算符的结果与&和|完全相同,但是其性能更好。两者都是检查第一个操作数的值(var2),如果已经能判断结果,就不必处理第二个操作数(var3)。
布尔赋值运算中,当表达式使用赋值(=)和按位运算符(&、|、^)时,就使用所比较数值的二进制表示来计算结果,而不是使用整数、字符串或近似的值。
运算符 | 类别 | 示例表达式 | 结果 |
---|---|---|---|
&= | 二元 | var1 &= var2; | var1的值是var1 & var2的结果 |
|= | 二元 | var1 |= var2; | var1的值是var1 | var2的结果 |
^= | 二元 | var1 ^= var2; | var1的值是var1 ^ var2的结果 |
运算符优先级2.0
优先级 | 运算符 |
---|---|
优先级 高 ↓ 低 | ++,- -(用作前缀),(),+,-(一元),!,~ *,/,% +,- <<,>> <,>,<=,>= ==,!= & ^ | && || =,*=,/=,%=,+=,-=,<<=,>>=,&=,^=,|= ++,- -(用作后缀) |
注意:添加括号(指定计算的顺序)可以使表达式看起来更清晰。
二、赋值运算符
运算符 | 类别 | 示例表达式 | 结果 |
---|---|---|---|
= | 二元 | var1 = var2; | var1被赋予var2的值 |
+= | 二元 | var1 += var2; | var1被赋予var1与var2的和 |
-= | 二元 | var1 -= var2; | var1被赋予var1与var2的差 |
*= | 二元 | var1 *= var2; | var1被赋予var1与var2的乘积 |
/= | 二元 | var1 /= var2; | var1被赋予var1与var2相除所得的结果 |
%= | 二元 | var1 %= var2; | var1被赋予var1与var2相除所得的余数 |
与=一样,它们都是根据运算符和右边的操作数,把一个值赋给左边的变量。
与+运算符一样,+=运算符也可以用于字符串。
三、运算符的优先级
优先级 | 运算符 |
---|---|
高 | ++、- -(用作前缀)、+、-(一元) |
↓ | *、/、% |
↓ | +、- |
↓ | =、*=、/=、%=、+=、- = |
低 | ++、- -(用作后缀) |
注意:括号可用于重写优先级顺序。++和- -用作后缀运算符时,在概念上其优先级最低。