判断点在线段上的投影点是否在线段内

应用场景

多段线上找到能被投影的线段

已知条件:

线段两端点坐标:P1[x1, y1]、P2[x2, y2]
目标点:P[x0,y0]

QQ截图20200324164722.png

思路

  1. 直接求出投影点,然后判断投影点是否在P1P2之间
  2. 求向量P1P2和P1P、P2P1和P2P的夹角。若有一个为钝角,则在线段外面


    QQ截图20200324165727.png
QQ截图20200324170007.png

代码

function isPointInsideSegment(x0, y0, x1, y1, x2, y2) {
  // 求Cos∠PP1P2
  let dx10, dy10, m10, dx12, dy12, m12;
  dx10 = x0 - x1;
  dy10 = y0 - y1;
  m10 = Math.hypot(dx10, dy10);
  dx12 = x2 - x1;
  dy12 = y2 - y1;
  m12 = Math.hypot(dx12, dy12);
  if ((dx10 * dx12 + dy10 * dy12) / m10 / m12 < 0) return false;

  // 求Cos∠PP2P1
  let dx20, dy20, m20, dx21, dy21, m21;
  dx20 = x0 - x2;
  dy20 = y0 - y2;
  m20 = Math.hypot(dx20, dy20);
  dx21 = x1 - x2;
  dy21 = y1 - y2;
  m21 = Math.hypot(dx21, dy21);
  return (dx20 * dx21 + dy20 * dy21) / m20 / m21 >= 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容