检查方形是否落入三角形内的最简单/有效方法

时间:2012-09-15 19:39:22

标签: matlab math geometry

我只是想知道是否有任何简单/有效的方法来检查方块是否落入三角形内。或者至少有一个角落在里面或有些重叠。例如考虑到下图,我应该能够分辨出3个正方形内部。即方形1明显在里面,方形2的一个角在里面,3个重叠。 example figure

6 个答案:

答案 0 :(得分:4)

将三角形视为三个向量,全部采用固定的旋转顺序:A-> B,B-> C和C-> A

现在,考虑每个三角形顶点,从该顶点到每个方形顶点有四个向量。您计算每个三角形边矢量和每个三角形方形矢量(总共12个)之间的交叉积。如果交叉产品都是相同的符号(或零),则你的方块在里面。

从概念上讲,您正在尝试确定方形顶点是在线的左侧还是右侧。您实际上并不关心它是左侧还是右侧,或者您是顺时针还是逆时针顺序......只是方形顶点位于所有三角形矢量的同一侧。

答案 1 :(得分:2)

我正在查看这个不错的tutorial。它解释了如何使用各种技术测试点是否在三角形内。当一个方角落入里面时似乎会有所帮助。

我喜欢Barycentric技术,在这里我为matlab重新实现了它:

function d = isinside(p,a,b,c)

    % Test if a point p(x,y) is inside a triangle
    % with vertices a(x,y), b(x,y) and c(x,y)

    v0 = c - a;
    v1 = b - a;
    v2 = p - a;

    A = [dot(v0,v0) dot(v1,v0);dot(v0,v1) dot(v1,v1)];
    b = [dot(v2,v0); dot(v2,v1)];

    x  = A\b;

    % Check if point is in triangle
    if (x(1) > 0) && (x(2) > 0) && (sum(x) < 1)
        d = true;
    else
        d = false;
    end

然后我会测试正方形的每个顶点,如果发生了其中一个落入我将返回。相当多的计算,但值得一试。

对于重叠,我会测试交叉点,如thread中所讨论的,对于来自三角形和正方形的每一行组合。

答案 2 :(得分:1)

新手在这里。想到的一个想法如下。这可能效率不高,但相当简单。

1)计算广场的4个角。

2)选择每个角落/点将“行走”的方向。基本上选择该点的矢量方向。

3)让这些点沿着矢量“行走”,看看它是否与三角形的边界有关。

4)如果一个点的行走矢量与奇数次相交,则意味着它在里面。如果它相交偶数次,则意味着它在外面。记住0计算为偶数。

5)如果您实际沿着三角形的边缘行走,则必须进行特殊情况。在大多数情况下,这可以通过选择不同的方向来避免。

答案 3 :(得分:1)

也许这可以给出一个想法。

enter image description here

创建0-1值的三角形图像(这是困难的部分); 然后为每个方块创建它的0-1图像,这非常简单; 添加两个图像,并计算不同三角形或方形坐标的值。您甚至可以计算重叠区域的面积。

答案 4 :(得分:0)

您实际要做的是确定方块是否与三角形可线性分离,即如果有一条线将两个对象分开。如果存在这样的线,则它们不相交。有几种算法可以测试线性可分性。好处是它们是通用的,所以它可以与其他多边形一起使用。缺点是,由于它们的普遍性,它们可能不会使用您问题的特定特征来简化解决方案。

答案 5 :(得分:0)

由于您询问了matlab,因为其他答案解释了直接方法,我将提到一些可用的解决方案。您可能需要查看polyxpoly(如果您有Mapping Toolbox)。它可以处理更一般的情况。否则,文件交换中会有很多贡献,例如, Curve Intersect 2。另一方面,Polygon_Intersection返回重叠区域,而不仅仅是交叉点。