Страница 1 из 2

Логические операции с полигонами

СообщениеДобавлено: 30 май 2015, 17:13
Papazol
Итак, возвращаясь к напечатанному.

Есть две пока не решённых проблемы по сабжу. Это отрисовка результатов операций и дырки. С дырками вроде понятно, нет их пока. Поэтому всё про дырки игнорируем.
К сожалению, сообщение с картинками, которое я создал в той теме, сюда не скопировать, а создавать его заново весьма лень. Придётся ссылаться на него. Там было так:

1. Операция И. Закрашено правильно.
2. Операция ИЛИ. Закрашено тоже правильно.
3. Операция НЕ. Здесь закрашено неправильно. Выглядеть должно как на рисунке "Операция Group".
4. Операция ИСКЛЮЧАЮЩЕЕ ИЛИ. Закрашено неправильно. Должно быть как на рисунке "Операция Group".
5. Операция Group. Закрашено неправильно. Должно быть как на рисунке "Операция ИЛИ".

Теперь попробуем случай, когда полигоны частично пересекаются.
.png
Операция И
.png
Операция ИЛИ
.png
Операция НЕ
.png
Операция ИСКЛЮЧАЮЩЕЕ ИЛИ
Group.png
Операция Group

Видно, что опять же И и ИЛИ выполняются и заливаются правильно. Операция НЕ в этом случае тоже залита правильно. Остальные операции, увы, неправильно. Причём, они залиты "наоборот".

Если полигоны вообще не пересекаются, все логические операции выполняются и заливаются правильно.

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

Re: Логические операции с полигонами

СообщениеДобавлено: 30 май 2015, 17:46
zed
Papazol писал(а):Констатируем, что пока можно смело

Советую обновить ночнушку до актуального состояния, а потом уже что-то констатировать ;)

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

Так что, констатируем, что можно смело пользоваться операциями, не дающими дырок в результате. Потому что поддержки дырок всё ещё нет. Но заметьте, что у вас ИЛИ дало 3 дырки.

Re: Логические операции с полигонами

СообщениеДобавлено: 02 июн 2015, 00:06
Papazol
zed писал(а):Советую обновить ночнушку до актуального состояния, а потом уже что-то констатировать ;)

Да.
zed писал(а):Но заметьте, что у вас ИЛИ дало 3 дырки.

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

Re: Логические операции с полигонами

СообщениеДобавлено: 02 июн 2015, 00:22
zed
Papazol писал(а): многое зависит от того, как определяется, что появилась дырка.

Вздор. У дырки вполне чёткое определение и разночтений тут быть не может.

Вот вам пример из двух полигонов. Операция ИЛИ даёт 1 полигон и одну дырку.

Image 1.jpg

Re: Логические операции с полигонами

СообщениеДобавлено: 03 июн 2015, 01:24
Papazol
zed писал(а):Вздор. У дырки вполне чёткое определение и разночтений тут быть не может.

Почему вздор? Я же не говорю о том, что программа неправильно обнаруживает дырки, а только о том, что я не знаю, как она это делает.
Впрочем, раз определение дырки чёткое, дырка обязана обнаруживаться визуально. Мне стало интересно, увеличил картинку и стал рассматривать места пересечения полигонов. Да, из-за весьма причудливой формы границы Рязанской области прямоугольник пересекает эту границу трижды в обоих случаях, вот откуда две дырки. Но есть ещё одна. И она образуется не при слиянии полигонов. Я пробовал слить границу области с простым четырёхугольником, явно пересекающем её в двух точках, там не может образоваться дырка. Но одна всё равно получалась. Поскольку полигон нельзя слить с самим собой, пришлось тупо обходить границу в поисках. И я её нашёл. Так что всё правильно с дырками.
А вот при группировке тех же полигонов дырка почему-то не образуется.

Ради эксперимента я немного подвинул одну точку полигона, разомкнув дырку. После этого операция ИЛИ больше дырок не даёт. Значит, это была она, без вариантов.

Re: Логические операции с полигонами

СообщениеДобавлено: 03 июн 2015, 08:53
zed
Papazol писал(а):А вот при группировке тех же полигонов дырка почему-то не образуется.

Потому что Group не изменяет геометрию существующих полигонов. А вот логические операции проводят ряд манипуляций. Я уже говорил про округление координат вершин прямоугольников, есть там ещё и "упрощение" полигонов (как до, так и после слияния, т.е. результат всегда упрощённый): http://www.angusj.com/delphi/clipper/do ... lygons.htm

Re: Логические операции с полигонами

СообщениеДобавлено: 03 июн 2015, 11:02
Papazol
Не совсем сходится теория с практикой.
1. Есть два пересекающихся полигона. Один из них уже имеет свою собственную дырку.
2. При операции ИЛИ над этими полигонами образуются три дырки (так говорит программа).
3. Две из трёх дырок образовались на местах пересечения полигонов. Третья как была, так и осталась. То есть при операции ИЛИ, несмотря на всяческие округления, имевшаяся дырка никуда не делась.
4. При операции Group программа дырок вообще не обнаруживает. Хотя визуально они есть. Да и так хотя бы одна-то точно есть.
5. Редактируем полигон, у которого изначально есть дырка, так, чтобы дырки не было. Тем самым пытаемся удостовериться, что это именно та дырка, которую обнаруживает и подсчитывает программа.
6. При операции ИЛИ теперь получаются только две дырки. Всё правильно: была дырка - программа её обнаруживала, нет дырки - не обнаруживает.
7. При операции Group программа дырок снова не обнаруживает.

Итак, некоторые выводы:
Если дырки изначально присутствуют в полигонах, операция ИЛИ их не затирает, несмотря на разные округления и т. д.
При операции ИЛИ программа все дырки обнаруживает и подсчитывает. Но не рисует. Естественно, ведь дырки пока не поддерживаются.
При операции Group дырки хорошо отрисовываются, и это логично: просто цветом заливаются отдельные полигоны. Однако дырки совсем не считаются. И это логично: ведь новых полигонов здесь не образуется, а уж как старые между собой расположены - это дело десятое. Уточнить бы данное положение.

Re: Логические операции с полигонами

СообщениеДобавлено: 03 июн 2015, 13:59
zed
Papazol писал(а):Не совсем сходится теория с практикой.

Сходится. У вас с теорией слабо, вот вам и кажется неизвестно что :)
Papazol писал(а):1. Есть два пересекающихся полигона. Один из них уже имеет свою собственную дырку.

Нету у него дырки. Это вам визуально кажется, что там дырка, но это не так. Хотя бы тот факт, что программа пока ещё не поддерживает дырки, должен был прямо-таки вам кричать, что это не дырка. Это может стать дыркой, но в текущий момент это всего лишь полигон с самопересечением (самокасанием) и вы можете легко это пересечение убрать, чутка сдвинув одну из вершин.

Дырка это:
1. замкнутый контур
2. находится внутри
3. замкнутого контура
Если хотя бы один пункт не верен, то это не дырка, чем бы визуально оно не казалось.

Отсюда и все ошибки в рассуждениях:
- "имевшаяся дырка никуда не делась" - В результате операции упрощения полигона при ИЛИ, была образована дырка, а при Group никаких упрощений полигона не производилось и дырка не образовалась (в полигоне так и осталось самопересечение). А когда вы растянули самопересечение, то и упрощать в полигоне при ИЛИ оказалось нечего и дырка не образовалась.
- "Хотя визуально они есть. Да и так хотя бы одна-то точно есть." - Визуальная "дырка" ещё не значит, что это действительно дырка (см. определение дырки).
- "При операции Group дырки хорошо отрисовываются" - В программе ещё нету отрисовки дырок, поэтому они вообще никак не отрисовываются и то, что вы видите - не дырки.

Плюс, у меня сложилось впечатление, что вы до сих пор не поняли, что делает операция Group. Такое впечатление от комментариев: "Одна дырка при Group" и "Вторая дырка при Group" - на скриншотах вы видите 2 независимых полигона, которые лежат один над другим. Поскольку полигоны независимые, они ну никак не могут образовать дырок - у них нету точек пересечения. Эти 2 полигона входят в конструкцию, названную мультиполигон - условное объединение двух и более полигонов, каждый из которых по-прежнему имеет свою независимую геометрию, но у них общее имя и описание.

Re: Логические операции с полигонами

СообщениеДобавлено: 04 июн 2015, 11:13
Papazol
zed писал(а):Сходится. У вас с теорией слабо, вот вам и кажется неизвестно что :)

С этим не поспоришь, откуда появятся знания теории, если для меня программа - чёрный ящик? Потому и спрашиваю, сомневаюсь и т. д.
zed писал(а):Нету у него дырки. Это вам визуально кажется, что там дырка, но это не так. Хотя бы тот факт, что программа пока ещё не поддерживает дырки, должен был прямо-таки вам кричать, что это не дырка. Это может стать дыркой, но в текущий момент это всего лишь полигон с самопересечением (самокасанием) и вы можете легко это пересечение убрать, чутка сдвинув одну из вершин.

Дырка просто так, на пустом месте, появиться не может, как бы программа ни упрощала и ни округляла. Значит, были такие условия, при которых эта чёртова дырка могла образоваться. И эти условия - как раз наличие в полигоне самопересечения. Поскольку до каких-либо логических операций наличие самопересечения никак себя не проявляет, а проявлять начинает только после операции ИЛИ, причём в виде внезапно появившейся дырки, которая пропадает, если самопересечение убрать, то выводы? "Дырка", пускай неправильно названная, а на самом деле являющаяся самопересечением, в полигоне была! Или, если придерживаться терминологии, были условия для возникновения дырки при выполнении логических операций. Но ведь были же! Если не придираться к словам?
zed писал(а):- "При операции Group дырки хорошо отрисовываются" - В программе ещё нету отрисовки дырок, поэтому они вообще никак не отрисовываются и то, что вы видите - не дырки.

То, что я назвал дырками в данном случае, в этом случае дырками не является, но в соседнем случае (ИЛИ) именно эти места и есть дырки, это должно быть понятно.
zed писал(а):Плюс, у меня сложилось впечатление, что вы до сих пор не поняли, что делает операция Group. Такое впечатление от комментариев: "Одна дырка при Group" и "Вторая дырка при Group" - на скриншотах вы видите 2 независимых полигона, которые лежат один над другим. Поскольку полигоны независимые, они ну никак не могут образовать дырок - у них нету точек пересечения. Эти 2 полигона входят в конструкцию, названную мультиполигон - условное объединение двух и более полигонов, каждый из которых по-прежнему имеет свою независимую геометрию, но у них общее имя и описание.

По поводу "Одна дырка от Group" см. выше. Всё я понял. Но чёткого положения о том, что при операции Group дырок вообще не может образоваться, раньше нигде не было. И я до этого дошёл сам, о чём и написал в предыдущем сообщении. Если это было написано верно, нужно было просто подтвердить, если неверно - опровергнуть. А так получается, что я дебил. А все остальные давно всё поняли, вопросов ни у кого нет никаких. Однако, несмотря на это, я всё равно буду задавать вопросы, если мне что-то непонятно. Вот такой вот я.

Re: Логические операции с полигонами

СообщениеДобавлено: 04 июн 2015, 11:35
zed
Papazol писал(а):Но ведь были же! Если не придираться к словам?

Да никто к словам не придирается, я просто вношу ясность. Предпосылки были, да, но дырки небыло. Откуда ж мне знать, что для вас это само собой разумеется?
Papazol писал(а):именно эти места и есть дырки, это должно быть понятно.

C какой стати, это должно быть понятно мне, что для вас это понятно, когда вы всюду говорите Group и дырки? Да, при логической операции ИЛИ там будут дырки. Но вы зачем-то начали обсуждать Group и скриншоты с ним приводить. Эти же дырки в логичеких операциях вы ещё постом выше уже были нашли и скриншоты приложили. И вдруг опять про них разговор, но уже для Group.
Papazol писал(а):Но чёткого положения о том, что при операции Group дырок вообще не может образоваться, раньше нигде не было.

А как ещё можно понять слова, что "геометрия полигонов никак не изменяется"?
Papazol писал(а):Если это было написано верно, нужно было просто подтвердить, если неверно - опровергнуть. А так получается, что я дебил.

Я опроверг почти всё из того, что у вас было написано. Не знаю, что вы на самом деле имели в виду, но у вас "теория с практикой не сходилась" и "при операции Group дырки хорошо отрисовывались".
Papazol писал(а):Однако, несмотря на это, я всё равно буду задавать вопросы, если мне что-то непонятно. Вот такой вот я.

Я не против, готов отвечать в любое время :)