Интерполяция кардинальной кривой в C # - PullRequest
0 голосов
/ 08 декабря 2018

Мне нужно вручную интерполировать кардинальную кривую / сплайн - тип кривой, созданный методом DrawCurve в System.Drawing.Я нашел замечательный пример C алгоритма Декастела, чтобы сделать это с помощью Безье.К сожалению, все примеры, которые я нахожу для этого типа кривой, являются чисто математическими обозначениями, которые также могут быть клинописными для меня.

Может ли кто-нибудь указать мне на пример интерполяции (и при этом пересечение всех точекby) этот вид кривой, демонстрируемый на языке программирования, который я умею читать?

Редактировать:

Меня попросили привести пример чисто математического подхода к этому, которыйчуждо мне.Это самый многословный вопрос, который я мог найти, и который, как мне кажется, дал бы вам больше всего возможностей: https://www.sciencedirect.com/science/article/pii/0021904569900409

1 Ответ

0 голосов
/ 08 декабря 2018

Кардинальный сплайн Microsoft является кубическим Эрмитовый сплайн .

Эрмитовый сплайн описывается конечными точками и касательными векторами в этих точках P0, P1, m0, m1.

Для интерполяциимножества точек кардинальные сплайны дают непрерывность первого порядка (значения и касательные синхронизируются для соседних частей сплайнов).Чтобы достичь этого, нужно установить касательные в k -й точке

 m(k) = (1-c) * (P(k+1) - P(k-1)) / (t(k+1)-t(k-1))

, где с - напряжение, P(k) - k -ная точка набора данных, а t(k) - это некотораяпараметр для нормализации.Иногда используются индексы (например, в более общих сплайнах Кочанека-Бартельса в качестве разности индексов используется знаменатель 2), иногда кумулятивное расстояние между точками - я подозреваю, что MS может использовать этот метод и т. Д.* в каждой точке набора данных (исключая начальные и конечные - здесь просто примените касательную, основанную на одном соседе) и постройте сплайны в форме (базисе) Эрмита.

Но для кривых Безье существует довольно простой метод де Кастельжау -поэтому мы можем выразить те же кривые в форме Безье (сменить базис на полиномы Бернштейна)Процитированная вики-страница показывает простой способ: начальная и конечная точки остаются прежними, а контрольные точки Безье равны

p0 (Bezier) = p0 (Hermite)
p3 (Bezier) = p1 (Hermite)
p1(Bezier) = p0(Hermite) + m0/3
p2(Bezier) = p1(Hermite) - m1/3
...