Нахождение точки на кривой Безье с учетом расстояния от начальной точки? - PullRequest
8 голосов
/ 18 октября 2011

Я создал 4-точечную кривую Безье и расстояние.Начиная с начальной точки, как мне найти координаты x, y точки, которая находится на таком расстоянии от начальной точки?

Я посмотрел на другие примеры, и, насколько я могу судить, они приближают значения, деля кривую на несколько тысяч точек, а затем находя ближайшую точку.Это не будет работать для меня.Для того, что я делаю, я хотел бы быть точным с точностью до двух десятичных знаков.Ниже приведена простая форма того, что мне нужно для создания моей кривой Безье.(Значения y являются произвольными, значения x всегда на расстоянии 352 пикселей).Если это имеет значение, я работаю в Java.

path.moveTo(0, 400);
path.curveTo(352, 480, 704, 590, 1056, 550);

Итак, если моя начальная точка равна 0,400, как мне найти координаты точки, которая находится на расстоянии 35 от этой начальной точки (вдоль кривой)??(В идеале что-то не слишком интенсивное использование процессора. Это может в конечном итоге запускаться 200 раз в секунду)

Ответы [ 2 ]

6 голосов
/ 30 октября 2011

Для любого, кто случайно найдет мой вопрос, я решил свою проблему. Чтобы найти общее расстояние вашей кривой, разбейте ее на 1000 или около того кусков (все еще довольно точных), найдите расстояние между каждой точкой, затем сложите их все вместе. (вы должны использовать параметрическую формулу)

Теперь найдите процент пути вдоль вашей кривой. = расстояние / всегоДлингаКрива

Используйте этот процент в качестве нового значения t для x и y, и теперь у вас есть новые позиции x и y.

ВАЖНО: Это странный случай, но вы должны использовать абсолютное значение, если ваше значение t когда-либо будет больше 1. Когда вы его кубизируете, это значение будет отрицательным ... = происходят плохие вещи.

Гадкий, но соответствующий код показан ниже.

Разбиение кривой на 1000 частей

    for (double t = 0.00; t < 1.001; t= t + .001) {
         double xValue = Math.pow((1-t), 3) * point1x + 3 * Math.pow((1-t), 2) * t * point2x + 3 * (1-t) * Math.pow(t, 2) * point3x + Math.pow(t, 3) * point4x;
         double yValue = Math.pow((1-t), 3) * point1y + 3 * Math.pow((1-t), 2) * t * point2y + 3 * (1-t) * Math.pow(t, 2) * point3y + Math.pow(t, 3) * point4y;

** Теперь, когда вы вычисляете расстояние между каждой точкой. Я бы посоветовал поместить вышеуказанные значения в массив и выполнить цикл.

Расчет позиций х и у

    xPos = Math.abs(Math.pow((1 - percenttraveled), 3)) * point1x + 3 * Math.pow((1 - percenttraveled), 2) * percenttraveled * point2x + 3 * Math.abs((1 - percenttraveled)) * Math.pow(percenttraveled, 2) * point3x + Math.abs(Math.pow(percenttraveled, 3)) * point4x;
    yPos = Math.abs(Math.pow((1 - percenttraveled), 3)) * point1y + 3 * Math.pow((1 - percenttraveled), 2) * percenttraveled * point2y + 3 * Math.abs((1 - percenttraveled)) * Math.pow(percenttraveled, 2) * point3y + Math.abs(Math.pow(percenttraveled, 3)) * point4y;
1 голос
/ 18 февраля 2014

В библиотеке javagraphics есть класс MeasuredShape (https://javagraphics.java.net/doc/com/bric/geom/MeasuredShape.html), который предоставляет метод getPoint для этого. У нее также есть несколько очень удобных методов для получения подпутей и касательных углов. Насколько я могускажем, они реализуют логику пути «правильно», не прибегая к разбивке путей.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...