我正在尝试计算图片中两个对象彼此指向的位置。我想我会使用相交线来执行此操作,因为对象可以转换为直线。但有一个问题是,我似乎主要是为了寻找无限线之间的交叉而找到代码,这是我不需要的东西。
我从a matlab blog找到了这段代码,详细说明了如何找到相交的无限行。
A = [lineA(1,:) - lineA(2,:); lineB(2,:) - lineB(1,:)]';
if rank(A) < 2
disp('Parallel')
B = [lineA(1,:) - lineA(2,:); lineA(1,:) - lineB(1,:)]';
if rank(B) < 2
disp('Collinear')
if all( (sort(lineA(:,1),'descend')-sort(lineB(:,1))) ...
.*[-1;1] <= sqrt(eps) )
tf = true;
else
tf = false;
end
else
tf = false;
end
else
pq = linsolve(A,(lineB(2,:) - lineA(2,:))');
tf = all(pq>=-sqrt(eps)) & all(pq<=1+sqrt(eps));
end
我还找到了关于line + circle intersections的旧问题,这些问题看起来更接近我可能需要的问题。
然而问题是我试图检查1行与有限线相交。图片代表了我想要绘制的内容。蓝线的长度有限,而红线是无限的,我试图确定它们是否相交。
答案 0 :(得分:1)
听起来你已经能够确定两条线(即无限线)之间的交点。获得该点后,您可以轻松检查交叉点是否落在线段上。
让我们假设p0
和p1
是定义linesegment端点的点,而px
是两条无限线之间的交点。以下条件将检查px
与p0
之间是否有p1
。
d = dot(px-p0,p1-p0)/sum((p1-p0).^2);
if d >= 0 && d <= 1
% intersecting
else
% not intersecting
end
<强>理由强>
如果我们假设点px
沿着p0
和p1
定义的线下降,那么它可以用以下参数矢量方程表示
px = p0 + (p1 - p0)*d
其中d
是标量参数。从公式中可以清楚地看出px
介于p0
和p1
之间且当且仅当0 <= d <= 1
。
我们可以使用一些线性代数来解决d
% subtract p0 from both sides
(px - p0) = (p1 - p0)*d
% multiply by (p1 - p0)' to make the vectors into scalars
(p1 - p0)'(px - p0) = (p1 - p0)'(p1 - p0)*d
% divide to find d
d = ((p1 - p0)'(px - p0)) / ((p1 - p0)'(p1 - p0))
% express using dot product and l2 norm.
d = dot(p1-p0,px-p0) / norm(p1-p0)^2