Point sur NSBezierPath

sambocuccio

Membre junior
18 Mars 2004
26
0
82
Bastia
Utilisateur débutant de Cocoa je me pose le problème suivant:

Etant donné un NSBezierPath (rectangle, ovale, courbe..), je voudrais
savoir s'il existe une méthode (à élaborer ?) pour tester la position du
curseur souris PAR RAPPORT A LA COURBE. La méthode "containsPoint" ne
permettant de connaître cette position que relativement à
l'intérieur/extérieur.

Merci de votre éventuelle réponse.
 

peon.master

Membre confirmé
22 Avril 2002
144
5
39
Vernayaz
Je ne comprend pas tres bien ce que tu cherche

la distance par rapport au point de la courbe le plus proche?
la distance x et la distance y par rapport au point le plus proche?
par rapport au centre de la courbe?...
 

sambocuccio

Membre junior
18 Mars 2004
26
0
82
Bastia
Merci de considérer le problème. Je vais essayer d'être plus clair. J'ai besoin d'une méthode renvoyant un Booléen à VRAI si le pointeur de la souris se trouve sur la courbe et FAUX dans le cas contraire.
 

la tortue

Membre confirmé
6 Novembre 2003
397
1
A mon avis tu cherche à faire quelque chose d'impossible, même du point de vue mathématique... Si ta courbe est un tant soit peu courbe il y a vraiment peu de chance que ton pointeur soit exactement sur la courbe, et en fait, avec la faible précision de calcul (float ou double) c'est complètement impossible, si tu réfléchis bien.

Tout ça c'est un problème de limite. La courbe est la limite entre l'intérieur et l'extérieur. Donc ton point est soit à l'intérieur soit à l'extérieur, y a rien à faire.

Ce qu'il faudrait, c'est pouvoir calculer la distance min du point à la courbe, c'est pas gagné non plus. Tu peux éventuellement essayer d'aplatir ta courbe en segment de droites, puis calculer la distance du point à chaque segment...
Avec pas mal d'optimisations ça devrait être possible.
Bon courage.


En tout cas ne compte pas trop sur les classes Cocoa pour faire le calcul à ta place...
 

peon.master

Membre confirmé
22 Avril 2002
144
5
39
Vernayaz
la tortue a dit:
Ce qu'il faudrait, c'est pouvoir calculer la distance min du point à la courbe, c'est pas gagné non plus. Tu peux éventuellement essayer d'aplatir ta courbe en segment de droites, puis calculer la distance du point à chaque segment...
Avec pas mal d'optimisations ça devrait être possible.
Mathématiquement c'est tout a fait possible et même assez facile. Je suis sur un programme d'animation vectorielle qui fait quelque chose comme ça (pour la selection des formes). Je vais poster la version beta quand ca sera "potable"

Le probleme ne NSBezierPath, c'est qu'on ne peut pas récuperer tous les points (voir la methode "elementAtIndex:associatedPoints:" de NSBezierPath) C'est pourquoi j'utilise un NSArray d'object point
 

peon.master

Membre confirmé
22 Avril 2002
144
5
39
Vernayaz
Pour le fun, J'ai ressorti ma théorie de math d'il y a quelques années et j'ai fait un petit explicatif de comment je m'y prend. Je n'ai pas mis de code source car j'utilise des objets perso (pas BezierPath)

voila le lien:

C'est un pdf généré avec appleworks.
J'espère qu'il n'y a pas trop d'erreurs.
a++
 

sambocuccio

Membre junior
18 Mars 2004
26
0
82
Bastia
Merci pour les infos et pour le fichier. Mon idée est de bricoler un logiciel genre CabriGéomètre qui ne fonctionne plus avec Panther. Il faut donc pouvoir sélectionner des courbes et pouvoir y placer des points. Je viens de m'apercevoir que, si la courbe n'est pas fermée, la méthode "containsPoint" donne YES pour un point de la courbe atteint par le pointeur souris et NO pour tout autre point. Il y a donc un espoir.
Le projet est certainement trop ambitieux pour un débutant en Objective-C Cocoa (mais pas débutant en programmation), mais, comme disait l'autre: "Il n'est pas nécessaire d'espérer pour entreprendre ni de réussir pour persévérer"
Encore merci
 

Tiff

Membre junior
23 Avril 2004
40
0
Je m'étais posé le même problème il y a un an et j'avais commencé à étudier Sketch, proposé en exemple dans les Developer Tools. Es-tu allé voir comment il fonctionnait pour détecter l'objet, en particulier une droite, survolé par le pointeur ?