LINUX.ORG.RU

Нечёткие (fuzzy) операции над полигонами. Посоветуйте либу.


0

1

Нужно проводить сложение полигонов. Сейчас для этого использую QPainterPath с его unite, но по-хорошему оно не для того предназначено. Да и не прокатило оно мне. А не прокатило вот почему...

Представьте ситуацию. Есть два полигона. Они соприкасаются, то есть сторона одного из них лежит на стороне другого. Мне надо, чтобы при сложении получился один полигон. Посмотрите на картинку: http://img141.imageshack.us/img141/2749/fuzzyunion.png. Видите там точки p1 и p2? Ведь в компьютерном представлении они могут лежать немного вне полигона, т.е. при сложении может получиться 2 различных полигона. А надо-то один.

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

Библиотек для булёвых операций с полигонами много: GPC, clipper, boost::polygon и т.п. Но пробовать все воистину лень. Кто-нибудь может подсказать ту, где такое точно сработает? Или назвать те, где такое не работает.

★★★★★

Последнее исправление: Obey-Kun (всего исправлений: 2)

Вот список найденных мной библиотек, в которых есть булёвые операции с с полигонами:

Вот найденные тесты и сравнения:

Прочая информация:

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от Obey-Kun

И, в завершение, интересное сообщение о GGL vs Clipper

Right now we have already yet another implementation of polygon clipping accepted to boost as part of the new Boost.Geometry (formerly GGL) library that is not numerically robust, and not algorithmically optimal. However, it has much better chances than an optimal Vatti sweepline implementation of successfully producing an output because sweepline is a somewhat tempermental algorithm and numerical errors are often fatal conditions, whereas the Boost.Geometry algorithm tolerates them better. My expectation is that for large cases your implementation should be faster than the Boost.Geometry algorithm, but more likely to fail due to numerical errors. Your algorithm could find a home in boost itself as a «strategy» for polygon clipping that can be passed into the Boost.Geometry generic interface. If that interests you I suggest you join the Boost.Geometry project and mailing list and pursue contributing your code. I expect that your participation would be welcomed by the other member of the project, certainly I welcome it. It is possible to make a floating point implementation of Vatti, such as yours, numerically robust and that is something we could pursue as a community in the Boost.Geometry project.

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от Obey-Kun

+ http://lists.boost.org/boost-users/2010/08/61287.php

Clipper быстрее GPC. GPL быстрее Boost.Geomtry.

Правда, мне скорость не важна. Но, между прочим, проекту Clipper и года нету, он появился где-то в прошлом марте-апреле.

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от Nebuchadnezzar

Спасибо за перевод термина. А я мучился. Хотя не догадался в engcom посмотреть, ведь там:

неточный; нечёткий; в po-файлах переводов системы gettext применяется для обозначения переводов возможно не соответствующих оригинальному предложению;

Obey-Kun ★★★★★
() автор топика

При чем здесь нечеткие операции вообще? Если я сравниваю числа с плавающей точкой через fabs(a-b) < EPS, я что, уже работаю в рамках нечеткой логики?

anonymous
()
Ответ на: комментарий от anonymous

> Если я сравниваю числа с плавающей точкой через fabs(a-b) < EPS, я что, уже работаю в рамках нечеткой логики?

Нечёткая логика здесь не при чём. fabs(a-b) < EPS принято называть fuzzy compare, вот я и применил данный термин.

Obey-Kun ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.