叉乘(九)——点到线段的最近点

计算点到线段的最近点:

  如果该线段平行于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点较近交点即可。



你可能感兴趣的:(叉乘(九)——点到线段的最近点)