Примерный список точек с кратким списком кривых Безье

У меня есть список (x, y) баллов. Я знаю, как составить список кривых Безье, которые проходят через все эти точки и имеют непрерывную первую (и вторую, хотя и менее важную) производную. Однако список, который я составил, слишком длинный. Я бы предпочел приблизиться к имеющимся у меня точкам, если это позволит мне сократить количество имеющихся у меня кривых. Я хотел бы иметь возможность передать параметр либо насколько близкое приближение я получаю, либо максимальное количество кривых, предпочтительно первое.

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

РЕДАКТИРОВАТЬ: Еще немного информации о цели этого. Я пытаюсь сделать программу для редактирования изображений. Когда кто-то загружает растровое изображение, я хочу иметь возможность отследить центральную линию. Potrace - это то, что я бы использовал для обводки контура формы, но он не работает для обводки штрихов. Мне удалось определить множество точек вдоль центральной линии, и я хочу превратить эти данные в список связанных кривых Безье. Причина, по которой я не хочу создавать сплайн Безье, заключается в том, что будет слишком много контрольных точек, чтобы их было легко редактировать. «Слишком много» - это непростой термин, но я хотел бы иметь возможность передавать параметр, ограничивающий количество кривых. Либо функция, которая минимизирует расстояние между кривыми от точек на основе максимального количества кривых, либо функция, которая минимизирует количество кривых на основе максимального отклонения от точек.


person Pi Fisher    schedule 18.11.2016    source источник
comment
алгоритм Рамера-Дугласа-Пойкера выглядит так это могло бы быть хорошим решением.   -  person Pi Fisher    schedule 19.11.2016
comment
Должны ли быть отдельные кривые Безье? В противном случае вы просто ищете шлицевую подгонку.   -  person Nico Schertler    schedule 19.11.2016
comment
Это довольно широкий вопрос - есть ли у вас какие-то конкретные детали того, что вы делаете? Что представляет собой список? Зачем конкретно нужны кривые Безье? Что значит слишком долго? Если точки могут быть приблизительными, какой из них важно сохранить? и т. д. и т. д.   -  person Mike 'Pomax' Kamermans    schedule 19.11.2016
comment
@NicoSchertler, проблема с подгонкой сплайна в том, что будет слишком много кривых, потому что у меня будет только на одну кривую меньше, чем количество точек.   -  person Pi Fisher    schedule 21.11.2016
comment
Нет, подгонка сплайна даст вам одну кривую. И вы можете указать количество контрольных точек и степень этой кривой.   -  person Nico Schertler    schedule 21.11.2016
comment
@NicoSchertler Насколько я понимаю, подгонка сплайна - это построение кривой C ^ 2, которая кусочно определяется кубическими кривыми Безье, так что кривая проходит через все точки по порядку. Вы имеете в виду что-то другое?   -  person Pi Fisher    schedule 22.11.2016
comment
Сплайн - это гораздо более общий подход. Вы также можете использовать сплайны, которые аппроксимируют точки (т.е. они не обязательно проходят через все точки). Можно указать как степень (т.е. непрерывность), так и количество сегментов. Я предполагаю, что вы имеете в виду последнее как количество кривых.   -  person Nico Schertler    schedule 22.11.2016
comment
Можете ли вы предоставить ссылку на реализацию или описание одного из них? Я просто нахожу определения, которые требуют минимизировать интеграл.   -  person Pi Fisher    schedule 22.11.2016


Ответы (1)


Существует несколько подходов к достижению того, чего вы хотите:

1) Используйте алгоритм RDP, чтобы уменьшить количество точек, затем создайте список кривых Безье, проходящих через оставшиеся точки.

2) Используйте алгоритмы аппроксимации кривой (например, алгоритм Шнайдера) для создания нескольких кривых Безье, связанных непрерывностью G1 (касательной). Ознакомьтесь с реализацией алгоритма Шнайдера по этой ссылке.

3) Используйте подгонку по методу наименьших квадратов с B-сплайном, чтобы построить одну кривую B-сплайна.

С точки зрения реализации, подход 1, вероятно, самый простой для вас, поскольку вы уже знаете, как создавать кривые Безье, интерполирующие список точек. Подход 3 будет намного сложнее реализовать, и вам, вероятно, придется преобразовать кривую B-сплайна в кривые Безье, чтобы использовать их на уровне пользовательского интерфейса. Пожалуйста, обратитесь к этой статье SO для подробного обсуждения.

person fang    schedule 13.12.2016