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

Matlab 检查正方形是否落在三角形内的最简单/有效方法,matlab,math,geometry,Matlab,Math,Geometry,我只是想知道是否有简单有效的方法来检查正方形是否落在三角形内。或者至少有一个角落在内部或重叠。e、 g.考虑到下图,我应该能够分辨出3个正方形落在里面。i、 e.正方形1明显在里面,正方形2的一个角在里面,3个重叠。 这里是新手。我想到的一个想法如下。这可能效率不高,但相当简单 1) 计算正方形的四个角 2) 选择每个角/点将“行走”的方向。基本上为该点选择一个矢量方向 3) 让这些点沿着向量“走”,看看它是否与三角形的边界感兴趣 4) 如果一个点的行走向量与奇数次相交,这意味着它在内部。如果它

我只是想知道是否有简单有效的方法来检查正方形是否落在三角形内。或者至少有一个角落在内部或重叠。e、 g.考虑到下图,我应该能够分辨出3个正方形落在里面。i、 e.正方形1明显在里面,正方形2的一个角在里面,3个重叠。
这里是新手。我想到的一个想法如下。这可能效率不高,但相当简单

1) 计算正方形的四个角

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

3) 让这些点沿着向量“走”,看看它是否与三角形的边界感兴趣

4) 如果一个点的行走向量与奇数次相交,这意味着它在内部。如果它相交偶数次,则表示它在外部。记住,0等于偶数


5) 如果你真的沿着三角形的一条边走,就必须有特殊情况。在大多数情况下,只要选择一个不同的方向就可以避免这种情况。

我正在查看这张漂亮的照片。它解释了如何使用各种技术测试点是否位于三角形内。当一个正方形的角落落在里面时,它似乎会有所帮助

我喜欢重心技术,这里我用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
函数d=isinside(p,a,b,c)
%测试点p(x,y)是否在三角形内
%具有顶点a(x,y)、b(x,y)和c(x,y)
v0=c-a;
v1=b-a;
v2=p-a;
A=[点(v0,v0)点(v1,v0);点(v0,v1)点(v1,v1)];
b=[点(v2,v0);点(v2,v1)];
x=A\b;
%检查点是否在三角形中
如果(x(1)>0&(x(2)>0)&(和(x)<1)
d=正确;
其他的
d=假;
结束
然后我会测试正方形的每个顶点,如果有一个落在里面,我会返回。计算量很大,但值得一试


对于重叠,我将测试交点,如本文所讨论的,三角形和正方形的每一条线的组合。

将三角形视为三个向量,所有向量都以固定的旋转顺序:a->B,B->C和C->a

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


从概念上讲,您试图确定正方形顶点是在直线的左侧还是右侧。实际上你并不在乎它是左还是右,或者你是顺时针还是逆时针。。。只有正方形顶点在所有三角形向量的同一侧。

也许这可以给出一个想法

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

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

既然您询问了matlab,因为其他答案解释了直接方法,我将提及一些可用的解决方案。您可能想看看(如果您有映射工具箱的话)。它可以处理更一般的情况。否则,在文件交换上会有大量贡献,请参见例如。另一方面,返回重叠区域,而不仅仅是交点。

请指定对象的指定方式-是否指定了角点的坐标?此外,如果正方形与三角形重叠,但三角形内部没有角,会发生什么情况?如果给定三角形和正方形中每个顶点的(x,y)坐标(或者在最坏的情况下,可以计算),则认为是“内部”吗。重叠。hm.:'-(…我从来没有想到过这个,但这会被考虑在内。当我说叉积的“符号”时,自然我的意思是你的2D单词实际上是(x,y,0),然后你会看到后面z值的符号。要处理其他情况,最简单的方法可能是检查任何正方形边缘是否与三角形边缘交叉。这是否也会导致重叠?我回答中的方法会告诉你正方形是否完全在三角形内。我评论中的方法(关于边的平分)将告诉您正方形是否与三角形相交(因此重叠)。未处理的情况当然是三角形完全位于正方形内部。您可能需要进一步澄清您的问题。还有哪些类型的三角形-正方形交点被归类为“内部”?嗨,paddy,目前我正在进行一个简化假设,即三角形始终大于正方形,因此案例为正方形完全内敛且方正,重叠或内部有一个角。即使是简单的情况,这也会失败。你真的测试过吗?