Кривые Безье

Исходные данные: набор кривых Безье, набор координат точек Задача: определить степень похожести набора точек на кривую Безье. Для начала рассмотрим очень упрощенно, и лишь для одного куска кривой Безье. Например для заданной тремя контрольными точками A, B, C:

X(a) = Xa*a^2 + Xb*2*a*b + Xc*b^2
Y(a) = Ya*a^2 + Yb*2*a*b + Yc*b^2
Z(a) = Za*a^2 + Zb*2*a*b + Zc*b^2
а = 0..1
b = 1-a

XA, YA, ZA, XB, YB, ZB, XC, YC,ZC - координаты x, y, z исходных узлов A, B, C кривой Безье соответственно

Тогда если подставлять вместо X(a), Y(a), Z(a) координаты точки которую мы проверяем (насколько она принадлежит кривой), то можно находить для каждого уравнения своё а:

ax= (±sqrt((Xc-2*Xb+Xa)*X-Xa*Xc+Xb^2)+Xc-Xb)/(Xc-2*Xb+Xa)
ay= (±sqrt((Yc-2*Yb+Ya)*Y-Ya*Yc+Yb^2)+Yc-Yb)/(Yc-2*Yb+Ya)
az= (±sqrt((Zc-2*Zb+Za)*Z-Za*Zc+Zb^2)+Zc-Zb)/(Zc-2*Zb+Za)

Берём только те а, которые положительны, тогда точность попадания будет в неких относительных единицах будет определяться, допустим так:

Delta=sqrt((k1^2+k2^2+k3^2)/3)
или просто так(для ускорения обсчетов):
delta=(k1+k2+k3)
где:
k1=ax/ay
k2=ax/az
k3=ay/az
Чем ближе полученное значение к «1», тем точнее попадание.

Итого, как определить степень попадания точки в область линии понятно, а дальше идёт рутинная работа, типа опредления весового коэффициэнта точек(1/N).
Стоит отметить что рассмотренный вариант не учитывает возможности сдвигов массива точек в координатной плоскости, целостности рисунка и т.п.

Кроме того данный метод очень неудобен, если надо сравнивать поочередно со многими фигурами сложенными из линий Безье.
Из набора точек можно получить кривую безье, и точки станут её контролльными узлами. Существуют алгоритмы упрощения кривых безье благодаря которым можно уменьшить количество контрольных узлов.

Я оценил работу одного из таких алгоритмов на примере буквы греческого алфавита гамма:
Мне удалось изобразить её кривыми безье с помощью 6-ти узов. Алгоритм упрощал изначальные 40-70 узлов в 10-17(в среднем до 12).

demo

Возникает вопрос: "как же их сравнивать?"
Пара идей конечно же есть, но их стоит обдумать детальнее.
Об этом я еще поразмышляю или поищу решение в интернете...

для лучшего понимания что такое кривые безье: статья c Gamedev, статья Википедии, интересная статья о упрощении кривых Безье с www.rsdn.ru