Рассчитать периметр кривой Безье в Java - PullRequest
0 голосов
/ 12 февраля 2012

Не похоже, что в Java есть какой-либо метод для расчета периметра квадратичной кривой Безье ... или, по крайней мере, я ее не распознаю.

У меня есть поиск в stackoverflow, и все, что я нашел, это методы на других языках программирования. Я был бы очень признателен, если бы кто-нибудь мог помочь мне найти какую-либо библиотеку (или просто какое-нибудь математическое объяснение, чтобы я мог перенести ее на Java), которая могла бы решить эту проблему.

Извините, если это очевидный вопрос, но я просто программист-любитель, и я немного знаю геометрию.

И извините (снова) за мой дерьмовый английский

Спасибо за ваше время! :)

П.Д .: Периметр = новый тег? WAT

EDIT: Оооо, лучше погуглил (благодаря отсутствию тега "периметр" в stackoverflow ... и это ... это ... ирония) и нашел это: http://segfaultlabs.com/docs/quadratic-bezier-curve-length

Это тяжелый и точный способ расчета длины. Веб-страница даже включает пример реализации в C

Ответы [ 2 ]

0 голосов
/ 12 февраля 2012

Вот точный перевод кода C по ссылке, которую вы предоставили на Java.Обратите внимание, что это полностью не проверено.Я бы порекомендовал провести дальнейший рефакторинг для улучшения имен классов и параметров.

public class Bezier {

  public static class v {

    public double x;
    public double y;

    public v(double x, double y) {
      this.x = x;
      this.y = y;
    }
  }

  public static double length(v p0, v p1, v p2) {
    v a = new v(p0.x - (2 * p1.x) + p2.x, p0.y - (2 * p1.y) + p2.y);
    v b = new v((2 * p1.x) - (2 * p0.x), (2 * p1.y) - (2 * p0.y));
    double A = 4 * (a.x * a.x + a.y * a.y);
    double B = 4 * (a.x * b.x + a.y * b.y);
    double C = b.x * b.x + b.y * b.y;
    double Sabc = 2 * Math.sqrt(A + B + C);
    double A_2 = Math.sqrt(A);
    double A_32 = 2 * A * A_2;
    double C_2 = 2 * Math.sqrt(C);
    double BA = B / A_2;
    return (A_32 * Sabc + A_2 * B * (Sabc - C_2) + (4 * C * A - B * B) * Math.log((2 * A_2 + BA + Sabc) / (BA + C_2))) / (4 * A_32);
  }
}
0 голосов
/ 12 февраля 2012

Использование вами слова периметр предполагает, что вы ищете ограничивающую форму.

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

ограничивающий треугольник квадрата Безье - это треугольник, определяемый тремя контрольными точками.

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

Отличная ссылка на Кривые Безье в Википедии.

...