最近研究轨迹压缩算法,使用道格拉斯-普克算法进行压缩时,需要根据三点坐标求三角形的高,总结了下有下面两种方法:
1、根据海伦公式求面积
已知三点坐标可以求出三边长。 然后根据下面的推导过程可以得出海伦公式:
根据求出的面积S和BC边的边长可以求出高AD。
2、直接根据坐标推导出面积(积分原理,适用于平面直角坐标系)
已知A(x1,y1),B(x2,y2),C(x3,y3) ,求ABC的面积,如下图:
可以先求梯形AX1X2B和梯形BX2X3C的面积和,然后减去梯形AX1X3C的面积,就可以得到三角形ABC的面积,这其实是积分思想的应用,用这种方法可以计算任意多边形的面积。(注意:如果∠ACB是钝角,即AC边上的高落在AC延长线上如右上图结果一样)
S=(y1+y2)(x2-x1)/2+(y2+y3)(x3-x2)/2-(y1+y3)(x3-x1)/2=(x2y1-x1y2+x3y2-x2y3-x3y1+x1y3)/2 ;
然后根据坐标求出边长,即可得每边对应的高。
3、Javascript代码实现
//计算垂距(start代表A点,center代表B点,end代表C点)
function distToSegment(start, end, center){
//下面用海伦公式计算面积
let a = Math.abs(calculationDistance(start, end));
let b = Math.abs(calculationDistance(start, center));
let c = Math.abs(calculationDistance(end, center));
let p = (a + b + c) / 2.0;
let s = Math.sqrt(Math.abs(p * (p - a) * (p - b) * (p - c)));
return s * 2.0 / a;
};
总结比较
上面两种方法其实计算量差不多,方法2略胜一筹,因为只需要计算所需那条边对应的边长即可(但是坐标推算只适用于平面直角坐标系,并不适用于经纬度),而使用海伦公式则要计算三边边长。