public abstract bool IntersectsWith(TriangleBoundsAspect triangle);
public override bool IntersectsWith(TriangleBoundsAspect triangle) { // сначала грубая проверка, аппроксимация окружностью float distanceBetweenCenters = (position - triangle.position).LengthFast; if (distanceBetweenCenters > longestRadius + triangle.longestRadius) return false; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (Misc.IntersectSegment(vertices[i].Position, vertices[(i + 1) % 3].Position, triangle.vertices[j].Position, triangle.vertices[(j + 1) % 3].Position)) { return true; } } } // Если нет пересечений, то возможен ещё один вариант - один треугольник в другом // Но мы не знаем, какой в каком, поэтому проверяем оба по очереди // на включение всех трёх вершин внутри себя bool threeVerts = true; for (int i = 0; i < 3; i++) { if (!IntersectsWith(triangle.vertices[i].Position)) { threeVerts = false; break; } } // этот треугольник не содержит внутри себя второй треугольник, проверяем другой if (!threeVerts) { for (int i = 0; i < 3; i++) { if (!triangle.IntersectsWith(vertices[i].Position)) return false; } } return true; }
public static TriangleBoundsAspect Create(object owner, Vector2 a, Vector2 b, Vector2 c) { TriangleBoundsAspect aspect = new TriangleBoundsAspect(owner, a, b, c); aspect.RegisterAllStuff(); return aspect; }
public override bool IntersectsWith(TriangleBoundsAspect triangle) { throw new NotImplementedException(); }