2009-09-02 7 views
0

Je suis en train de porter mon application de dessin/mise en page graphique jruby/java2d sur macruby/cacao. Par conséquent, j'ai besoin d'obtenir le point d'intersection d'un NSBezierPath ouvert avec un NSBezierPath fermé.NSBezierPath/Line Intersection/flatten

En java2d, j'ai utilisé l'astuce suivante. J'ai aplati les deux chemins et j'ai fait un simple test d'intersection de ligne pour chaque segment.

Y a-t-il un moyen simple de convertir un NSBezierPath en un ensemble de lignes droites? Mon algorithme actuel parcourt simplement la ligne (d'une manière de recherche binaire) jusqu'à ce que je trouve un NSPoint pour lequel containsPoint est vrai. Mais cela ne fonctionne que pour les lignes droites. Celui que j'ai implémenté dans java2d a également fonctionné pour les chemins courbes.

def getIntersection edge, path 
    out = edge.source 
    ins = edge.target 
    until (out.dist(ins) < 1.0) 
    mid = out + ((ins - out) * 0.5) 
    if (path.containsPoint (NSMakePoint(mid.x, mid.y))) 
     ins = mid 
    else 
     out = mid 
    end 
    end 
    return out 
end 

Graph http://i28.tinypic.com/168zs03.png

Répondre

3

est donc là un moyen simple de convertir un NSBezierPath à un groupe de lignes droites?

Envoyer le chemin d'accès à un message bezierPathByFlatteningPath. Cela retournera un nouveau chemin, ainsi converti.

+1

Merci de ne pas m'avoir donné une RTFM que je méritais bien. – thestoneage