Народ, такой вопрос:
Мне нужна треугольная область. Как можно реализовать проверку этой области внутри?
У меня есть способ, но считаю его костыльным:
создать три точки, от двух первых точек на основании создавать по две точки, которые сужаются, находить между ними расстояние и записывать в массив необходимые данные, если они "новые". Две новые точки опираются на предыдущие. И так делать, пока не дойдем до 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)
Замечу, что данный метод подходит для треугольника, четырехугольника и любого выпуклого многоугольника, а так же полигональных фигур, собранных из треугольников/четырехугольников.
Ссылки других комментаторов не проверял, скорее всего там представлено именно это решение.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
21
6 лет назад
0
Можно проверить суммой площадей, если сумма 3-ех треугольников, образованных этой точкой равны площади изначального треугольника, то скорее всего точка принадлежит треугольнику.
Вот еще.
0
26
6 лет назад
0
Это ведь из серии создания конусных способностей. Площадь, ограниченая векторами
0
8
6 лет назад
0
8gabriel8:
Это ведь из серии создания конусных способностей. Площадь, ограниченая векторами
Что-то вроде того
0
21
6 лет назад
Отредактирован scopterectus
0
Если конусная способность на подобии тёмной стаи, то можно использовать эту функцию из сайта:
// Возвращает true : Если угол находится между двумя углами
function IsAngleBetweenAngles takes real angle, real angle1, real angle2 returns boolean
    local real x
    set angle = ModuloReal(angle, 360)
    set angle1 = ModuloReal(angle1, 360)
    set angle2 = ModuloReal(angle2, 360)
    if (angle1 > angle2) then
        set x = angle1
        set angle1 = angle2
        set angle2 = x
    endif
    if (angle2 - angle1) > (angle1 - (angle2-360)) then
        set angle2 = angle2 - 360
        if angle > 180 then
            set angle = angle-360
        endif
        return angle >= angle2 and angle <= angle1
    endif
    return (angle >= angle1) and (angle <= angle2)
endfunction
0
8
6 лет назад
Отредактирован Atesla
0
ScopteRectuS:
Если конусная способность на подобии тёмной стаи, то можно использовать эту функцию из сайта:
Концепт понятен, а вот реализация – не очень. Область выглядит вот так (если не брать два треугольника по бокам). Не знаю, подойдет ли под "Темную стаю".
Загруженные файлы
0
21
6 лет назад
Отредактирован scopterectus
0
Atesla, ну функция IsAngleBetweenAngles сюда, если я правильно, подходит.
IsAngleBetweenAngles( угол BOK, угол BОС, угол BОD ) and ( DistanceBetweenPoints(точка О, точка К) < SPELL_RADIUS )
Загруженные файлы
0
30
6 лет назад
0
3
17
6 лет назад
Отредактирован GetLocalPlayer
3
Каждая сторона треугольника рассматривается как отрезок, лежащий на прямой. Для каждого из этих отрезков строится уравнение прямой.
Уравнение прямой:
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)
Замечу, что данный метод подходит для треугольника, четырехугольника и любого выпуклого многоугольника, а так же полигональных фигур, собранных из треугольников/четырехугольников.
Ссылки других комментаторов не проверял, скорее всего там представлено именно это решение.
Принятый ответ
0
28
6 лет назад
0
От себя добавлю, что это частный случай PIP (point in polygon). Можешь загуглить.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.