如何计算Java中Path2D的长度?

时间:2010-03-30 22:37:12

标签: java geometry java-2d graphics2d

我有一些由Path2D表示的路径。 Path包含多个相互连接的CubicCurve2D或Line2D段。我想计算或获取从Path的开头到结尾的长度。我该如何计算或得到它?可能吗?我检查了the API documentation,但找不到任何有用的方法。

4 个答案:

答案 0 :(得分:2)

首先使用getPathIterator()获取路径元素。如果路径只有SEG_MOVETOSEG_LINETO元素,则应该很容易计算长度。对所有SEG_LINETO求和sqrt((X1-X2)^ 2 +(Y1-Y2)^ 2),其中点(X1,Y1)是前一个端点,(X2,Y2)是currentSegment返回当前的一个(double [])。

如果它还包含SEG_QUADTOSEG_CUBICTO元素,则需要一个更复杂的公式,我现在不需要弄清楚(可能需要微积分)。

答案 1 :(得分:1)

根据此主题的上一个question,文章Computing the Arc Length of Cubic Bezier Curves可能会提供一些见解。为方便起见,您可能需要查看JScience Polynomial类。此外,基于相同approximation的此article可能有所帮助。

答案 2 :(得分:1)

首先对不起我的英语......

我知道这是一个古老的话题,但也许对某些人有用。 我做了这个,不是用于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;
}

答案 3 :(得分:0)

您可以使用此功能 public PathIterator getPathIterator(AffineTransform at,double flatness);

这将给出一个'flattenend'迭代器,它只包含SEG_MOVETO,SEG_LINETO和SEG_CLOSE段。