Самый быстрый способ найти любую точку в треугольнике 2D - PullRequest
0 голосов
/ 03 апреля 2012

Мне нужен самый быстрый способ найти любую точку внутри треугольника (не ребра) в 2D.Любая помощь?

Ответы [ 4 ]

5 голосов
/ 03 апреля 2012

«Среднее» из трех вершин (центроид) является точкой внутри треугольника, и, вероятно, вычисляется так же быстро, как и любая другая.

Он лежит только на ребре в вырожденном случае, когда вершины коллинеарны. В этом случае каждая точка в треугольнике лежит на ребре, поэтому решения не существует.

2 голосов
/ 03 апреля 2012

Если ваш треугольник выражен в виде точек, вам нужно будет учитывать каждую координату, поэтому ответ Стива Джессопа почти оптимален.

Обратите внимание, что все, что вам на самом деле нужно сделать, это начать с одной точки и столкнуть ее с двумя другими в ограниченном количестве. Вот что делает усреднение, но очень специфическим способом.

Добавление происходит быстро. Деление может быть медленным в зависимости от платформы и компилятора.

Например, на современных ядрах ARM я бы выбрал эту версию в любой день вместо усреднения:

xm = (x0 + (x1 + x2) / 2) / 2
ym = (y0 + (y1 + y2) / 2) / 2

Если переменные являются целочисленными, компилятор должен оптимизировать деления для сдвигов битов, которые при правильном планировании в ARM в основном бесплатны. Если переменные являются числами с плавающей запятой или удваиваются, компилятор должен оптимизировать их для простого уменьшения экспоненты. Известно, что деление с плавающей запятой относительно медленное.

В конечном итоге, проверьте и посмотрите. Если вы не выполняете оптимизацию кода низкого уровня, вы, скорее всего, не увидите разницы. С другой стороны, если вы используете это в узком внутреннем цикле, вы можете.

Чтобы дать некоторую интуицию относительно того, почему это работает: сначала мы находим среднюю точку отрезка, образованного (x1, y1) и (x2, y2). Затем мы находим среднюю точку между отрезком линии, образованным , точкой и (x0, y0). Если вы рисуете диаграмму треугольника и делаете это, сразу становится ясно, что это работает.

1 голос
/ 03 апреля 2012

Вершины A, B, C

векторов

AB = B-A

AC = C-A

P = A + t * AB + u * AC

t, u - любые числа (случайные?) В диапазоне [0..1], а t + u <= 1 </p>

0 голосов
/ 03 апреля 2012

или: вы можете сначала рассчитать поверхность треугольника. Затем вы делаете второй расчет, где ваша точка делит треугольник на три других треугольника. Если поверхность этих трех подтреугольников больше, чем ваша точка находится за пределами области треугольника. Видишь, что я имею в виду?

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