На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> Минимальное расстояние между многоугольниками
    Дан невыпуклый многоугольник и множество невыпуклых многоугольников внутри него.
    Надо найти минимальное расстояние между внешним и внутренними многоугольниками за время O(n*log(n)), где n - общее количество вершин.
    В книге "Вычислительная геометрия" есть описание алгоритма для похожей задачи.
    Там дано N точек и нужно найти среди них пару с минимальным расстоянием. Там же говорится, что этот алгоритм можно обобщить на случай, когда даны 2 множества точек, и нужно найти расстояние между ними.
    Я планирую обобщить этот алгоритм для многоугольников, но, во-первых, не знаю ещё получится ли, и, во-вторых, возможно, для многоугольников есть свой алгоритм.
      Цитата prografix @
      где n - общее количество вершин

      Вершинами не обойдёшься. Если имеется два отрезка на плоскости, то у отрезка минимальной длины, один конец которого принадлежит первому отрезку, а другой второму, только один из концов гарантированно совпадает с концом одного из исходных отрезков, а вовсе даже не оба...
        Я писал про зависимость скорости от вершин. А так да, минимальное расстояние может быть или между двумя вершинами, или между вершиной и отрезком.
          Цитата prografix @
          А так да, минимальное расстояние может быть или между двумя вершинами, или между вершиной и отрезком.

          А при чём тут "или"? первое - частный случай второго.
          Я собственно к тому, что для набора точек алгоритм быстрее O(N2) только за счёт того, что |AB|=|BA|.
            Цитата prografix @
            минимальное расстояние может быть или между двумя вершинами, или между вершиной и отрезком.

            Это если исключить пересечения.
            Цитата Akina @
            что для набора точек алгоритм быстрее O(N2) только за счёт того, что |AB|=|BA|.

            А если задействовать, к примеру, QuadTree?
              Цитата Mikle @
              А если задействовать, к примеру, QuadTree?

              А какая разница? всё равно меньше O(NlogN) никак - N точек * logN поиск для каждой из них.
                Цитата Akina @
                всё равно меньше O(NlogN) никак

                Так это же как раз и требуется в первопосте.
                  Mikle
                  QuadTree не очень-то применим для расчёта расстояния между точкой и отрезком... потому как размер блока дискретизации должен быть не меньше размера отрезка, что в общем случае даёт QT из одного-единственного узла.
                    Цитата Akina @
                    QuadTree не очень-то применим для расчёта расстояния между точкой и отрезком

                    А ранее было, что я и цитировал в своём ответе:
                    Цитата Akina @
                    для набора точек алгоритм быстрее O(N2) только за счёт того, что |AB|=|BA|

                    Для отрезков - да, начинаются проблемы при относительно больших длинах отрезков. Но, даже когда отрезок сравним по длине с размером всего рассчитываемого пространства, он занимает в нём только ряд ячеек сетки вдоль самого отрезка.
                      Ещё вариант.
                      Строим триангуляцию с ограничениями O(N*log(N)), число получающихся треугольников O(N).
                      Далее пробегаемся по треугольникам, искомое расстояние это либо высота, либо ребро одного из треугольников.
                      Треугольники, находящиеся снаружи внешнего, или внутри вложенных многоугольников, можно сразу пропускать.

                      Можно без ограничений, но тогда придётся отдельно обрабатывать треугольники, пересекаемые сторонами многоугольников.
                      Можно добавлять точки на рёбрах, нарушающих условие Делоне.
                        Триангуляция произвольного набора точек неоднозначна.
                          Триангуляция Делоне однозначна, за исключением симметричных случаев.
                            Какая нахрен "триангуляция"? :blink: Не, ну возможно я как-то не в теме ... Но есть математический аппарат вычисления дистанции между точкой и прямой. Что мы имеем?

                            1) Любая прямая - задается координатами начала и конца прямой
                            2) Любые "началы" и "концы" могут выступать в роли точек
                            3) По условию - все линии прямые

                            Что, тупо перебор абсолютных смещений и взаиморасположений не решает? :blink:
                              Перебор - это O(n*n), а хочется быстрее.
                                Цитата Akina @
                                Триангуляция произвольного набора точек неоднозначна.
                                Ну и что? На результат эта неоднозначность не влияет.
                                Цитата prografix @
                                Триангуляция Делоне однозначна, за исключением симметричных случаев.
                                Здесь лучше получить триангуляию с ограничениями. Та же триангуляция Делоне, но не учитывается нарушение условия Делоне для пар треугольников, разделённых сторонами многоугольников.
                                Цитата JoeUser @
                                Но есть математический аппарат вычисления дистанции между точкой и прямой.
                                Ну высоту трегольника как раз так и удобнее вычислять. Триангуляция позволяет сократить число перебираемых пар точка-отрезок.
                                  Цитата amk @
                                  Ну и что? На результат эта неоднозначность не влияет.

                                  Ты почему-то, вероятно, рассчитываешь на то, что расчёт расстояний в итоговых треугольниках содержит в том числе и минимальное? Это не так.
                                  См. рис.
                                  Прикреплённая картинка
                                  Прикреплённая картинка
                                    Цитата Akina @
                                    Ты почему-то, вероятно, рассчитываешь на то, что расчёт расстояний в итоговых треугольниках содержит в том числе и минимальное?
                                    Я вовсе не рассчитываю на это. Я это точно знаю.

                                    И не вижу в этом рисунке ничего, что противоречило бы моим словам.

                                    Точнее там вообще ничего почти не нарисовано - только круг и набор каких-то линий. Какое отношение они имеют к упоминаемой мною триангуляции? Там же ни одного треугольника даже нет.
                                    Сообщение отредактировано: amk -
                                      Цитата amk @
                                      там вообще ничего почти не нарисовано - только круг и набор каких-то линий.

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

                                      Добавлено
                                      И да, в классическом варианте определения триангуляция Делоне не всегда однозначна. Простейший пример - квадрат.
                                        Есть триангуляция точек, а есть триангуляция многоугольников. Здесь речь идёт о многоугольниках и для них есть своя триангуляция Делоне ( оптимизация на максимум минимального угла ).
                                          Цитата Akina @
                                          Ну что сам треугольник по трём чёрным вершинам пунктирчиком не нарисовал - ну ленив я, уж извиняюсь...
                                          Ленив, в данном случае, слишком мягко сказано. Там что вся триангуляция из одного единственного треугольника состоит? Кроме того, ты невнимателен. Речь идёт о триангуляции с ограничениями. А в ней указанного тобой треугольника (стороны которого пересекают один из заданных многоугольников) даже не существует - такие треугольники запрещены.
                                          Цитата Akina @
                                          И да, в классическом варианте определения триангуляция Делоне не всегда однозначна. Простейший пример - квадрат.
                                          В данном случае это несущественно. Подходящий треугольник всё равно найдётся.
                                          И иллюстрация по поводу триангуляции
                                          Прикреплённая картинка
                                          Прикреплённая картинка

                                          Зелёным нарисованы рёбра триангуляции. Зелёные точки - добавленные узлы, чтобы триангуляция оставалась триангуляцией Делоне. Малиновый кандидаты на то, чтобы быть минимальными расстояниями
                                            Поразглядывал картинку и решил её немного дорисовать
                                            Прикреплённая картинка
                                            Прикреплённая картинка

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


                                            Рейтинг@Mail.ru
                                            [ Script execution time: 1,0705 ]   [ 22 queries used ]   [ Generated: 29.03.24, 00:45 GMT ]