计算交点:
private float Cross(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4)
{
return (p2.x - p1.x) * (p4.y - p3.y) - (p2.y - p1.y) * (p4.x - p3.x);
}
private float Area(Vector2 p1, Vector2 p2, Vector2 p3)
{
return Cross(p1, p2, p1, p3);
}
private float fArea(Vector2 p1, Vector2 p2, Vector2 p3)
{
return Mathf.Abs(Area(p1, p2, p3));
}
private Vector2 Inter(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4)
{
float s1 = fArea(p1, p2, p3), s2 = fArea(p1, p2, p4);
return new Vector2((p4.x * s1 + p3.x * s2) / (s1 + s2), (p4.y * s1 + p3.y * s2) / (s1 + s2));
}
计算是否相交:
bool IsIntersection(Vector3 a, Vector3 b, Vector3 c, Vector3 d)
{
var crossA = Mathf.Sign(Vector3.Cross(d - c, a - c).y);
var crossB = Mathf.Sign(Vector3.Cross(d - c, b - c).y);
if (Mathf.Approximately(crossA, crossB)) return false;
var crossC = Mathf.Sign(Vector3.Cross(b - a, c - a).y);
var crossD = Mathf.Sign(Vector3.Cross(b - a, d - a).y);
if (Mathf.Approximately(crossC, crossD)) return false;
return true;
}
网友评论