Insérer un point dans un NSBezierPath

julien31

Membre confirmé
2 Septembre 2003
34
1
Salut.

Je créé un NSBezierPath avec la souris (je récupère les coordonnées de chaque points dans mouseDown, et je les ajoute au NSBezierPath).

Maintenant, je souhaiterais pouvoir insérer des points dans ce NSBezierPath. L'idéal serait d'avoir une méthode qui, avec les coordonnées du point cliqué, détecte si il se trouve sur la trajectoire du NSBezierPath, et renvoie le point précédent par exemple ....

Comment faire ?
 

PA5CAL

Membre expert
Club MacG
21 Juillet 2005
9 251
597
Île-de-France
Je ne connais pas cette librairie graphique. Peut-être existe-t'il une fonction qui fait déjà le travail tout seul...


Sinon, je pense que le plus simple est de déterminer approximativement la distance la plus faible entre la courbe de Bézier et le point donné, en "parcourant" cette courbe à l'aide de l'algorithme de Casteljeau par exemple. Si la distance mini tombe en-dessous d'une certaine valeur (de quelques pixels), on peut considérer qu'on a cliqué sur la courbe.

Et pour déterminer grossièrement le nombre de points de parcours à considérer (nombre de valeurs différentes du paramètre), on peut se contenter de calculer la longueur de la ligne brisée correspondant au polygone de contrôle de la courbe.

Je pense que c'est une idée de principe qu'il reste à améliorer et à optimiser.
 

PA5CAL

Membre expert
Club MacG
21 Juillet 2005
9 251
597
Île-de-France
julien31 a dit:
Voici un exemple qui explique la solution : http://www.cocoadev.com/index.pl?HitDetection.

Cette méthode peut être utile à beaucoup de monde je pense, elle permet d'insérer des points au milieu d'un NSBezierPath avec la souris.

Effectivement, la routine NearestPointOnCurve() trouve le point sur la courbe de Bézier le plus proche du point donné, par résolution d'une équation polynomiale.

Ça ne marche que pour des courbes de Bézier cubiques. Quand on donne plus de 4 points, est-ce que NSBezierPath fabrique une suite de cubiques, ou bien une courbe de degré supérieur ?

I just tried this out and when doing hit detection on a sharp bezier curve, it is significantly out - the curve it seems to check is flatter than what the NSBezierPath draws. I would have thought that the curve geometry would be standard.
S'il s'agit de cubiques, il doit y avoir une appoximation de degré inférieur dans le tracé, comme ça se fait souvent pour réduire les calculs. Si par contre il s'agit de courbes de degré supérieur, le problème n'est pas correctement traité par ce code.
 

julien31

Membre confirmé
2 Septembre 2003
34
1
Je t'avouerais que dans mon cas précis, je n'utilise pas de bezier courbés, ce ne sont que des droites. Donc dans mon cas, ça fonctionne nickel. Pour les courbes, c'est à tester ....