2

Path2D で表されるパスがいくつかあります。パスは、互いに接続された複数の 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_QUADTOまたは要素も含まれている場合SEG_CUBICTOは、今のところ理解する必要のない、より複雑な式が必要になります(微積分が必要になる場合があります)。

于 2010-03-30T22:56:29.577 に答える
1

このトピックに関する以前の質問に照らして、3 次ベジエ曲線の弧の長さを計算するという記事は、いくつかの洞察を提供するかもしれません。便宜上、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 に答える