2

我有一些由 Path2D 表示的路径。Path 由多个相互连接的 CubicCurve2D 或 Line2D 段组成。我想计算或获取从路径开始到结束的长度。我该如何计算或得到它?是否可以?我检查了 API 文档,但找不到任何有用的方法。

4

4 回答 4

3

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

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

于 2010-03-30T22:56:29.577 回答
1

鉴于之前关于该主题的问题,文章计算三次贝塞尔曲线的弧长可能会提供一些见解。为方便起见,您可能希望查看 JSciencePolynomial类。此外,基于同一篇文章的这种近似值可能会有所帮助。

于 2010-03-31T00:14:27.240 回答
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;
}
于 2015-11-04T03:55:19.207 回答
0

您可以使用函数 public PathIterator getPathIterator(AffineTransform at, double flatness);

这将给出一个仅包含 SEG_MOVETO、SEG_LINETO 和 SEG_CLOSE 段的“flattenend”迭代器。

于 2012-02-13T22:36:32.323 回答