如何判断点是否在线段右侧及找到AB段右侧首个邻接线段

解决方案
你初步思路的第一步是对的,第二步的判断逻辑存在漏洞,无法覆盖所有场景,以下是完整的可落地实现方案:
前置准备
所有点坐标采用二维坐标表示,记为 (x, y),你已经掌握所有顶点的坐标信息。
步骤1:过滤AB右侧的邻接点
我们沿着A→B的方向前进,右手侧即为需求里的「右侧」,可以通过向量叉乘快速判断点的位置:
- 计算AB的方向向量:
vec_AB = (B.x - A.x, B.y - A.y) - 对每个与B相连的点P,计算B到P的方向向量:
vec_BP = (P.x - B.x, P.y - B.y) - 计算两个向量的叉乘:
cross = vec_AB.x * vec_BP.y - vec_AB.y * vec_BP.x- 若
cross < 0:P在AB右侧,保留 - 若
cross >= 0:P在AB左侧或与AB共线,直接排除
- 若
步骤2:从保留的右侧点中找最靠右的点
不需要计算垂线和垂足,直接通过向量叉乘比较两个点的相对位置,避免三角函数计算带来的精度损耗:
对于两个右侧点P1、P2,计算向量叉乘:cross_p = vec_BP1.x * vec_BP2.y - vec_BP1.y * vec_BP2.x
- 若
cross_p < 0:说明P2相对P1更靠顺时针方向,也就是更靠右,P2优先级更高 - 若
cross_p > 0:说明P1更靠右,P1优先级更高
遍历所有保留的右侧点,按上述规则比较,最终优先级最高的点对应的线段就是你要找的「AB右侧第一个邻接线段」。
原有第二步思路的问题说明
举个简单反例即可验证:AB是水平向右的线段,A(0,0)、B(1,0),两个右侧点分别为P(2,-1)、Q(1.1,-0.1),按照原有思路计算垂足到A的距离:P的垂足是(2,0),距离A为2;Q的垂足是(1.1,0),距离A为1.1,会错误选中Q。但实际沿着A→B走到B之后,往P走是右转90度,往Q走是右转约45度,显然P才是更靠右的路径,和原有思路计算结果矛盾。
内容的提问来源于stack exchange,提问作者alex toader
相关产品推荐
相关产品推荐

