2014 dxdy logo

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

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




 
 Длина кубического сплайна (Акимы)
Сообщение05.01.2016, 11:12 
Доброго времени суток. Стала задача рассчитать длину "сегмента"(между узлами) сплайна Акимы, который задаётся выражением:
$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 
1. Для чего вам нужна длина сплайна?
2. Какое получилось выражение?

 
 
 
 Re: Длина кубического сплайна (Акимы)
Сообщение05.01.2016, 12:45 
Пишу свой чарт (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 
Используйте lineTo. Это самое простое и правильное. К более сложным способам вы сможете вернуться, если вас не устроит качество (которое с lineTo будет близко к идеальному).

 
 
 
 Re: Длина кубического сплайна (Акимы)
Сообщение05.01.2016, 14:28 
То-то и оно. Через LineTo() делал, смотрится убого. Возможно я перфекционист.

 
 
 
 Re: Длина кубического сплайна (Акимы)
Сообщение05.01.2016, 14:49 
Уточним наши подходы.
Я имел ввиду вычислить многочлен во всех столбцах пикселей и соединить точки с помощью lineTo. Можно показать, что при некоторых ограничениях на коэффициенты буду закрашены многие пиксели, которые не очень далеко от от графика.
Что вы имели ввиду?

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

 
 
 
 Re: Длина кубического сплайна (Акимы)
Сообщение05.01.2016, 17:35 
Вот алгоритм для точного определения всех пикселей через которые проходит график функции:
Разбейте область определения функции на участки монотонности.
На каждом таком участке вычислите значения функции для абсцисс на границах между пикселами.
В каждом столбце пикселей залейте те что лежат между минимумом и максимумом для значений слева и справа от этого столбца.
Если в столбце есть экстремум, то процесс закраски немного усложняется.

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

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

 
 
 
 Re: Длина кубического сплайна (Акимы)
Сообщение05.01.2016, 19:18 
Аватара пользователя
Abraziv
Интеграл из первого поста можно находить численно. Например, с помощью формулы Симпсона. (В пиксели и антиальясинг не вникал.)

 
 
 
 Re: Длина кубического сплайна (Акимы)
Сообщение06.01.2016, 16:34 
Всем спасибо за ответы и С Рождеством !!!

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

 
 
 
 Re: Длина кубического сплайна (Акимы)
Сообщение07.01.2016, 10:51 
slavav
Спасибо за ответ. Думаю, я уже малясь тронулся. Всё нормально. Надо делать дальше. Сейчас надо думать над масштабированием по y, чтобы не просто на коэффициент умножать, а с возможность увеличивать фрагмент (окно) по y.

 
 
 [ Сообщений: 12 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group