Смещение многоугольников в Javascript
EDIT5: Наконец, появилась библиотека Angus Johnson Clipper, реализованная в Javascript, и выбранная Sourceforge для хоста.
LIVE DEMO: http://jsclipper.sourceforge.net/6.1.1.1/main_demo.html
Источник загрузки:
https://sourceforge.net/projects/jsclipper/
Википедия с пошаговым руководством:
https://sourceforge.net/p/jsclipper/wiki/Home%206/
Презентация демонстрационной программы, включающей десятки образцов полигонов:
https://sourceforge.net/p/jsclipper/wiki/Main_Demo%206/
Я надеюсь, что это поможет любому, кому нужна библиотека обрезки полилинии и полигона со смещением функций.
EDIT4: Одна из возможностей - преобразовать pascal в javascript, используя
http://p2js.gelicon.biz/en/. Пока не удалось. p2js.exe clipper.pas
дает фатальную ошибку "Не удается найти систему единиц, используемую клипером".
EDIT: я нашел script # (Github), который, похоже, способен конвертировать С# в Javascript. Clipper lib доступен в С#, так что можно сделать С# → JS-преобразование с помощью Script # и как?
EDIT3: не преобразован с помощью Script #, но есть также Emscripten, но 4000 строк cpp, преобразованных в 300 000 строк Javascript, поэтому не вариант. Ручное преобразование кажется королем.
EDIT2: Я сделал пример, который показывает проблему. Используйте стрелку влево и вправо, чтобы применить смещение. На определенном расстоянии он работает нормально, но потом что-то идет не так. Желтый поглаженный многоугольник называется так называемым грубым смещенным полигоном, и AFAIK Clipper lib предоставляет способ позаботиться об удалении ненужных частей необработанного смещенного полигона.
Существует библиотека Clipper от Angus Johnson для компенсации полигонов.
Мне нужна эта функция в Javascript для смещения полигонов SVG.
Кто-нибудь сделал порт Javascript?
Если нет, я бы оценил некоторые рекомендации, например. следующее:
- насколько огромной была задача?
- какой из них выбрать для источника (Delphi, С#, С++)?
- все ли в lib необходимо для компенсации?
Библиотека Clipper дает следующие результаты, которые являются только требуемой функциональностью:
![Offset Polygons, polygons, delta, jointype, miterlimit, jtSquare jtRound jtMiter]()
Некоторые ссылки:
- Файлы в Sourceforge
- Документация клипера
- Ответ на один столбец
- Смещение алгоритма
Ответы
Ответ 1
Я преуспел в переносе клипера на JS, и через некоторое время после тщательного тестирования выйдет его релиз. Кажется, что все функции можно было портировать.
Одна оговорка, поддержка 128 бит сокращена до 106 бит.
Одним из плюсов является доступ к большому пространству браузеров и возможность использования svg, vml, html5 canvas в качестве графического интерфейса.
Любые идеи, какой хост будет проще всего опубликовать, с возможностью демонстрации?
EDIT:
Наконец, появилась библиотека Angus Johnson Clipper, реализованная в Javascript и выбранная Sourceforge для хоста.
LIVE DEMO:
http://jsclipper.sourceforge.net/6.1.1.1/main_demo.html
Загрузки:
https://sourceforge.net/projects/jsclipper/
Википедия с пошаговым руководством:
https://sourceforge.net/p/jsclipper/wiki/Home%206/
Презентация демонстрационной программы, включающей десятки образцов полигонов:
https://sourceforge.net/p/jsclipper/wiki/Main_Demo%206/
Я надеюсь, что это поможет любому, кому нужна библиотека обрезки полилинии и полигона со смещением функций.
Ответ 2
Нет простых решений, когда речь идет о раздувании многоугольников. Если у вас есть вогнутый многоугольник, рано или поздно он сломается на несколько меньших полигонов, если вы уменьшите смещение. Поэтому я бы предложил использовать существующий, проверенный алгоритм (Clipper должен быть хорошим).
В вопросе о переносе С# на JS я бы сказал, что это конечно возможно, но вопрос в том, сколько времени потребуется, и будут ли инструменты автоматического портирования использоваться. Судя по этой дискуссии, я сомневаюсь в этом:
Я быстро набросился на использование ScriptSharp для перевода кода С# на Javascript, но существует слишком много несовместимых структур для использования этого и я не смог получить его для вывода файла javascript. Попытка реализовать алгоритм обрезания Vatti в Javascript, кажется, следующий шаг.
...
И да, это не поможет вам использовать всевозможные преобразования автоматики tools.The clipper имеет структуры данных, такие как Int64 или Int128, которые не существует в JS или AS. Я просто удалил их вообще. Int32 должен будет достаточно для большинства случаев, если вы не работаете над тем, что связано с географией или огромные карты.
Порт ActionScript один из упомянутых пользователей уже недоступен, к сожалению.