<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=200324&amp;view=findpost&amp;p=1686212</guid>
        <pubDate>Wed, 05 Sep 2007 10:37:37 +0000</pubDate>
        <title>Алгоритм пересечения невыпуклых многоугольников</title>
        <link>https://forum.sources.ru/index.php?showtopic=200324&amp;view=findpost&amp;p=1686212</link>
        <description><![CDATA[Slukad: Есть еще один способ перебора точек для нахождения точки C.<br><br>Возьмем две точки 0 и 1 как начальные A,B.<br>Начнем искать точку C влево и вправо от A и B.<br>Условие остановки - слева и справа у нас две соседние точки или точка одна и та же.<br>...<br>Для наглядности возьмем треугольник 23,25,14. Его основа - 24,14/<br>Запускаем рекурсию для грани 23-14. <br>Запускаем алгоритм перебора точек влево и вправо.<br>вправо: от 23 - 22. //за линией<br>влево: от 14 - 15. //записали угол<br>22 и 15 - не смежные и не одна и та же точка.<br>вп: 22 - 21. //пересечение 23-24 и 20-29<br>вл: 15-16. //записали угол<br>21 и 16 - не смежные и не одна и та же точка.<br>вп: 21-20. //пересечение 23-24 и 20-29<br>вл: 16-17. //записали угол (он останется наибольшим)<br>20 и 17 не смежные и не одна и та же точка<br>вп: 20-19. //сравнили угол без записи<br>вл: 17-18. //сравнили угол без записи<br>19 и 18 - смежные. конец перебора.<br><br>Получили точку 17.<br><br><br>Сложностью данного алгоритма является выбор направления влево и вправо.<br>К примеру, если пойти 23-24-0-1... нельзя, потому что 24 - грань базового треугольника, то<br>14-13-12-11-10-9-... пойти можно. Можно перебрать лишние точки и влипнуть в бесконечный цикл перебора (обе проверки идут по кругу).]]></description>
        <author>Slukad</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=200324&amp;view=findpost&amp;p=1686157</guid>
        <pubDate>Wed, 05 Sep 2007 09:55:14 +0000</pubDate>
        <title>Алгоритм пересечения невыпуклых многоугольников</title>
        <link>https://forum.sources.ru/index.php?showtopic=200324&amp;view=findpost&amp;p=1686157</link>
        <description><![CDATA[Slukad: Ну, как показала практика, это не проблема =)<br><br>В общем, <br>Во-первых, алгоритм надо усиливать. Сейчас он медленный слишком. А та версия, что печаталась мной - вообще сакс. <br><br>Дополнения:<br>1) При поиске точки-вершины угла нужно проверять чтобы грани AC и BC (где C - данная точка) не пересекали ни одной грани многоугольника. Или будет Ж. <br>2) Если в начале не удалось найти две точки по условию, то берем любые соседние. Как показывает разбор алгоритма - главное в данной задаче будет поставить точку за пределами многоугольника. Тогда алгоритм сработает. На практике и без этой вещи такие многоугольники как звезда и пр. триангулируются, но не совсем корректно - алгоритм добавляет одну грань между двумя лучами звезды.<br>3) Нужно обязательно отсекать рекурсию. Проверка на вхождение многоугольника не будет панацеей. Рекурсия, как показывает практика, все равно попробует стартануть. Вообще, обычно, хватает одной ветки рекурсии. В идеальном случае выбора начальных точек (в начале, например, вытянутого многоугольника) возможна триангуляция вообще в одну грань (все дочерние рекурсии идут только в одну сторону, вторая грань не прорабатывается).<br><br>Третий пункт важен для многоугольников с большим количеством точек.<br>На практике объект с 900 точек обрабатывается ок. 13 сек.<br>1800 уже занимает более 5 минут.<br>7600 я не дождался =)<br><br>Также неплохо бы улучшить алгоритм поиска точки C. В данный момент основное усилие ложится на перебор точек. Однако, ежу понятно, что далеко не все точки обязательно просматривать. Впринципе, можно сделать списки точек.<br><br>Объясняю идею:<br>1) Заводим два списка - real (все точки полигона),our;<br>2) Из real копируем в our все точки<br>Начинаем рекурсию<br>1) Из our удаляем точки A,B;<br>2) Ищем в our точку C;<br>3) Создаем треугольник;<br>4) Удаляем из our точку C;<br><br>Таким образом для каждого следующего шага рекурсии количество точек на просмотр будет меньше на одну.<br>Какое-никакое, а подспорье.<br><br>Метод этот я еще не тестировал. Возможно, завтра создам алгоритм и выложу код.]]></description>
        <author>Slukad</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=200324&amp;view=findpost&amp;p=1682308</guid>
        <pubDate>Fri, 31 Aug 2007 09:30:55 +0000</pubDate>
        <title>Алгоритм пересечения невыпуклых многоугольников</title>
        <link>https://forum.sources.ru/index.php?showtopic=200324&amp;view=findpost&amp;p=1682308</link>
        <description><![CDATA[prografix: У тебя алгоритм начинается с фразы:<br>1) Находим две такие соседние точки многоугольника, которые составляют линию, по одну сторону которой лежат все точки многоугольника. <br>А если таких точек нет? К примеру, это звезда?]]></description>
        <author>prografix</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=200324&amp;view=findpost&amp;p=1680390</guid>
        <pubDate>Thu, 30 Aug 2007 05:05:54 +0000</pubDate>
        <title>Алгоритм пересечения невыпуклых многоугольников</title>
        <link>https://forum.sources.ru/index.php?showtopic=200324&amp;view=findpost&amp;p=1680390</link>
        <description><![CDATA[Slukad: Нате ссылку на параллельную тему. Там есть некоторое описание и алгоритм триангуляции. Триангуляция, может, кому понадобится.<br>
<a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=200323' target='_blank'>Оптимизация векторной графики для КПК</a>]]></description>
        <author>Slukad</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=200324&amp;view=findpost&amp;p=1676617</guid>
        <pubDate>Mon, 27 Aug 2007 10:52:24 +0000</pubDate>
        <title>Алгоритм пересечения невыпуклых многоугольников</title>
        <link>https://forum.sources.ru/index.php?showtopic=200324&amp;view=findpost&amp;p=1676617</link>
        <description><![CDATA[Slukad: Итак, на данный момент имею из стандартных: <br>
<br>
1) Сазедленд-Ходжман. Нормальных реализаций готовых не нашел. Кроме того он неустойчив и косячит =)<br>
2) Леонов. Суть алгоритма я уловил, но до конца не понял. Минус алгоритма - время вычисления.<br>
3) О&#39;Рурк. Не подходит. Полигон отсекаемый может быть не выпуклым.<br>
4) Холверда. Не врубился - не читал )<br>
5) Триангуляционный. Лучший по скорости и устойчивости. ПО крайней мере, так пишут. Но его реализации в cpp/c/cs/pas я не нашел. Сам триангулировать не пробовал.<br>
<br>
(лучший из найденных источников - http://www.inf.tsu.ru/library/Publications/2004/46.pdf)<br>
<br>
<strong class='tag-b'>prografix</strong>, на самом деле, учитывая, что полигон может представлять собой, скажем, реку, отсечь его не просто =) Кроме того, желательно учитывать ситуации, когда отсекается полигон, который даже не пересекает отсекающий прямоугольник.<br>
<br>
Плюс в том, что отсекающий прямоугольник хотя бы имеет стороны, параллельные осям координат.<br>
<br>
<strong class='tag-b'>ors_archangel</strong>, в общем-то, предложенный тобой способ - это несколько упрощенная версия триангуляционного алгоритма. Отличие в том, что при триангуляции (взаимной) немного быстрее получается результат, хотя алгоритм триангулирования сам по себе дольше алгоритма разбиения на выпуклые многоугольники.<br>
<br>
<strong class='tag-b'>mo3r</strong>, спасибо, сейчас попробую. <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2007-08-27T11:19:44+00:00">27.08.07, 11:19</time></span></span><br>
Нет, ссылка не подошла. Готовая библиотека мало чем поможет =(]]></description>
        <author>Slukad</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=200324&amp;view=findpost&amp;p=1675110</guid>
        <pubDate>Sat, 25 Aug 2007 10:14:00 +0000</pubDate>
        <title>Алгоритм пересечения невыпуклых многоугольников</title>
        <link>https://forum.sources.ru/index.php?showtopic=200324&amp;view=findpost&amp;p=1675110</link>
        <description><![CDATA[mo3r: Можно посмотреть на библиотечку GPC (General polygon clipping) (<a class='tag-url' href='http://www.cs.man.ac.uk/~toby/alan/software/' target='_blank'>http://www.cs.man.ac.uk/~toby/alan/software/</a>).<br>
Там, кстати, приводится ссылочка на Vatti, B.R., &quot;A Generic Solution to Polygon Clipping&quot;, Communications of the ACM, 35(7), July 1992, pp.56-63 и на другие описания методов.]]></description>
        <author>mo3r</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=200324&amp;view=findpost&amp;p=1675104</guid>
        <pubDate>Sat, 25 Aug 2007 09:54:15 +0000</pubDate>
        <title>Алгоритм пересечения невыпуклых многоугольников</title>
        <link>https://forum.sources.ru/index.php?showtopic=200324&amp;view=findpost&amp;p=1675104</link>
        <description><![CDATA[prografix: Задача заметно упрощается, когда хотя бы один из многоугольников выпуклый. Предположим это первый. Тогда для определения пересечения достаточно обрезать второй многоугольник прямыми, которые соответствуют сторонам первого многоугольника. Это сделать несложно.]]></description>
        <author>prografix</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=200324&amp;view=findpost&amp;p=1674652</guid>
        <pubDate>Fri, 24 Aug 2007 14:46:29 +0000</pubDate>
        <title>Алгоритм пересечения невыпуклых многоугольников</title>
        <link>https://forum.sources.ru/index.php?showtopic=200324&amp;view=findpost&amp;p=1674652</link>
        <description><![CDATA[ors_archangel: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=200324&view=findpost&p=1673744'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Slukad &#064; <time class="tag-quote__quoted-time" datetime="2007-08-24T04:29:36+00:00">24.08.07, 04:29</time></span><div class='quote '>Алгоритм пересечения невыпуклых многоугольников</div></div> Разбить невыпуклые многоугольники на выпуклые, применить алгоритм пересечения выпуклых многоунольниов попарно между получившимися многоугольниками для первой и второй фигур, полученные (выпуклые) многоигольники объединить?]]></description>
        <author>ors_archangel</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=200324&amp;view=findpost&amp;p=1673744</guid>
        <pubDate>Fri, 24 Aug 2007 04:29:36 +0000</pubDate>
        <title>Алгоритм пересечения невыпуклых многоугольников</title>
        <link>https://forum.sources.ru/index.php?showtopic=200324&amp;view=findpost&amp;p=1673744</link>
        <description><![CDATA[Slukad: Подробнее на этом же форуме вопрос: <a class='tag-url' href='http://forum.sources.ru/index.php?act=ST&f=44&t=200323' target='_blank'>Оптимизация векторной графики для КПК</a>]]></description>
        <author>Slukad</author>
        <category>Алгоритмы</category>
      </item>
	
      </channel>
      </rss>
	