Сплайн по набору точек15.04.2018, 18:24. Показов 6207. Ответов 14
Метки нет (Все метки)
Здравствуйте
Дан набор точек (пара значение + время), требуется прибить как можно большее их кол-во заменив сплайном на выбор - линейный (т.е. вообще без сплайна) - B-Spline (он же Natural Cubic) - Hermite (он же TCB) - Безье "просто" - Безье с полиномом Бернштейна (Семена Натаныча) Все сплайны должны сохраняют значения в оставшихся точках. Все имеют опцию "hold" (постоянное значение до следующей). Начиная с Hermite также есть опция "linear in/out" - линейный сегмент (весь или начало/конец). Допустимая погрешность задается юзером. Сейчас сделано "по-простому". Все исходные точки заменяются контрольными (сплайновыми) и пытаемся выкинуть точку за точкой если погрешность позволяет. Увы, так точек остается ну уж очень много. Понимаю что шансов мало (нужны академические знания), ну а вдруг...
0
|
|
| 15.04.2018, 18:24 | |
|
Ответы с готовыми решениями:
14
Аналитический вид функции по набору точек из массива Канонический сплайн эрмитов сплайн График функций в виде буквы G. Сплайн Эрмита,Кубический сплайн Эрмита |
|
677 / 479 / 216
Регистрация: 06.09.2013
Сообщений: 1,312
|
||
| 16.04.2018, 12:41 | ||
|
А по теме решал похожую задачу, только у меня была nurbs-кривая. По-моему, я просто фиксировал необходимое мне количество контрольных точек (чем больше - тем лучше) и степень сплайна (и еще вектор узлов - в случае nurbs), назначал имеющимся исходным точкам параметры (например, по нормализованному расстоянию вдоль ломаной), просчитывал точку на кривой при каждом значении параметра - она должна совпадать с соответствующей исходной точкой. Получается система линейных уравнений относительно контрольных точек кривой. Добавлено через 23 минуты Да, вспомнил, в описываемом случае количество контрольных точек должно совпадать с количеством исходных, очевидно, чтобы СЛАУ имела решение. Если требуется намного снизить количество контрольных точек, то требуется применить не интерполяцию, а аппроксимацию, т.е. минимизировать сумму квадратов расстояний точек кривой (с назначенными парметрами) до исходных точек. Там тоже линейная система уравнений получается. Но кривая в этом случае точно через точки проходить не будет.
0
|
||
| 16.04.2018, 13:24 [ТС] | |||
|
Не по теме: Математик из меня никакой, просто по задаче пришлось что-то узнать :) Обычный ход мысли примерно такой (еще называется "умывать руки")
Впрочем тут есть (во всяком случае были) люди заявлявшие "я математик", но что-то не видать. Shamil1, может попробовать перебросить топик в форум "математика"? Может там чего скажут (хотя вряд ли)
0
|
|||
|
677 / 479 / 216
Регистрация: 06.09.2013
Сообщений: 1,312
|
||
| 16.04.2018, 13:52 | ||
|
Вообще какая проблема-то? Провести сплайн (Безье или Б-сплайн) через все точки - получится только, если число контрольных точек равно числу точек для интерполяции. Используйте аппроксимацию: задайте нужное вам количество контрольных точек (например для составной Безье) и вычисляйте их, по условию минимизации суммы квадратов расстояний (там система линейных уравнений относительно координат контрольных точек).
0
|
||
| 17.04.2018, 08:14 [ТС] | ||||
|
Ну и главное - не видно алгоритма. Пришли исходные точки (часто 2-3 тысячи). Мои действия? Ну может это всего лишь прямая и 2 точек сплайна достаточно. Хорошо, попробовал аппроксимировать все одним сегментом - не вышло. Дальше что? Взять исходную точку с макс отклонением и добавить ее в сплайн? Есть мысли ?
0
|
||||
|
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
|
|
| 18.04.2018, 10:29 | |
|
Разбить ломанную на участки двух видов:
-отрезки -кривые 2 степени. 1)отрезки берем 3 точки подряд, отрезок по первой и последней удовлетворяет точность? да, берем еще точку и снова проверяем отрезок нет, вызов “поиск участка кривой” 2) “поиск участка кривой” В цикле находим: Vec1=вектор по N и N+1 точкам Vec2=вектор по N+1 и N+2 точкам DiffAngle=угол между Vec1 и Vec2 SumAngle=SumAngle+DiffAngle N++ Продолжаем цикл пока DiffAngle<Порог1 и SumAngle<Порог2 Порог1=макс угол между двумя соседними отрезками Порог2=макс сумма разностей углов всех отрезков Эти два параметра определяют длину участка который будет считаться кривой. Так выделим мелкий участок который можно аппроксимировать кривой 2 степени. Выход алгоритма: тип участка(отрезок,кривая), индекс первая точка, индекс крайняя. 3)Аппроксимация. Аппроксимировать будем кривой Безье 3 ст. искать средние точки 2 и 3. Способ аппроксимации зависит от наличия касательных от соседних участков. Похоже тут 4 случая: 1)прошлого участка нет, текущий кривая, следущий отрезок. 2)нет, кривая, кривая. 3)отрезок, кривая,отрезок 4)отрезок, кривая,кривая вроде все... Если касательная от соседнего участка есть, то нужно искать точку только на нем т.е. поиск одной неизвестной, иначе не будет гладкости всей кривой. Каждая аппроксимация это нелинейная оптимизация, поиск функции N переменных. 1)прошлого участка нет, текущий кривая, следующий отрезок. Прошлой касательной нет, значит для точки 2 будет поиск двух переменных x2,y2. Следующий участок касательная есть, значит поиск одной неизвестной точки 3 лежащей на касательной. Поиск трех неизвестных. 2)нет, кривая, кривая. Поиск четырех неизвестных. 3)отрезок, кривая,отрезок Самый простой случай, точки 2 и 3 лежат на касательных к соседним участкам. Поиск двух неизвестных. 4)отрезок, кривая,кривая Поиск трех неизвестных.
0
|
|
| 18.04.2018, 11:03 [ТС] | |
|
Excalibur921, излагаете довольно сумбурно
, но все равно спасибо за желание помочь.Копнем немного сплайны (не так уж страшен черт как его малюют). Для каждого сегмента имеем y0 - значение в начальной точке сплайна (левый ромбик на рисунке) y1 - значение в первой контрольной точке (правый синий квадратик левой "ручки") y2 - значение во второй контрольной точке (левый синий квадратик правой "ручки") y3 - значение в конечной точке сплайна (правый ромбик) Требуется рассчитать значение y в точке с заданным временем t которое лежит в интервале 2 точек сплайна. "В принципе" это делается просто y = y0 * k0(t) + y1 * k1(t) + y2 * k2(t) + y3 * k3(t); Где k(t) - коэффициенты сплайна которые вычисляются всяко-разно (по Бернштейну, Эрмиту и др), но в данной задаче эти детали нас совершенно не волнуют - для любого сегмента мы можем взять 2 точки внутри него и получить y1 и у2. Отсюда кстати следует что выделять "прямую" в отдельный случай совсем необязательно - если синие точки лежат на прямой соединяющей 2 точки сплайна - то он сам даст прямую. Проблема как выбирать точки для сплайна из исходных. Очевидно что тупенькое "пополам" или "с наибольшим отклонением" может оказаться весьма неудачным. Но вот ничего лучшего я пока не вижу
0
|
|
|
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
|
||||||||||||
| 18.04.2018, 13:33 | ||||||||||||
|
Разбиваете ломанную на интервалы и определяете их тип. Берете каждый интервал и классифицируете какой из 4 случаев аппроксимации. Делаете нелинейную оптимизацию находите точки 2 и 3. Берем нужный X, опорные точки кривой, находим какую из 4 формул использовать. Формулы есть на вики. Находим t. Подставляем в формулу f(t) для Y получаем в итоге f(x). Рекомендую не употреблять названия типа “правый синий квадратик левой "ручки". От вас убегут не только немного математики но и немного программисты. Тут единственно сложность в поиске вектора когда для точки 2 неизвестных. Можно считать сеткой значений локализовать корень, уменьшить размер сетки и уточнить. Методов оптимизации вагон и тележка. Давайте я переведу как я понял ТЗ. Так? Вот это описано выше+будет непрерывная гладкая кривая. Ну вот: будет всегда поиск двух неизвестных и ненужно классифицировать участки.
0
|
||||||||||||
| 19.04.2018, 11:10 [ТС] | ||||
, пока Вы единственный кто проявляет интерес.
1) Говорят просто "кубический сплайн", и это значит используются (юзер может настраивать) ДВЕ контрольные точки. Это может быть Безье второй степени или что-то еще. Напр при обмене данными c помощью популярного FBX тип сплайна просто "cubic" - никак не уточняется Безье или что еще 2) y = y0 * k0(t) + y1 * k1(t) + y2 * k2(t) + y3 * k3(t); Это просто-напросто "взвешивание", разумеется сумма всех "k" = 1. Таким образом имея 2 точки сплайна и взяв 2 (исходные) точки между ними легко находятся y1 и y2. Ну конечно это еще ничего не значит - найденная кривая может быть далеко от др (исходных) точек сегмента. Также условие "гладкости" может и не выполняться, изломы в точках сплайна допустимы (иногда говорят "Bezier Knee").
0
|
||||
|
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
|
||||
| 19.04.2018, 14:23 | ||||
|
Для начала нужно сделать алгоритмы 1 и 2
Например -сделать генератор ломанной. -исходная ломанная черным, -вершины где новый участок жирными красными точками, -цвет отрезка между ними это тип участка, зеленые отрезок, синие кривая. Без адекватной работы классификатора участков нечего аппроксимировать, либо аппроксимация будет плохая и\или долгая либо вообще невозможна. Может даже парабола по 3 точкам. Формулы есть на вики. В общем такой велик: Есть ломанная. Аппроксимируем Безье 2 ст. опорные точки A,C заданы, ищем B. Проводим прямую AC. Ищем максимум расстояния от каждой точки на ломанной до прямой это будет точка B. Это и будет грубый корень. Именно поэтому удобней брать интерполяционный сплайн через 3 точки а не Безье. Считаем точность аппроксимации, если не подходит делаем целевую функцию: сумма расстояний по Y от N точек на кривой до точек на ломанной. Минимизируем целевую функцию и выполняем нелинейную оптимизацию поиск двух неизвестных (xB,yB) градиентным спуском или другим. Наверно тут очень гладкая поверхность и корень один. Может хватит даже и без матерых методов оптимизации, но корень искать намного дольше. Зато матан проще. Например берем хоть сетку точек (или рандом от генератора в неком радиусе) вокруг грубого корня B. Можно брать габариты сетки больше, точек меньше или размер сетки и количество точек это функция от точности аппроксимации. Считаем в каком узле минимум целевой. Считаем там точность аппроксимации. Уменьшаем размер сетки если надо и снова расчет. Если настроить классификатор на мелкие куски похожие на параболу то зачем брать что то сложней параболы? Если искать Безье 3 степени, то будет поиск 4 неизвестных, но зачем усложнять матан? Проще найти две параболы\ Безье 2 ст где будет 2 неизвестных чем искать 4.
0
|
||||
| 20.04.2018, 10:04 [ТС] | |||
|
0
|
|||
|
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
|
|||
| 20.04.2018, 13:00 | |||
|
Несколько синусоид основная форма кривой + тоже меньшей амплитуды мелкий шум. Или тоже от рандом генератора и\или их смесь. Или подмешивать шум в любой сплайн контрольные точки которого задаем. Нужна рандом ломанная по шероховатости примерно похожая на ваши данные. Вникать и повторять на С++. Вводить данные по примеру и смотреть результат…а как еще? Хотите научный подход? Может искать квадратичная аппроксимация. http://dit.isuct.ru/IVT/sitano... Glava3.htm
0
|
|||
|
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
|
|
| 21.04.2018, 17:28 | |
|
Igor3D, Есть сдвиги? Бросили?
Мой мощный алгоритм классификатора работает? =)).
0
|
|
| 22.04.2018, 07:52 [ТС] | ||
Должно созреть, пока этого нет. А так лезть что-то "кодить" - ну будет вариант может чуть лучший чем нынешний, но который в будущем опять переделывать. А хотелось бы "закрыть вопрос". Ну и нужно капитальное гугление, штука скорее всего известная, накатанные решения должны быть
0
|
||
| 22.04.2018, 22:27 | |
|
0
|
|
| 22.04.2018, 22:27 | |
|
Помогаю со студенческими работами здесь
15
Задать n точек. Найти m=3,4... точек и построить на них m-угольник такой что, количество точек , лежащих внутри и вне m-угольника , минимально различа Отчет по набору прав Как переходить по набору вкладок? Удаление строк по набору условий
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
|
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма).
На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
|
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ *
Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам
Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|