Как рассчитать длину Path2D в Java? - PullRequest
2 голосов
/ 31 марта 2010

У меня есть несколько путей, представленных Path2D. Путь состоит из нескольких сегментов CubicCurve2D или Line2D, которые связаны друг с другом. Я хотел бы рассчитать или получить длину от начала до конца пути. Как я могу рассчитать или получить это? Является ли это возможным? Я проверил документацию API , но не смог найти никаких полезных методов.

Ответы [ 4 ]

2 голосов
/ 31 марта 2010

Начните с использования getPathIterator(), чтобы получить элементы пути. Если путь содержит только элементы SEG_MOVETO и SEG_LINETO, длина должна быть легко рассчитана. Просто сложите sqrt ((X1-X2) ^ 2 + (Y1-Y2) ^ 2) для всех SEG_LINETO, где точка (X1, Y1) была предыдущей конечной точкой, а (X2, Y2) текущей возвращается currentSegment (double []).

Если он также содержит SEG_QUADTO или SEG_CUBICTO элементов, для этого потребуется более сложная формула, которую я не хочу сейчас выяснять (может потребоваться исчисление).

1 голос
/ 04 ноября 2015

Прежде всего, извините за мой английский ...

Я знаю, что это старая тема, но, возможно, она кому-то пригодится. Я сделал это, не для CubicCurve, а для QuadCurve:

public double CurveLength (QuadCurve curve){
    double xini = curve.getStartX();
    double yini = curve.getStartY();
    double xpoint = curve.getControlX();
    double ypoint = curve.getControlY();
    double xfin = curve.getEndX();
    double yfin = curve.getEndY();

    double ax = xini-(2*xpoint)+xfin;
    double ay = yini-(2*ypoint)+yfin;
    double bx = (2*xpoint)-(2*xini);
    double by = (2*ypoint)-(2*yini);
    double A = 4*((ax*ax)+(ay*ay));
    double B = 4*((ax*bx)+(ay*by));
    double C = (bx*bx)+(by*by);

    double Sabc = 2*(Math.sqrt(A+B+C));
    double A2 = Math.sqrt(A);
    double A32 = 2*A*A2;
    double C2 = 2*(Math.sqrt(C));
    double BA = B/A2;

    double length = ((A32*Sabc) + (A2*B*(Sabc-C2)) + (((4*C*A)-(B*B))*Math.log(((2*A2)+BA+Sabc)/(BA+C2))))/(4*A32);
    return length;
}
1 голос
/ 31 марта 2010

В свете предыдущего вопроса по этой теме статья Вычисление длины дуги кубических кривых Безье может дать некоторое представление. Для удобства вы можете взглянуть на класс JScience Polynomial. Кроме того, это приближение , основанное на той же статье , может помочь.

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

Вы можете использовать функцию public PathIterator getPathIterator (AffineTransform at, двойная плоскостность);

Это даст «плоский» итератор, содержащий только сегменты SEG_MOVETO, SEG_LINETO и SEG_CLOSE.

...