Найти контрольную точку между двумя точками, расположенными на квадратичной кривой - PullRequest
0 голосов
/ 27 февраля 2019

Я рисую квадратную кривую между двумя точками, а затем нахожу случайную точку на этой кривой.Я хочу выделить изогнутую часть между случайной точкой и конечной точкой.

Поэтому я подумываю найти другую контрольную точку между случайной точкой и конечной точкой, а затем нарисовать еще одну квадратичную кривую с другим штрихомцвет поверх исходной кривой.

Можно ли найти такую ​​точку или нет?Или есть другой способ выполнить эту задачу?

image

Вот фрагмент кода, над которым я работаю:

var startpoint = {x: 50, y: 50}; // Red
var endpoint = {x: 50, y: 250}; // Green
var controlpoint = {x: 100, y: 150}; // Blue

var t = 0.75;
var randompoint = {
    x: (1 - t) * (1 - t) * startpoint.x + 2 * (1 - t) * t * controlpoint.x + t * t * endpoint.x, 
    y: (1 - t) * (1 - t) * startpoint.y + 2 * (1 - t) * t * controlpoint.y + t * t * endpoint.y
}; // Orange


context.beginPath();
context.moveTo(startpoint.x, startpoint.y);
context.quadraticCurveTo(controlpoint.x, controlpoint.y, endpoint.x, endpoint.y);
context.stroke();

Вот рабочий код, следующий за ответом MBo

function lerp(a, b, t)
{
    var _t = 1 - t;
    return {
        x: a.x * _t + b.x * t,
        y: a.y * _t + b.y * t
    };
}

var newpoint = lerp(controlpoint, endpoint, t);

context.beginPath();
context.moveTo(randompoint.x, randompoint.y);
context.quadraticCurveTo(newpoint.x, newpoint.y, endpoint.x, endpoint.y);
context.stroke();

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Да, вы можете создать новую контрольную точку для этой новой кривой простым подходом:

   P1' = P0 * (1-t) + P1 *  t

, где P0 - начальная точка, P1 - контрольная точка старой кривой, P1 '- контрольная точка для новой кривой

(Это частный случай для общей задачи о подразделении кривой Безье)

0 голосов
/ 27 февраля 2019

Решение - переместить копию кривой между случайной точкой и конечной точкой в ​​направлении, перпендикулярном отверждению.Чтобы найти направление, вы можете найти линию прохода от случайной точки и конечной точки и найти перпендикулярную линию к этой линии.Следовательно, перемещая копию кривой в перпендикулярном направлении в качестве маркера.

...