已知三角形三点坐标求一边上的高(海伦公式和坐标推导)

最近研究轨迹压缩算法,使用道格拉斯-普克算法进行压缩时,需要根据三点坐标求三角形的高,总结了下有下面两种方法:

1、根据海伦公式求面积

已知三点坐标可以求出三边长。 然后根据下面的推导过程可以得出海伦公式:

已知三角形三点坐标求一边上的高(海伦公式和坐标推导)_第1张图片

根据求出的面积S和BC边的边长可以求出高AD。 

2、直接根据坐标推导出面积(积分原理,适用于平面直角坐标系) 

已知A(x1,y1),B(x2,y2),C(x3,y3) ,求ABC的面积,如下图:

已知三角形三点坐标求一边上的高(海伦公式和坐标推导)_第2张图片已知三角形三点坐标求一边上的高(海伦公式和坐标推导)_第3张图片

 

可以先求梯形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略胜一筹,因为只需要计算所需那条边对应的边长即可(但是坐标推算只适用于平面直角坐标系,并不适用于经纬度),而使用海伦公式则要计算三边边长。

你可能感兴趣的:(算法,GIS,GIS算法专栏,GIS,算法)