叉乘(九)——点到线段的最近点
如果该线段平行于X轴(Y轴),则过点point作该线段所在直线的垂线,垂足很容易求得,然后计算出垂足,
如果垂足在线段上则返回垂足,否则返回离垂足近的端点;
如果该线段不平行于X轴也不平行于Y轴,则斜率存在且不为0。
设线段的两端点为pt1和pt2,斜率为:k = ( pt2.y - pt1. y ) / (pt2.x - pt1.x );
该直线方程为:y = k* ( x - pt1.x) + pt1.y。
其垂线的斜率为 - 1 / k,垂线方程为:y = (-1/k) * (x - point.x) + point.y 。
联立两直线方程解得:x = ( k^2 * pt1.x + k * (point.y - pt1.y ) + point.x ) / ( k^2 + 1) ,y = k * ( x - pt1.x) + pt1.y;
然后再判断垂足是否在线段上,如果在线段上则返回垂足;
如果不在则计算两端点到垂足的距离,选择距离垂足较近的端点返回。
只要分别计算点到每条线段的最近点,记录最近距离,取其中最近距离最小的点即可。
如果该点在圆心,因为圆心到圆周任一点的距离相等,返回UNDEFINED。
连接点P和圆心O,如果PO平行于X轴,
则根据P在O的左边还是右边计算出最近点的横坐标为centerPoint.x - radius 或 centerPoint.x + radius。
如果PO平行于Y轴,则根据P在O的上边还是下边计算出最近点的纵坐标为 centerPoint.y +radius或 centerPoint.y - radius。
如果PO不平行于X轴和Y轴,则PO的斜率存在且不为0,这时直线PO斜率为k = ( P.y - O.y )/ ( P.x - O.x )。
直线PO的方程为:y = k * ( x - P.x) + P.y。
设圆方程为: (x - O.x ) ^2 + ( y - O.y ) ^2 = r ^2,//这个就是以O为圆心,以r为半径的圆。
联立两方程组可以解出直线PO和圆的交点,取其中离P点较近的交点即可。
posted on 2011-11-15 20:02 More study needed. 阅读(1053) 评论(0) 编辑 收藏 举报