如何解决如何计算无限长线和线段之间的交点?
function getLineIntersection(vec2 p0,vec2 direction,vec2 p2,vec2 p3) {
// return a vec2
}
我已经环顾了现有的解决方案,它们似乎都在处理如何找到两条线段之间或两条无限线之间的交点。线有初始位置,角度,需要判断是否与线段相交的问题,有没有解决方案?基本上是这样的:
应该有一条线段从一个位置开始并具有单位方向,另一条线段只是由两点连接的一条线。这是否可能,如果可能,是否有计算交点的好方法(如果存在)?
解决方法
如果您有一条由点 P
和归一化方向 R
定义的无限线,以及由点 Q
和方向定义的第二条无限线S
,那么无限线X
的交点是:
alpha ... angle between Q-P and R
beta ... angle between R and S
gamma = 180° - alpha - beta
h = | Q - P | * sin(alpha)
u = h / sin(beta)
t = | Q - P | * sin(gamma) / sin(beta)
t = dot(Q-P,(S.y,-S.x)) / dot(R,-S.x)) = determinant(mat2(Q-P,S)) / determinant(mat2(R,S))
u = dot(Q-P,(R.y,-R.x)) / dot(R,R)) / determinant(mat2(R,S))
X = P + R * t = Q + S * u
如果要检测交点是否在留置权上,需要比较交点的距离和线的长度。
如果 X
对于 t
X = p2 + (p3 - p2) * t
) 在线段上
vec2 getLineIntersection(vec2 p0,vec2 direction,vec2 p2,vec2 p3)
{
vec2 P = p2;
vec2 R = p3 - p2;
vec2 Q = p0;
vec2 S = direction;
vec2 N = vec2(S.y,-S.x);
float t = dot(Q-P,N) / dot(R,N);
if (t >= 0.0 && t <= 1.0)
return P + R * t;
return vec2(-1.0);
}
,
从两条无限长线的交点开始,以参数形式表示(例如,A + tp,其中 A 是“起点”,p 是方向向量,t 是标量参数)。求解一个由两个方程组成的系统,得到交点的两个参数。
现在,如果你的一条线真的是一段 AB,并且 B = A + p(即方向向量从 A 到 B),那么如果参数 t 介于 0 和 1 之间,则交点位于段。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。