Добавлен Atesla
Народ, такой вопрос:
Мне нужна треугольная область. Как можно реализовать проверку этой области внутри?
У меня есть способ, но считаю его костыльным:
создать три точки, от двух первых точек на основании создавать по две точки, которые сужаются, находить между ними расстояние и записывать в массив необходимые данные, если они "новые". Две новые точки опираются на предыдущие. И так делать, пока не дойдем до 3 точки.
Естественно, заранее мы не знаем, где эти точки находятся.
Т1 – точка 1, Тn+1 – точка n+1 (массив точек с циклом, n – потому что изначально не известно их кол-во).
Код необязателен, главное – понять алгоритм и правильное направление.
Мне нужна треугольная область. Как можно реализовать проверку этой области внутри?
У меня есть способ, но считаю его костыльным:
создать три точки, от двух первых точек на основании создавать по две точки, которые сужаются, находить между ними расстояние и записывать в массив необходимые данные, если они "новые". Две новые точки опираются на предыдущие. И так делать, пока не дойдем до 3 точки.
Естественно, заранее мы не знаем, где эти точки находятся.
Т1 – точка 1, Тn+1 – точка n+1 (массив точек с циклом, n – потому что изначально не известно их кол-во).
Код необязателен, главное – понять алгоритм и правильное направление.
Принятый ответ
Каждая сторона треугольника рассматривается как отрезок, лежащий на прямой. Для каждого из этих отрезков строится уравнение прямой.
Уравнение прямой:
Уравнение прямой:
Ax + By + C = 0
Отрезки заданы двумя точками - вершинами треугольника - соответственно уравнение прямой для каждой стороны треугольника будет выглядеть следующим образом:
(y1 - y2) * x + (x2 - x1) * y + (x1 * y2 - x2 * y1) = 0
где
x1, y1 - первая точка отрезка
x2, y2 - вторая точка отрезка
x, y - точка, нахождение которой внутри треугольника проверяется
Строишь такое уравнение для каждой стороны треугольника и высчитываешь их значения
result1 - для первой стороны
result2 - для второй стороны
result3 - для третей стороны
Проверка принадлежности будет следующая - если результаты вычисления для всех сторон треугольника имеют один и тот же знак, значит точка лежит внутри треугольника, если хотя бы один из результатов равен нулю, значит точка лежит на прямой, на которой лежит сторона треугольника, следовательно знак не имеет значения. Записать это можно так:
return (result1 <= 0 and result2 <= 0 and result3 <= 0) or (result1 >= 0 and result2 >= 0 and result3 >= 0)
Замечу, что данный метод подходит для треугольника, четырехугольника и любого выпуклого многоугольника, а так же полигональных фигур, собранных из треугольников/четырехугольников.
Ссылки других комментаторов не проверял, скорее всего там представлено именно это решение.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Вот еще.
Отредактирован scopterectus
Отредактирован Atesla
Отредактирован scopterectus
Отредактирован GetLocalPlayer
Уравнение прямой: