测边交会
目录
第1章计算公式
如下图所示,已知A、B点的坐标,通过测量AP及BP的长度即可求出点P的坐标。这种定位方法就是测边交会。
1.1 排列顺序
为了下面讨论的方便,引入变量sign,它的数值说明了A、B、P的排列顺序:A、B、P的排列顺序与方位角的增加方向一致时sign取值为1;否则sign取值为-1。下图是数学系,A、B、P为逆时针排列,与方位角的增加方向一致,因此sign为1。
图1.1
下图是测量系,A、B、P为顺时针排列,与方位角的增加方向一致,因此sign为1。
图1.2
1.2 计算公式一
下面的公式非常适合于编程:
验证上面公式的C代码如下:
srand(time(NULL)); double xA = rand(); double yA = rand(); double xB = rand(); double yB = rand(); double xP = rand(); double yP = rand(); double AP = _hypot(xA - xP,yA - yP); double BP = _hypot(xB - xP,yB - yP); double sign = 1.0; if((yP - yA) * (xB - xA) - (xP - xA) * (yB - yA) < 0.0) {//A,B,P与方位角增加方向相反。矢量AB叉乘矢量AP的z轴分量小于零 sign = -1.0; } double AB = _hypot(xA - xB,yA - yB); double aAB = atan2(yB - yA,xB - xA); double A = acos((AB*AB + AP*AP - BP*BP) / (2.0*AB*AP)); double XP = xA + AP * cos(aAB + A * sign); double YP = yA + AP * sin(aAB + A * sign); double deltaX = XP - xP; double deltaY = YP - yP; |
验证方法:deltaX和deltaY应该接近于零。
1.3 排列顺序的判定
1.4 计算公式二
整理一下,这套公式的计算步骤如下
验证上面公式的C代码如下:
srand(time(NULL)); double xA = rand(); double yA = rand(); double xB = rand(); double yB = rand(); double xP = rand(); double yP = rand(); double AP = _hypot(xA - xP,yA - yP); double BP = _hypot(xB - xP,yB - yP); double sign = 1.0; if((yP - yA) * (xB - xA) - (xP - xA) * (yB - yA) < 0.0) {//A,B,P与方位角增加方向相反。矢量AB叉乘矢量AP的z轴分量小于零 sign = -1.0; } double AB = _hypot(xA - xB,yA - yB); double S4 = sqrt((AB + AP + BP) * (-AB + AP + BP) * (AB - AP + BP) * (AB + AP - BP)); double XP = (xA*(AB*AB+BP*BP-AP*AP)+xB*(AB*AB+AP*AP-BP*BP)+S4*sign*(yA-yB))/(2.0*AB*AB); double YP = (yA*(AB*AB+BP*BP-AP*AP)+yB*(AB*AB+AP*AP-BP*BP)+S4*sign*(xB-xA))/(2.0*AB*AB); double deltaX = XP - xP; double deltaY = YP - yP; |
验证方法:deltaX和deltaY应该接近于零。
第2章精度评定
2.1 几何推导
下面研究边长BP增加微小量dBP后,对P点位置的影响有多大?请参考下图。
图2.1
2.2 代数推导