2016-05-20 2 views

Répondre

0

Eh bien, obtenir le point de clic de souris à partir de la NSEvent dans votre méthode mouseDown: avec -locationInWindow, convertir le point de clic de coordonnées des fenêtres aux coordonnées de votre point de vue avec -convertPoint:fromView:, boucle à travers les objets NSBezierPath que vous dessinez, de haut en bas et appelez -containsPoint: pour tester un hit sur chaque chemin. Cela fonctionne bien si vos chemins bezier sont fermés, chemins remplis. Si ce sont des chemins non fermés ou striés, vous devrez descendre un niveau et utiliser CGPathCreateCopyByStrokingPath(), et peut-être aussi CGPathCreateCopyByDashingPath(), pour obtenir le chemin de remplissage qui décrit le contour de la zone qui est remplie lorsque votre chemin d'origine est contourné (voir How to get the path Quartz is using to stroke a NSBezierPath).

Cependant, je ne suis pas sûr de ce que vous entendez par "Mon bezierpath est une sous-classe personnalisée de NSObject"; Si vous faites d'autres choses compliquées au-delà de l'utilisation de NSBezierPath, vous devrez décrire ce que vous faites (et pourquoi), et envoyer un code pour cela.

+0

S'il y a 10 000 bezierpaths, je dois les boucler tous et ce sera très lent. Ce que je fais actuellement est de créer un hitPoint comme 'NSPoint hitPt = [self convertPoint: [inEvent locationInWindow] deView: self] " puis en créant un Rect et en créant un autre Rect à partir des limites de NSBezierpath, et je vérifie si ces deux Rect se croisent en utilisant (NSIntersectsRect (hitPointRect, bezierPathRect), s'ils le font je travaille seulement avec ce bezierPath.Mais encore j'ai –

+0

Votre stratégie semble bien fonctionner. Vous pouvez mettre en cache les limites de tous vos chemins Bézier, de sorte que vous parcourez un tableau de NSRect en cache au lieu de Looping à travers 10 000 'NSRect's pour faire des contrôles à l'intérieur/à l'extérieur devrait prendre très peu de temps, et ensuite si le nombre de" hits "potentiels est assez petit, faire le hit-test sur chaque candidat bezier path shouldn Si vous devez utiliser 'CGPathCreateCopyByStrokingPath()', vous devrez peut-être également mettre en cache les chemins convertis pour plus de rapidité, mais vous pourriez ne pas le faire: – bhaller

+0

Oh, et vous voulez probablement utiliser 'NSPointInRec t() 'faire les vérifications intérieures/extérieures, plutôt que' NSIntersectsRect() ', sauf si quelque chose me manque. Le point de vie est un point, il n'y a aucune raison de le convertir en rect. 'NSPointInRect()' devrait être plus rapide que 'NSIntersectsRect()'. Si le retournement de vue vous gêne, 'NSMouseInRect()' est spécialement conçu pour le test d'impact dans les vues pouvant être inversées. – bhaller