Что самый быстрый путь состоит в том, чтобы найти самым коротким декартовым расстоянием между двумя полигонами

Вот почему исходное выражение не сработало.

Из man bash :

Расширение скобки выполняется перед любыми другими расширениями , и в результате сохраняются любые символы, специальные для других расширений. Это строго текстовое. Bash не применяет синтаксическую интерпретацию контекста расширения или текста между фигурными скобками.

Итак, расширение скобки - это что-то, сделанное раньше, как чисто текстовое макро-операции, до расширения параметра .

Корпуса представляют собой высоко оптимизированные гибриды между макропроцессорами и более формальными языками программирования. Чтобы оптимизировать типичные варианты использования, язык становится более сложным, и некоторые ограничения принимаются.

Рекомендация

Я бы предложил придерживаться Posix1 функции. Это означает использование for i in <list>; do, если список уже известен, в противном случае используйте while или seq, как в:

#!/bin/sh

limit=4

i=1; while [ $i -le $limit ]; do
  echo $i
  i=$(($i + 1))
done
# Or -----------------------
for i in $(seq 1 $limit); do
  echo $i
done

1. Bash - отличная оболочка, и я использую ее в интерактивном режиме , но я не ставил bash-isms в мои скрипты. Скриптам может понадобиться более быстрая оболочка, более безопасная, более встроенная. Им может потребоваться запустить все, что установлено как / bin / sh, и тогда есть все обычные аргументы pro-standards. Помните shellshock, aka bashdoor?

20
задан Vidar 20 May 2009 в 15:51
поделиться

12 ответов

Я сомневаюсь, что существует лучшее решение, чем вычисление расстояния между красным и каждым синим и сортировкой их длиной.

Относительно сортировки, обычно QuickSort трудно победить в производительности (оптимизированный, который отключает рекурсию, если размер понижается 7 объектов и переключается на что-то как InsertionSort, возможно, ShellSort).

Таким образом я предполагаю, что вопрос состоит в том, как быстро вычислить расстояние между двумя полигонами, в конце концов, необходимо сделать это вычисление 50 раз.

следующий подход будет работать на 3D также, но является, вероятно, не самым быстрым:

Минимальное Расстояние Полигона в 2D Пространстве

вопрос, Вы готовы обменять точность на скорость? Например, можно упаковать все полигоны в ограничительные рамки, где стороны полей параллельны осям системы координат. 3D игры используют этот подход довольно часто. Для этого необходимо найти, что максимальные и минимальные значения для каждой координаты (x, y, z) создают виртуальную ограничительную рамку. Вычисление расстояний этих ограничительных рамок является затем довольно тривиальной задачей.

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

Ориентированные Ограничительные рамки - OBB

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

следующее изображение показывает, оси выровняли ограничительную рамку:

Оси Выровненная Ограничительная рамка - AABB

OOBs более точен, AABBs быстрее. Возможно, требуется прочитать эту статью:

Усовершенствованные Методы Обнаружения коллизий

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

14
ответ дан 29 November 2019 в 23:57
поделиться

Наивный подход должен найти расстояние между красным и 50 синими объектами - таким образом, Вы смотрите на 50 3-х Пифагорейских вычислений + сортирующий для нахождения ответа. Это только действительно работало бы на нахождение расстояния между центральными точками все же.

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

гибрид А мог бы работать - мы могли найти расстояние от центральных точек, предположив, что у нас было некоторое понятие относительного размера синих полигонов, мы могли отобрать набор результатов к самому близкому среди тех, затем использовать трассировку лучей для сужения действительно самого близкого полигона (полигонов).

-1
ответ дан 29 November 2019 в 23:57
поделиться

Вы могли запустить путем сравнения расстояния между ограничительными рамками. Тестирование расстояния между прямоугольниками легче, чем тестирование расстояния между полигонами, и можно сразу устранить любые полигоны, которые являются больше, чем nearest_rect + its_diagonal далеко (возможно, можно совершенствовать это еще больше). Затем можно протестировать остающиеся полигоны для нахождения самого близкого полигона.

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

1
ответ дан 29 November 2019 в 23:57
поделиться

Я знаю, что Вы сказали "кратчайшее расстояние", но Вы действительно имели в виду оптимальное решение, или "хорошее/очень хорошее" решение хорошо для Вашей проблемы?

, поскольку, если необходимо найти оптимальное решение, необходимо вычислить расстояние между всем источником и целевыми границами полигона (не только вершины). Если Вы находитесь в 3D пространстве затем, каждый связанный является плоскостью. Это может быть большой проблемой (O (n^2)) в зависимости от того, сколько вершин Вы имеете.

Поэтому, если у Вас есть количество вершины, которое делает это, квадраты к покрытому рубцами числу И "хорошему/очень хорошему" решению хорошо для Вас, пойдите для эвристического решения или приближения.

2
ответ дан 29 November 2019 в 23:57
поделиться

Этот метод экранирования предназначается для сокращения количества вычислений расстояния, которые необходимо выполнить в среднем случае, не ставя под угрозу точность результата. Это работает над выпуклыми и вогнутыми полигонами.

Находят минимальное расстояние между каждой парой вершин таким образом, что каждый - красная вершина, и каждый - синий. Назовите его r. Расстояние между полигонами самое большее r. Создайте новый регион из красного полигона, куда каждый линейный сегмент перемещен исходящий r и соединен со своими соседями дугой радиуса , r центрируется в вершине. Найдите расстояние от каждой вершины в этом регионе к каждому линейному сегменту противоположного цвета, который пересекает этот регион.

, Конечно, Вы могли добавить приближенный метод, такой как ограничительные рамки для быстрого определения, какой из синих полигонов не может возможно пересечься с красным регионом.

3
ответ дан 29 November 2019 в 23:57
поделиться

Поскольку полигон формирует с разумным числом граничных очков такой как в GIS или игровом приложении, это могло бы быть более быстро легче сделать серию тестов.

Для каждой вершины в красном полигоне вычисляют расстояние до каждой вершины в синих полигонах и находят самое близкое (подсказка, сравните distance^2, таким образом, Вам не нужен sqrt ()), Находят самое близкое, затем проверяют вершину на каждой стороне найденной красно-синей вершины для решения, какие линейные сегменты являются самыми близкими и затем находят самым близким подходом между двумя линейными сегментами.

Видят http://local.wasp.uwa.edu.au/~pbourke/geometry/lineline3d/ (легко просто для 2-го случая)

4
ответ дан 29 November 2019 в 23:57
поделиться

Вы смогли уменьшать проблему и затем делать интенсивный поиск на маленьком наборе.

Процесс каждый полигон сначала путем нахождения:

  • Центр полигона
  • Максимальный радиус полигона (т.е. указывают на в напряжении/surface/vertex полигона дальше всего от определенного центра)

Теперь можно собраться, скажем, 5-10 самых близких полигонов к красному (найдите, что центр расстояния центрирует, вычитает радиус, сортирует список и берет лучшие 5), и затем сделайте намного более исчерпывающую стандартную программу.

5
ответ дан 29 November 2019 в 23:57
поделиться

Вы могли бы хотеть посмотреть на Отбор Voronoi. Бумага и видео здесь:

http://www.cs.unc.edu/~geom/DVD/

2
ответ дан 29 November 2019 в 23:57
поделиться

Надо бежать на похороны через секунду, но если вы разбиваете полигоны на выпуклые субполиции, вы можете сделать некоторые оптимизации. Вы можете выполнить двоичный поиск по каждому полигону, чтобы найти ближайшую вершину, а затем я полагаю , что ближайшей точкой должна быть либо эта вершина, либо смежное ребро. Это означает, что вы сможете сделать это в log (log m * n) , где m - среднее количество вершин на поли, а n - количество полигонов. Это своего рода поспешность, поэтому это может быть неправильно. При необходимости сообщу более подробную информацию позже.

2
ответ дан 29 November 2019 в 23:57
поделиться

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

upper bound of min distance = min {distance(red's center, current blue's center) + current blue's radius}

for every blue polygon where distance(red's center, current blue's center) - current blue's radius < upper bound of min distance
    check distance of edges and vertices

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

надеюсь, что это поможет

2
ответ дан 29 November 2019 в 23:57
поделиться

Как уже упоминалось, использование ограничивающих областей (прямоугольников, кружков) может позволить вам отказаться от некоторых взаимодействий полигон-полигон. Для этого есть несколько стратегий, например

  1. Выберите любой синий многоугольник и найдите расстояние от красного. Теперь выберите любой другой многоугольник. Если минимальное расстояние между ограничивающими областями больше, чем уже найденное расстояние, вы можете игнорировать этот многоугольник. Продолжите для всех полигонов.
  2. Найдите минимальное расстояние / центроидное расстояние между красным многоугольником и всеми синими многоугольниками. Отсортируйте расстояния и сначала рассмотрите наименьшее расстояние. Вычислите фактическое минимальное расстояние и продолжайте просмотр отсортированного списка до тех пор, пока максимальное расстояние между полигонами не станет больше, чем минимальное расстояние, найденное на данный момент.

На ваш выбор круги / выровненные по оси прямоугольники,

2
ответ дан 29 November 2019 в 23:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: