两个对象之间的相交线

时间:2017-09-03 15:30:50

标签: matlab line

我正在尝试计算图片中两个对象彼此指向的位置。我想我会使用相交线来执行此操作,因为对象可以转换为直线。但有一个问题是,我似乎主要是为了寻找无限线之间的交叉而找到代码,这是我不需要的东西。

我从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行与有限线相交。图片代表了我想要绘制的内容。蓝线的长度有限,而红线是无限的,我试图确定它们是否相交。

enter image description here

1 个答案:

答案 0 :(得分:1)

听起来你已经能够确定两条线(即无限线)之间的交点。获得该点后,您可以轻松检查交叉点是否落在线段上。

让我们假设p0p1是定义linesegment端点的点,而px是两条无限线之间的交点。以下条件将检查pxp0之间是否有p1

d = dot(px-p0,p1-p0)/sum((p1-p0).^2);
if d >= 0 && d <= 1
    % intersecting
else
    % not intersecting
end

<强>理由

如果我们假设点px沿着p0p1定义的线下降,那么它可以用以下参数矢量方程表示

px = p0 + (p1 - p0)*d

其中d是标量参数。从公式中可以清楚地看出px介于p0p1之间且当且仅当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