Вот еще одна попытка решить проблему, которая, на мой взгляд, гораздо лучше.
Учитывая два сечения C_1
, C_2
Поместите каждый C_i
в глобальную систему отсчета с системой координат (x,y)
, чтобы их расположение имело смысл. Разделите каждый C_i
на верхнюю и нижнюю кривые U_i
и L_i
. Идея состоит в том, что вы захотите непрерывно деформировать кривую от U_1
до U_2
и L_1
до L_2
. (Обратите внимание, что вы можете расширить этот метод, чтобы разделить каждый C_i
на m
кривые, если хотите.)
Способ сделать это заключается в следующем. Для каждой T_i = U_i, or L_i
выборки n
точек и определения интерполирующего полинома P{T_i}(x)
. Как один из них должным образом отмечен ниже, интерполяционные полиномы подвержены колебаниям, особенно в конечных точках. Вместо интерполяционного полинома можно использовать полином наименьших квадратов, который был бы намного более устойчивым. Затем определите деформацию многочлена от P{U_1}(x) = a_0 + a_1 * x + ... + a_n * x^n
до P{U_2}(x) = b_0 + b_1 * x + ... + b_n * x^n
как Q{P{U_1},P{U_2}}(x, t) = ( t * a_0 + (1 - t ) b_0 ) + ... + (t * a_n + (1-t) * b_n ) * x^n
, где деформация Q
определена как 0<=t<=1
, где t
определяет, в какой точке деформация находится (т.е. в t=0
мы находимся в U_2
и t=1
мы находимся в U_1
, а в любой другой t
мы находимся в некоторой непрерывной деформации двух.)
То же самое следует для Q{P{L_1},P{L_2}}(x, t)
. Эти две деформации создают непрерывное представление между двумя поперечными сечениями, которые вы можете выбрать в любом t
.
Обратите внимание, что все, что на самом деле делает, - это линейная интерполяция коэффициентов интерполяционных полиномов двух частей обоих сечений. Также обратите внимание, что при разделении поперечных сечений вы, вероятно, должны поставить ограничение на то, что они должны быть разделены в конечных точках, которые совпадают, иначе у вас могут быть «дыры» в вашей деформации.
Надеюсь, это понятно.
edit: решена проблема колебаний при интерполяции полиномов.