判断两个三角形是否有重合部分:
1:判断两个三角形是否相交
a:判断两个三小型的所有边是否存在相交
2:判断两个三角形是否包含关系
a:判断一个三角形的顶点和另一个三角形所有顶点连线 与 该顶点对应的边是否相交。
C#代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TestT
{
//三角形1
private PointPra[] triangle_1 = { new PointPra().Init(1.0f, 1.0f) , new PointPra().Init(2.0f, 2.0f), new PointPra().Init(3.0f, 1.0f) };
//三角形2
private PointPra[] triangle_2 = { new PointPra().Init(1.8f, 1.2f) , new PointPra().Init(2.0f, 1.8f), new PointPra().Init(2.2f, 1.2f) };
public void Main()
{
Debug.Log("Main");
if (IsIntersect(triangle_1, triangle_2))
{
Debug.Log("相交");
}
else
{
if (IsContain(triangle_1, triangle_2))
{
Debug.Log("包含");
}
else
{
Debug.Log("没有重合部分");
}
}
}
//是否相交
public bool IsIntersect(PointPra[] t1, PointPra[] t2)
{
for(int i=0;i<3;i++)
{
int index1 = i;
int index2 = i+1;
if (index2 >= 3)
index2 = 0;
LinePra l1 = PointTRoLine(t1[index1].x, t1[index1].y, t1[index2].x, t1[index2].y);
for (int j=0;j<3;j++)
{
int index1t = j;
int index2t = j + 1;
if (index2t >= 3)
index2t = 0;
LinePra l2 = PointTRoLine(t2[index1t].x, t2[index1t].y, t2[index2t].x, t2[index2t].y);
if (LineIsIntersect(l1, l2))
{
return true;
}
}
}
return false;
}
//线段是否相交
private bool LineIsIntersect(LinePra l1, LinePra l2)
{
if (l1.a == l2.a && l1.b != l2.b)
{
return false;
}
float x1 = (l2.b - l1.b) / (l1.a - l2.a);
float y1 = (l1.b * l2.a - l2.b * l1.a) / (l2.a - l1.a);
if ((x1 >= l1.x1 && x1 <= l1.x2) || (x1 >= l1.x2 && x1 <= l1.x1))
{
if ((x1 >= l2.x1 && x1 <= l2.x2) || (x1 >= l2.x2 && x1 <= l2.x1))
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
//是否包含
public bool IsContain(PointPra[] t1, PointPra[] t2)
{
for(int i=0;i<3;i++)
{
if (!IsContainPoint(t1, t2[i]))
{
return false;
}
if (!IsContainPoint(t2, t1[i]))
{
return false;
}
}
return true;
}
private bool IsContainPoint(PointPra[] t1, PointPra pp)
{
for(int i=0;i<3;i++)
{
LinePra l1 = PointTRoLine(t1[i].x, t1[i].y, pp.x, pp.y);
int index1 = i+1;
int index2 = i+2;
if (index1 >= 3)
{
index1 -= 3;
}
if (index2 >= 3)
{
index2 -= 3;
}
LinePra l2 = PointTRoLine(t1[index1].x, t1[index1].y, t1[index2].x, t1[index2].y);
if (LineIsIntersect(l1, l2))
{
return false;
}
}
return true;
}
//点转换成线
private LinePra PointTRoLine(float x_1, float y_1, float x_2, float y_2)
{
LinePra lp = new LinePra();
lp.a = (y_1 - y_2) / (x_1 - x_2);
lp.b = y_1 - (y_1 - y_2) / (x_1 - x_2) * x_1;
lp.x1 = x_1;
lp.x2 = x_2;
lp.y1 = y_1;
lp.y2 = y_2;
return lp;
}
}
public struct LinePra
{
public float a;
public float b;
public float x1;
public float y1;
public float x2;
public float y2;
}
public struct PointPra
{
public PointPra Init(float x,float y)
{
this.x = x;
this.y = y;
return this;
}
public float x;
public float y;
}
本人qq:344810449,欢迎探讨研究。
作者:unity游侠
链接:https://blog.csdn.net/y90o08u28/article/details/87713649
来源:CSDN
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。