Найти все четырехугольники между пересекающимися линиями?

1

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

Я нашел это теоретическое объяснение, но не код для него.

Пока я в самом начале. У меня есть мои строки (две x, y точек для каждой строки) и найдено все их пересечения (x, y point). Если вас интересует сценарий, см. Здесь.

Мой сценарий основан на php до сих пор, но я благодарен за любые рекомендации, также на другом языке.


пример

Вот набор строк.

line 715.341 0 757.297 600, 
line 0 249.169 800 179.178, 
line 0 256.196 800 186.205, 
line 0 284.225 800 200.142, 
line 396.716 0 481.041 600, 
line 0 311.374 800 227.29, 
line 0 355.76 800 229.053, 
line 0 521.525 800 437.442, 
line 696.134 0 611.809 600

В моем примере точки пересечения были бы следующими. Каждая точка имеет координаты числа, x и y, а также идентификаторы двух строк.

 Point 1. 728.309, 185.45, 0, 1
 Point 2. 728.797, 192.434, 0, 2
 Point 3. 729.852, 207.515, 0, 3
 Point 4. 731.736, 234.465, 0, 5
 Point 5. 732.11, 239.806, 0, 6
 Point 6. 746.324, 443.084, 0, 7
 Point 7. 426.491, 211.856, 1, 4
 Point 8. 669.346, 190.609, 1, 8
 Point 9. 427.466, 218.798, 2, 4
 Point 10. 668.346, 197.723, 2, 8
 Point 11. 430.305, 238.998, 3, 4
 Point 12. 666.027, 214.223, 3, 8
 Point 13. 434.065, 265.752, 4, 5
 Point 14. 436.988, 286.548, 4, 6
 Point 15. 463.17, 472.844, 4, 7
 Point 16. 662.154, 241.778, 5, 8
 Point 17. 660.845, 251.093, 6, 8
 Point 18. 632.176, 455.081, 7, 8
convert -size 800x600 xc:skyblue \
    -fill red -stroke red -strokewidth 2 \
    -draw "line 715.341 0 757.297 600, line 0 249.169 800 179.178, line 0 256.196 800 186.205, line 0 284.225 800 200.142, line 396.716 0 481.041 600, line 0 311.374 800 227.29, line 0 355.76 800 229.053, line 0 521.525 800 437.442, line 696.134 0 611.809 600" \
    -font Courier -pointsize 14 -draw "fill none stroke blue circle 728.309,185.45 726.309,183.45 circle 728.797,192.434 726.797,190.434 circle 729.852,207.515 727.852,205.515 circle 731.736,234.465 729.736,232.465 circle 732.11,239.806 730.11,237.806 circle 746.324,443.084 744.324,441.084 circle 426.491,211.856 424.491,209.856 circle 669.346,190.609 667.346,188.609 circle 427.466,218.798 425.466,216.798 circle 668.346,197.723 666.346,195.723 circle 430.305,238.998 428.305,236.998 circle 666.027,214.223 664.027,212.223 circle 434.065,265.752 432.065,263.752 circle 436.988,286.548 434.988,284.548 circle 463.17,472.844 461.17,470.844 circle 662.154,241.778 660.154,239.778 circle 660.845,251.093 658.845,249.093 circle 632.176,455.081 630.176,453.081" \
    -draw "fill blue stroke blue text 738.309,190.45 '1' text 738.797,197.434 '2' text 739.852,212.515 '3' text 741.736,239.465 '4' text 742.11,244.806 '5' text 756.324,448.084 '6' text 436.491,216.856 '7' text 679.346,195.609 '8' text 437.466,223.798 '9' text 678.346,202.723 '10' text 440.305,243.998 '11' text 676.027,219.223 '12' text 444.065,270.752 '13' text 446.988,291.548 '14' text 473.17,477.844 '15' text 672.154,246.778 '16' text 670.845,256.093 '17' text 642.176,460.081 '18'" \
    lines-intersection.jpg

Изображение 174551

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

Один из четырехсторонних, которых я ищу, - это точки 13, 4, 6 и 15:

Изображение 174551

  • 0
    Вы должны объяснить, что означает «все прямоугольники». Означает ли это, что вы хотите сделать прямоугольник из каждой пары точек, которые не находятся на горизонтальной или вертикальной линии?
  • 0
    Ваши теги сбивают с толку. Пожалуйста, укажите, на каком языке вы кодируете, и оставьте те, на которых вы не пишете.
Показать ещё 8 комментариев
Теги:
imagemagick
linear-algebra
rectangles

2 ответа

1
Лучший ответ

Хорошо, я нашел одно решение. К сожалению, я не мог это решить, используя диаграмму Вороного, рекомендованную angus_thermophyale.

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

Изображение 174551

В основном я сделал это следующим образом:

  1. создайте список со всей возможной комбинацией из 4 точек пересечения в цепочке.
  2. то я использовал каждую комбинацию, где две точки находятся на одной линии. Чтобы отфильтровать это, я использовал идентификаторы строк, сохраненные для каждой точки.
  3. создавать векторы между точками и вычислять углы. Каждый угол должен быть больше 0 ° и меньше 180 °
  4. суммируйте 4 угла и проверьте, равно ли оно 360 °

результат

Изображение 174551


Дайте мне знать, если кто-то заинтересован в деталях кода...

2

Я бы рекомендовал разбить проблему следующим образом:

  1. Найти базовые четырехугольники в задаче
  2. Найдите общие края среди этих базовых четырехугольников
  3. Произведите список или матрицу допустимых комбинаций, чтобы показать все возможные четырехугольники

Найдите базовые четырехугольники: я бы порекомендовал начать с использования процесса Вороного/Делоне, чтобы найти диаграмму Вороного.

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

Закрытые области (прямоугольники, треугольники и т.д.), Которые вы желаете, идентифицируются подмножеством точек Вороного, и вы можете выполнять другие тесты, чтобы найти это подмножество программно. В вашем примере вы можете или не захотите отбрасывать полученные треугольники; если вы это сделаете, то вы, вероятно, можете просто подсчитать окружающие края/грани, как только вы определили замкнутые области.

Я не эксперт по PHP, но мой Google-fu показывает реализацию PHP в GitHub. Моя собственная исследовательская работа связана с графическими структурами и робототехникой, и такое использование часто возникает.

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

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

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

Найдите общие ребра среди этих базовых четырехглавых элементов. Для "уложенных" quadrilaterals, как показано в вашем обновленном вопросе, вы можете найти общие края среди базовых четырехугольников, а затем составить список комбинаций. Например, если квадрант A имеет общую сторону с квадроциклом B, то вы производите четырехугольник Quad AB.

Создайте список или матрицу допустимых комбинаций. После этого вам, вероятно, придется повторять, пока все возможные комбинации не будут исчерпаны. Одна вещь, которую вам придется испытать, состоит в том, что дополнительная фигура по-прежнему является четырехугольной - если вы добавите строку вверх и строку влево или вправо, вы получите форму "L" -type, которая больше не действительна.

Не симпатичный или элегантный, но, вероятно, эффективный.

  • 0
    Thx @angus_thermopylae Я постараюсь ознакомиться с ним и посмотреть, ответит ли он на мой вопрос ...
  • 0
    Хорошо, я начал немного понимать диаграмму Вороного, но я не уверен, смогу ли я использовать ее для того, что хочу, так как я ищу не только замкнутые области, но и четырехугольники, которые имеют другую точку внутри. Единственным условием должно быть то, что каждая сторона многоугольника равна соответственно одной линии. Я создал диаграмму Вороного для своего примера ( i.imgur.com/4H1sPZN.png ), но я не уверен, как продолжить сейчас ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню