Вычислить периметр кривой Безье в Java

Кажется, в Java нет никакого метода для вычисления периметра квадратичной кривой Безье... или, по крайней мере, я его не узнаю.

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

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

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

Спасибо за уделенное время! :)

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

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

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


person LosTChG    schedule 12.02.2012    source источник
comment
Этот вопрос (и ответ) может быть полезен кому-то другому, поэтому вам следует: (1) создать ответ на свой вопрос, используя область текста ответа ниже. Переместите свое редактирование в ответ; (2) подождите необходимые 48 часов; (3) принять ваш ответ. Вы не получите никаких баллов, но, по крайней мере, вопрос будет отображаться как ответ на него в будущих поисках.   -  person Jim Garrison    schedule 12.02.2012
comment
Вы можете удалить вопрос или ответить на него самостоятельно, сославшись на статью и почему помогло. Дополнительные сведения см. в часто задаваемых вопросах.   -  person trashgod    schedule 12.02.2012


Ответы (2)


Вот точный перевод кода 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);
  }
}
person OldCurmudgeon    schedule 12.02.2012

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

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

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

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

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

person OldCurmudgeon    schedule 12.02.2012