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();
 }