三角形重叠算法

2020-09-16 14:49发布

判断两个三角形是否有重合部分:

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
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。