我只是想知道是否有任何简单/有效的方法来检查方块是否落入三角形内。或者至少有一个角落在里面或有些重叠。例如考虑到下图,我应该能够分辨出3个正方形内部。即方形1明显在里面,方形2的一个角在里面,3个重叠。
答案 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)
也许这可以给出一个想法。
创建0-1值的三角形图像(这是困难的部分); 然后为每个方块创建它的0-1图像,这非常简单; 添加两个图像,并计算不同三角形或方形坐标的值。您甚至可以计算重叠区域的面积。
答案 4 :(得分:0)
您实际要做的是确定方块是否与三角形可线性分离,即如果有一条线将两个对象分开。如果存在这样的线,则它们不相交。有几种算法可以测试线性可分性。好处是它们是通用的,所以它可以与其他多边形一起使用。缺点是,由于它们的普遍性,它们可能不会使用您问题的特定特征来简化解决方案。
答案 5 :(得分:0)
由于您询问了matlab,因为其他答案解释了直接方法,我将提到一些可用的解决方案。您可能需要查看polyxpoly(如果您有Mapping Toolbox)。它可以处理更一般的情况。否则,文件交换中会有很多贡献,例如, Curve Intersect 2。另一方面,Polygon_Intersection返回重叠区域,而不仅仅是交叉点。