2010-03-30 4 views
1

J'ai des chemins représentés par Path2D. Le chemin consiste en plusieurs segments CubicCurve2D ou Line2D connectés entre eux. Je voudrais calculer ou obtenir la longueur du début à la fin d'un chemin. Comment puis-je le calculer ou l'obtenir? C'est possible? J'ai vérifié the API documentation, mais je n'ai trouvé aucune méthode utile.Comment calculer la longueur d'un Path2D en Java?

Répondre

1

Commencez par utiliser getPathIterator() pour obtenir les éléments de chemin. Si le chemin n'a que SEG_MOVETO et SEG_LINETO éléments, la longueur devrait être facile à calculer. Somme juste sqrt ((X1-X2)^2 + (Y1-Y2)^2) pour tous les SEG_LINETO, où le point (X1, Y1) était l'extrémité précédente, et (X2, Y2) est l'actuel retourné par currentSegment (double []).

S'il contient également des éléments SEG_QUADTO ou SEG_CUBICTO, cela nécessitera une formule plus compliquée dont je n'ai pas besoin pour le moment (peut nécessiter un calcul).

+0

+1 pour vérifier le type de simplifier les calculs. J'ai d'abord préféré la classe 'Polynomial' pour ses méthodes de calcul, mais l'intégrale de longueur d'arc n'a pas de solution de forme fermée. :-( – trashgod

0

Vous pouvez utiliser la fonction public PathIterator getPathIterator (AffineTransform at, double flatness); Cela donnera un itérateur «flattenend» contenant uniquement les segments SEG_MOVETO, SEG_LINETO et SEG_CLOSE.

0

tout d'abord désolé pour mon anglais ...

Je sais que c'est un vieux sujet, mais peut-être il est utile pour quelqu'un. Je l'ai fait, n'est pas un CubicCurve mais pour un 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; 
} 
Questions connexes