Point sur NSBezierPath

sambocuccio

Membre confirmé
18 Mars 2004
26
0
86
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.
 
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?...
 
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.
 
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.
smile.gif

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.
wink.gif

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.
wink.gif


En tout cas ne compte pas trop sur les classes Cocoa pour faire le calcul à ta place...
tongue.gif
 
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
 
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++
 
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
 
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 ?