2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Длина кубического сплайна (Акимы)
Сообщение05.01.2016, 11:12 


02/11/12
86
Доброго времени суток. Стала задача рассчитать длину "сегмента"(между узлами) сплайна Акимы, который задаётся выражением:
$y = a + bx + cx^2 + dx^3$, $x\in[0,1]$

Из курса матана известна формула расчёта длины кривой через определённый интеграл:
$$\int\limits_{a}^{b}\sqrt{1 + (y'(x))^2}dx$$

В принципе всё хорошо, но мне необходимо уменьшить количество вычислений. Даже если вычислить интеграл и получить аналитическое выражение, оно всё равно получается слишком большим и страшным. Есть ли другой способ вычислений длины сегмента кубического сплайна, ведь формула через интеграл позволяет рассчитать длину любой кривой, можно ли подобрать частный случай и этим уменьшить вычислительную сложность ?

 Профиль  
                  
 
 Re: Длина кубического сплайна (Акимы)
Сообщение05.01.2016, 12:25 
Заслуженный участник


26/05/14
981
1. Для чего вам нужна длина сплайна?
2. Какое получилось выражение?

 Профиль  
                  
 
 Re: Длина кубического сплайна (Акимы)
Сообщение05.01.2016, 12:45 


02/11/12
86
Пишу свой чарт (plot). Использую интерполяцию. Между полученными значениями необходимо закрасить все пиксели,т.е. пусть у нас имеется прямоугольная область $4\cdot100$ (высота$\cdot$ширина), получил для координаты $x = 1$ значение $y = 2$, для следующей координаты 2 получил значение 50, в итоге получается разрыв между пикселями. Или же ещё пример, рассмотрим случай когда данных меньше чем ширина холста (пикселей по x), для $x = 1$ получил значение 10, а для $x = 10$ получил значение 234. Как закрасить все пиксели между узлами без разрывов, т.е. чтобы пиксели шли непрерывной цепочкой. Вот для этого длину и хочу узнать, так же можно составить систему уравнений, где одно уравнение будет сплайн, а второе уравнение прямой $y = F$, где F - значение соседнего пикселя по высоте. Но опять же решать уравнение 3 степени это очень большие затраты. Третий вариант самый простой - эмпирический, известно, что сплайн Акимы имеет небольшие выбросы в точках "разрыва", поэтому можно рассчитать расстояние (прямую) между расчётными узлами и умножить на эмпирический коэффициент, ну скажем $1.3$ ( т.е. увеличим на 30 процентов), можно конечно рассчитать коэффициент кривизны и исходя из него корректировать эмпирический коэф. Склоняюсь к 3 варианту.
Можно конечно использовать, что то типа LineTo(), но получается не красиво, хочу реализовать свой антиалиасинг.

Расчётное выражение получил в матлабе и пытался упростить его с помощью соответствующих функций, но ничего путного не получилось.

 Профиль  
                  
 
 Re: Длина кубического сплайна (Акимы)
Сообщение05.01.2016, 13:49 
Заслуженный участник


26/05/14
981
Используйте lineTo. Это самое простое и правильное. К более сложным способам вы сможете вернуться, если вас не устроит качество (которое с lineTo будет близко к идеальному).

 Профиль  
                  
 
 Re: Длина кубического сплайна (Акимы)
Сообщение05.01.2016, 14:28 


02/11/12
86
То-то и оно. Через LineTo() делал, смотрится убого. Возможно я перфекционист.

 Профиль  
                  
 
 Re: Длина кубического сплайна (Акимы)
Сообщение05.01.2016, 14:49 
Заслуженный участник


26/05/14
981
Уточним наши подходы.
Я имел ввиду вычислить многочлен во всех столбцах пикселей и соединить точки с помощью lineTo. Можно показать, что при некоторых ограничениях на коэффициенты буду закрашены многие пиксели, которые не очень далеко от от графика.
Что вы имели ввиду?

 Профиль  
                  
 
 Re: Длина кубического сплайна (Акимы)
Сообщение05.01.2016, 15:16 


02/11/12
86
Да. Я вычисляю значение многочлена в значениях M/N * k, где M - количество данных, N - ширина холста, k - меняется от 0 до N - 1. Всё равно мне кажется, что смотрится не очень. Ступеньки на переходах между LineTo(). Антиалиасинг фреймворка включал, даже использовал антиалиасинг OpenGL, но всё равно при сильном масштабирование, смотрится не найс.

 Профиль  
                  
 
 Re: Длина кубического сплайна (Акимы)
Сообщение05.01.2016, 17:35 
Заслуженный участник


26/05/14
981
Вот алгоритм для точного определения всех пикселей через которые проходит график функции:
Разбейте область определения функции на участки монотонности.
На каждом таком участке вычислите значения функции для абсцисс на границах между пикселами.
В каждом столбце пикселей залейте те что лежат между минимумом и максимумом для значений слева и справа от этого столбца.
Если в столбце есть экстремум, то процесс закраски немного усложняется.

Меня удивляет, что вы недовольны lineTo. Имеет смысл сделать сравнение ваших картинок с картинками из других пакетов и искать ошибки.

Ещё посмотрите в сторону subpixel antialising.

 Профиль  
                  
 
 Re: Длина кубического сплайна (Акимы)
Сообщение05.01.2016, 19:18 
Заслуженный участник
Аватара пользователя


30/01/09
7068
Abraziv
Интеграл из первого поста можно находить численно. Например, с помощью формулы Симпсона. (В пиксели и антиальясинг не вникал.)

 Профиль  
                  
 
 Re: Длина кубического сплайна (Акимы)
Сообщение06.01.2016, 16:34 


02/11/12
86
Всем спасибо за ответы и С Рождеством !!!

 Профиль  
                  
 
 Re: Длина кубического сплайна (Акимы)
Сообщение07.01.2016, 10:34 
Заслуженный участник


26/05/14
981
Увеличьте фрагмент, который вам не нравится и покажите только его.

 Профиль  
                  
 
 Re: Длина кубического сплайна (Акимы)
Сообщение07.01.2016, 10:51 


02/11/12
86
slavav
Спасибо за ответ. Думаю, я уже малясь тронулся. Всё нормально. Надо делать дальше. Сейчас надо думать над масштабированием по y, чтобы не просто на коэффициент умножать, а с возможность увеличивать фрагмент (окно) по y.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group