С шутками-прибаутками, с ненормативной лексикой, методом подбора решил данный вопрос методом подбора, если кто-то знаком с ActionScript 3, вот плиз решение. Код не причёсывал специально, для лучшей читабельности.
Код:
/* Аргументы: 1 - Массив координат точек = [P0.x, P0.y, P2.x, P2.y, P1.x, P1.y, P1.x, P1.y, B.x, B.y],
2 - Количество шагов подбора, выведено в качестве аргумента для того, чтобы в первом приближении
задать большее значение, а в последующих - меньшее. Координаты точки P1 указываются дважды. */
public function approksCurve(arg1:Array, arg2:int):Array {
var rez:Array = new Array();
/* Настроечные параметры */
var kolSh:int = arg2; /* Количество шагов задания значения t */
var prir1x:Number = (arg1[0] - arg1[4]) / kolSh; /* --- Приращение по осям X,Y */
var prir1y:Number = (arg1[1] - arg1[5]) / kolSh;
var prir2x:Number = (arg1[6] - arg1[2]) / kolSh;
var prir2y:Number = (arg1[7] - arg1[3]) / kolSh;
var tek1x:Number;
var tek1y:Number;
var tek2x:Number;
var tek2y:Number;
var provZ:Number;
var minZn:Number = Math.abs((arg1[8]-arg1[0])*(arg1[3]-arg1[1])-(arg1[9]-arg1[1])*(arg1[2]-arg1[0]));
var minIn:int = 0;
for (var i:int = 0; i < kolSh; i++) {
tek1x = arg1[0] - i * prir1x;
tek1y = arg1[1] - i * prir1y;
tek2x = arg1[6] - i * prir2x;
tek2y = arg1[7] - i * prir2y;
provZ = Math.abs((arg1[8] - tek1x) * (tek2y - tek1y) - (arg1[9] - tek1y) * (tek2x - tek1x));
if (minZn > provZ) {
minZn = provZ;
minIn = i;
}
}
/* Возвращает координаты точек Q0 и Q1 */
rez[0] = arg1[0] - (minIn * prir1x); /* Координата Q0.x */
rez[1] = arg1[1] - (minIn * prir1y); /* Координата Q0.y */
rez[2] = arg1[6] - (minIn * prir2x); /* Координата Q1.x */
rez[3] = arg1[7] - (minIn * prir2y); /* Координата Q1.y */
if (minZn > 0 && minZn < 1) return rez;
else {
arg1[0] = arg1[0] - ((minIn - 1) * prir1x);
arg1[1] = arg1[1] - ((minIn - 1) * prir1y);
arg1[2] = arg1[2] - ((minIn - 1) * prir2x);
arg1[3] = arg1[3] - ((minIn - 1) * prir2y);
arg1[4] = arg1[4] - ((minIn + 1) * prir1x);
arg1[5] = arg1[5] - ((minIn + 1) * prir1y);
arg1[6] = arg1[6] - ((minIn + 1) * prir2x);
arg1[7] = arg1[7] - ((minIn + 1) * prir2y);
return approksCurve(arg1, 2000);
}
}