Приближающийся непараметрический кубический Bezier

Оказывается, это как-то связано с установленным путем npm и узла. Я использовал NVM для установки обоих, чтобы они не были в том месте, где ожидал скрипт оболочки. Чтобы решить эту проблему, я сделал следующее:

sudo ln -s /home/ubuntu/.nvm/versions/node/v10.13.0/bin/npm /usr/local/bin/npm
sudo ln -s /home/ubuntu/.nvm/versions/node/v10.13.0/bin/node /usr/local/bin/node
5
задан 2 revs 10 January 2009 в 04:05
поделиться

2 ответа

Просто решите кубическое.

Если Вы говорите о плоских кривых Bezier, где x (t) и y (t) являются кубическими полиномами, то y (x) мог бы быть не определен или иметь несколько значений. Экстремальный вырожденный случай был бы строкой x = 1.0, который может быть выражен как кубический Bezier (контрольная точка 2 совпадает с конечной точкой 1; контрольная точка 3 совпадает с конечной точкой 4). В этом случае, y (x) не имеет никаких решений для x! = 1.0, и бесконечные решения для x == 1.0.

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

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

Наконец, да, могут быть числовые stablility проблемы, как то, когда точка, которую Вы хотите, около касательной, но метод подразделения не заставит их уйти. Это просто сделает их менее очевидными.

Править: при ответе на комментарий, но мне нужны больше чем 300 символов.

Я только имею дело с кривыми Безье, где y (x) имеет только один (реальный) корень. Относительно числовой устойчивости, с помощью формулы из http://en.wikipedia.org/wiki/Cubic_equation#Summary, казалось бы, что могли бы быть проблемы, если Вы являетесь очень маленькими. – jtxx000

wackypedia статья является математикой без кода. Я подозреваю, что можно найти некоторый код поваренной книги, это более готово к использованию где-нибудь. Возможно, Числовой Recipies или ACM собрали текст ссылки алгоритмов.

К Вашему конкретному вопросу и использованию той же нотации как статья, u является только нулем или около нуля, когда p является также нулем или около нуля. Они связаны уравнением:
u^^6 + q u^^3 == p^^3 /27
Около нуля можно использовать приближение:
q u^^3 == p^^3 /27
или p / 3u == кубический корень q
Таким образом, вычисление x от u должно содержать что-то как:

(fabs(u) >= somesmallvalue) ?  (p / u / 3.0) : cuberoot (q)

Как "около" нуля рядом? Зависит от того, в каком количестве точности Вы нуждаетесь. Вы могли провести некоторое качественное время с Maple или Matlab, смотрящим на то, сколько ошибки представлено для какой величины u. Конечно, только Вы знаете, в каком количестве точности Вы нуждаетесь.

Статья дает 3 формулы для Вас для 3 корней кубического. Учитывая три значения u, можно получить 3 соответствующих значения x. 3 значения для Вас и x являются всеми комплексными числами с мнимым компонентом. Если Вы будете уверены, что должно быть только одно действительное решение, то Вы ожидаете, что один из корней будет иметь нулевой мнимый компонент и другие два, чтобы быть сопряженными комплексными числами. Похоже, что необходимо вычислить все три и затем выбрать реальный. (Обратите внимание, что комплекс можно соответствовать реальному x!) Однако там существует другая числовая проблема устойчивости: так как арифметика с плавающей точкой будет, каково это, мнимый компонент действительного решения не будет точно нулем, и мнимые компоненты нереальных корней могут быть произвольно близко к нулю. Таким образом, числовое округление может привести к Вам выбирающий неправильный корень. Было бы полезно, если существует некоторая проверка работоспособности из Вашего приложения, которое Вы могли применить там.

При выборе правильного корня одно или несколько повторений Ньютона-Raphson могут улучшиться, это - точность много.

5
ответ дан 14 December 2019 в 09:03
поделиться

Да, алгоритм de Casteljau работал бы на Вас. Однако я не знаю, будет ли это быстрее, чем решение кубического уравнения методом Cardano.

2
ответ дан 14 December 2019 в 09:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: