2010-03-30 7 views

답변

1

getPathIterator()을 사용하여 시작하여 경로 요소를 가져옵니다. 경로에 SEG_MOVETOSEG_LINETO 요소 만있는 경우 길이를 계산하기 쉽습니다. SEG_LINETO에 대해 sqrt ((X1-X2)^2 + (Y1-Y2)^2)를 합산합니다. 여기서 점 (X1, Y1)은 이전 종점이고 (X2, Y2)는 currentSegment (double []).

또한 SEG_QUADTO 또는 SEG_CUBICTO 요소가 포함되어 있으면 지금 당장 계산할 필요가없는 복잡한 수식이 필요합니다 (미적분을 요구할 수 있음).

+0

+1 계산을 단순화하기 위해 유형을 확인하기 위해. 처음에는 미적분 방법으로 '다항식'클래스를 선호했지만 아크 길이 적분에는 닫힌 폼 솔루션이 없습니다. :-( – trashgod

0

기능을 사용할 수 있습니다. public PathIterator getPathIterator (AffineTransform at, double flatness);

이것은 SEG_MOVETO, SEG_LINETO 및 SEG_CLOSE 세그먼트 만 포함하는 'flattenend'이터레이터를 제공합니다. 내 영어에 대한 모든 유감의

0

먼저 ...

나는이 오래된 주제지만 아마도 그것은 누군가를 위해 유용 알고있다. 내가이 만든하는 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; 
} 
관련 문제