наконец-то разгадан формат ключа
Code
key[weight1,angle1,weight2,angle2,time,value]
имеются формулы:
Code
angle = atan(y/x)
weight = x/(3*cos(angle))
Code
x = 3 * weight * cos(angle)
y = 3 * weight * sin(angle)
Code
v = (t^3 * a) + (t^2 + b) + (t * c) + d
// рабочий код рисования сегмента между ключами [i] и [i+1] получились у меня (где data имеет key формат):
Code
P1.x := P[i].x + round((P[i+1].x-P[i].x)*cos(data[i][3])*data[i][2]/3);
P1.y := P[i].y + round((P[i+1].y-P[i].y)*sin(data[i][3])*data[i][2]/3);
P2.x := P[i+1].x - round((P[i+1].x-P[i].x)*cos(data[i+1][1])*data[i+1][0]/3);
P2.y := P[i+1].y - round((P[i+1].y-P[i].y)*sin(data[i+1][1])*data[i+1][0]/3);
Canvas.PolyBezier([P[i],P1,P2,P[i+1]]);
Теперь попытаюсь сложить все в единую формулу...
Code
a = k1.time + (k2.time - k1.time) * cos(k1.angle2) * k1.weight2 / 3
b = k1.value + (k2.value - k1.value) * sin(k1.angle2) * k1.weight2 / 3
c = k2.time - (k2.time - k1.time) * cos(k2.angle1) * k2.weight1 / 3
d = k2.value - (k2.value - k1.value) * sin(k2.angle1) * k2.weight1 / 3
и подставлю значения t
Code
t = (time-k1.time)/(k2.time - k1.time)