bicyclist
Новичок
Стоят 2 задачи:
1. есть несколько точек на графике. Надо достроить кривую, которая бы пересекала все эти точки.
2. есть произвольная точка, нужно вычислить расстояние от неё до ближайшей точки кривой из пункта 1. То есть найти наименьшее расстояние от точки до кривой.
нашёл только функцию кривой безье отсюда http://blog.kislenko.net/show.php?id=2523, но она только для 4 точек, для произвольного количества точек не нашёл. И, если кривая круто изгибается, то она по этой функции может не проходить через все точки, а только тянуться к ним. Меня такое не устраивает.
Я так думаю, мне нужна функция. чтобы из 4-5 опорных точек кривой получить 20 точек на этой же кривой, и перебором сравнивать расстояние от каждой из них до точки из задачи 2. Как в php найти больше точек кривой, если некоторые известны?
1. есть несколько точек на графике. Надо достроить кривую, которая бы пересекала все эти точки.
2. есть произвольная точка, нужно вычислить расстояние от неё до ближайшей точки кривой из пункта 1. То есть найти наименьшее расстояние от точки до кривой.
нашёл только функцию кривой безье отсюда http://blog.kislenko.net/show.php?id=2523, но она только для 4 точек, для произвольного количества точек не нашёл. И, если кривая круто изгибается, то она по этой функции может не проходить через все точки, а только тянуться к ним. Меня такое не устраивает.
Код:
function cubicbezier($img, $col, $curves, $n = 20) {
for ($curve = 0; $curve < count($curves); $curve++) {
list($x0, $y0, $x1, $y1, $x2, $y2, $x3, $y3) = $curves[$curve];
$pts = [];
for($i = 0; $i <= $n; $i++) {
$t = $i / $n;
$t1 = 1 - $t;
$a = pow($t1, 3);
$b = 3 * $t * pow($t1, 2);
$c = 3 * pow($t, 2) * $t1;
$d = pow($t, 3);
$x = round($a * $x0 + $b * $x1 + $c * $x2 + $d * $x3);
$y = round($a * $y0 + $b * $y1 + $c * $y2 + $d * $y3);
$pts[$i] = array($x, $y);
}
for ($i = 0; $i < $n; $i++) {
imageline($img, $pts[$i][0], $pts[$i][1], $pts[$i+1][0], $pts[$i+1][1], $col);
}
}
}