Простой способ разбить треугольник на равные под-треугольники - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь разбить треугольник пополам. Треугольник можно вращать в любом случае, но всегда можно разделить поровну пополам (его равнобедренный треугольник не равносторонний).

У меня возникла идея, как разделить треугольник любого поворота на 2 подтреугольника, но это наивно, и мне нужно проверить, каково вращение треугольника.

Есть ли более простой способ разделить треугольник пополам?

Ниже приведен пример того, чего я пытаюсь достичь. Изображение 1 - это мои исходные треугольники, затем моя функция будет запускаться для каждого треугольника, чтобы получить изображение 2, а затем моя функция будет снова запускаться для каждого треугольника и создавать изображение 3.

enter image description here enter image description here enter image description here

def split_triangle_evenly(tri_pts):
    # Pre: tri_pts[1] will always be the split point
    # ie, tri_pts[1] is the right-angle 
    half_tri1 = None
    half_tri2 = None
    break_x = tri[1][0]
    break_y = tri[1][1]

    # Naive technique that needs to check the rotation of the triangle
    # in order to figure out how to split it
    # is there a simplier way?
    if break_x > tri[0][0] and break_x > tri[2][0]:
        half_tri1 = (
            tri[0],
            (tri[0][0], break_y),
            tri[1]
        )
        half_tri2 = (
            tri[2],
            (tri[0][0], break_y),
            tri[1]
        )
    elif break_x < tri[0][0] and break_x < tri[2][0]:
        ...
    elif ...

    return (half_tri1, half_tri2)

1 Ответ

0 голосов
/ 09 апреля 2019

Если у вас есть равнобедренный треугольник с вершиной разрыва tri_pnts[1], то для любой ориентационной точки разрыва на противоположной стороне будет

 breakpnt[0] = (tri_pnts[0][0]  + tri_pnts[2][0]) / 2
 breakpnt[1] = (tri_pnts[0][1]  + tri_pnts[2][1]) / 2

        half_tri1 = (
            tri[0],
            breakpnt,
            tri[1]
        )
        half_tri2 = (
            tri[1],
            breakpnt,
            tri[2]
        )

потому что медиана равнобедренного треугольника делит его на два одинаковых треугольника.

Нужно ли указывать конкретную ориентацию получающихся вершин треугольника? Этот код дает одинаковую ориентацию для обоих треугольников (или CW или CCW) - если это важно ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...