|
0 / 0 / 0
Регистрация: 17.09.2023
Сообщений: 7
|
|
Преобразование кубического сплайна в кривую Безье01.01.2026, 18:04. Показов 796. Ответов 5
Метки нет (Все метки)
Столкнулся тут с тем что для SVG нет возможности отобразить сплайн, есть только кривая Безье.
Есть у меня кубический B-сплайн задан узловыми точками и массивом knots. Необходимо сплайн преобразовать в кубическую кривую Безье. Т.е. вместо узловых точек и массива knots получить на каждый узел 3 комплекта точек с координатами (сам узел и 2 контрольные точки). Есть у кого возможность помочь с алгоритмом? Можно за вознаграждение.
0
|
|
| 01.01.2026, 18:04 | |
|
Ответы с готовыми решениями:
5
Каким образом определять касательные кубического сплайна? Обеспечить совпадение на четырех точках кубического сплайна и полинома Ньютона
|
|
2903 / 1937 / 210
Регистрация: 05.06.2011
Сообщений: 5,716
|
|
| 02.01.2026, 05:47 | |
|
Не проще ли побить исходные отрезки на тучу маленьких, да представить кубический B-сплайн ломаной? Исходная задача-то, если и решаема, то явно нетривиальная.
Добавлено через 3 минуты Впрочем, посмотрите вот тут. Не уверен, но что-то похожее рассматривается.
0
|
|
|
6229 / 2930 / 1047
Регистрация: 01.06.2021
Сообщений: 10,884
|
|||||||
| 02.01.2026, 14:46 | |||||||
|
Laotin, в SVG кривая Безье выглядит так
M x0 y0 C x1 y1 x2 y2 x y M означает move to, то есть устанавливаем координату начала - x0 y0. C означает кубическую кривую Безье, иногда используется квадратичная Q Далее, x1 y1 x2 y2 это координаты контрольных точек для каждой из двух точек x y это координата конечного узла B-Spline же состоит из сегментов. Сплайны удобны во всяких интерполяциях, поэтому, полагаю, что вы получили сплайн в ходе каких-то математических вычислений и теперь хотите вывести результат в SVG. Но судя по условию, вы и сами все это знаете. Так вот, любой B-Spline точно можно преобразовать в кривую Безье, но если быть точнее, то не в одну, а несколько кривых Безье. По крайней мере, в общем случае B-сплайн с несколькими сегментами нельзя точно представить одной кривой Безье той же степени (требуется аппроксимация или повышение степени). Но аппроксимация означает потерю точности, а повышение степени кривой Безье для нас не вариант, поскольку SVG поддерживает только кубические и квадратичные кривые Безье. Так что, лучше просто B-Spline преобразовать в несколько кубических кривых Безье, тем более в SVG есть команда S, которая удобно "склеивает" кривые. Про эти алгоритмы написано много в интернете, например, https://web.mit.edu/hyperbook/... ode18.html Или см. документ во вложении. Однако, я бы вместо того, чтобы читать всё это и пытаться написать код, искал бы уже готовые функции в библиотеках с открытым кодом. Просто у меня в прошлом уже был негативный опыт с чтением подобных документов, когда ты пытаешься реализовать в коде то, что написано, но не получается из-за того, что оказывается где-то в формулах была опечатка. Лучше брать уже рабочий код откуда-то. Кстати, есть такие B-Spline, сегменты которых уже эквиваленты кривым Безье и делать даже ничего не нужно... Я бы на вашем месте, если нет цели досконально изучить эти алгоритмы (например, если вам лишь разок конвертировать и все), пользовался бы готовыми библиотеками. Например, я вот нашел библиотеку на языке С, называется tinyspline. Если копаться в сорцах, то можно увидеть там функцию
Похожие функции для конвертирования есть и в других библиотеках, например, Open CASCADE, но думаю копаться в сорцах большой библиотеки будет сложнее.
1
|
|||||||
|
0 / 0 / 0
Регистрация: 17.09.2023
Сообщений: 7
|
|||
| 02.01.2026, 18:00 [ТС] | |||
|
То что вы добавили во вложении я тоже уже нашел и пытаюсь разобраться. Мне бы не просто сырой код, который работает. А с пояснениями что именно происходит. Т.к. нужно сделать собственную реализацию алгоритма, в котором понимаешь весь процесс расчета. Добавлено через 1 минуту У меня в целом ключевая проблема - как вообще контрольная точка сплайна и knots связаны с узлом и контрольными точками кривой Безье. Что то я недопонимаю, на сколько я понял в knots ключевой смысл не в его значении, а в отношении значений между соседними knots. Где то я даже прочитал что если все knots одновременно увеличить на одно и тоже значение то сам сплайн не изменится. И вот тут я не понимаю как эти knots используются для расчета контрольных точек. Если я правильно понял в сплайне между двумя узлами с помощью knots можно вычислить кривую безье. Но дальше мне не хватает понимания процесса.
0
|
|||
|
6229 / 2930 / 1047
Регистрация: 01.06.2021
Сообщений: 10,884
|
|||||||||||||||||||||||
| 02.01.2026, 23:17 | |||||||||||||||||||||||
Laotin, я вот проверил библиотеку tinyspline, все работает правильно. Так что, неплохо бы заглянуть в реализацию данной библиотеки, если собираетесь написать нечто похожее. Снова повторюсь, что библиотека довольно маленькая и исходники очень легко воспринимаются. Одно дело изучить теорию с помощью книжек, но написание кода это совсем другое. И тут уже готовая библиотека со всеми функциями. Вы можете просто посмотреть на реализацию этих функций. Вы даже можете брать оттуда куски кода и написать свою библиотеку для преобразования b-spline в beziers. Типа урезать ненужные функции из той библиотеки и сделать свою лёгкую библиотеку. Вот подробности тестирования этой библиотеки: Для входного BSpline я взял: 6 точек: { 0, 0, 1, 2, 3, 3, 4, 0, 5, -1, 6, 2 } и вот такие knots { 0, 0, 0, 0, 1, 2, 3, 3, 3, 3 } Написал код на С++ для получения точек кривой Безье, используя данную библиотеку: Кликните здесь для просмотра всего текста
Вывод данной программы: Кликните здесь для просмотра всего текста
Теперь визуализируем в Wolfram Mathematica, чтобы убедиться, что программа нам дала правильный результат. Этот код рисует наш оригинальный BSpline, используя функцию BSplineCurve
Кривые идентичны, что подтверждает правильную работу библиотеки tinyspline.
2
|
|||||||||||||||||||||||
|
0 / 0 / 0
Регистрация: 17.09.2023
Сообщений: 7
|
|
| 07.02.2026, 15:32 [ТС] | |
|
Большое спасибо за наводку.
Реальной пользы от tinyspline не оказалось, но т.к. у меня задача не любую NURB кривую преобразовать. А конкретно B-сплайн то все оказалось до безобразия просто и одновременно сложно. Оказалось что ключевая задача - вставка узлов в сплайн, принцип расчета количества необходимых узлов для вставки и место их вставки. Как только это стало понятным ИИ легко подсказал код для алгоритма, кривой и нерабочий, но суть уже просматривалась, еще немного теории + отладчик и 2 простеньких процедуры выдают такой же результат как и у вас на примере.
0
|
|
| 07.02.2026, 15:32 | |
|
Помогаю со студенческими работами здесь
6
В чем преимущество сплайна дефекта 1 над сплайном дефекта 2 ?
Разработать алгоритм нахождения функции y=f(x), которая выражается либо таблицей, либо формулой сплайна Сплайны Безье и В-сплайны Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Программный отбор элементов справочника Номенклатура по группе 1С
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа.
В качестве фильтра для отбора справочника служит группа номенклатуры.
Отбор под наименованию группы (на. . .
|
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
|
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс.
Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
|
Программный отбор элементов справочника Сотрудники по перечислениям 1С
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа.
В качестве фильтра для отбора служит предопределенное значение перечислений.
Процедура. . .
|
|
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|