2010-04-17 1 views
3

J'ai une forme raphael.js sur laquelle je trace un cercle. Je veux seulement qu'un cercle apparaisse si le cercle ne dépasse pas la limite de la forme sur laquelle il est tracé.Détection d'un point à l'intérieur ou à l'extérieur d'une forme raphael.js

Pour le rendre plus clair, voici un exemple de ce que je ne veux pas arriver:

Example http://img682.imageshack.us/img682/4168/shapeh.png

Je veux que les cercles en dehors de la zone grise ne pas apparaître. Comment pourrais-je détecter si un cercle est à l'intérieur ou à l'extérieur de la forme grise?

Répondre

3

Vous pouvez simplement appliquer un clip-path (qui doit être défini comme étant la forme grise de votre exemple) sur un groupe (élément <g>) contenant les cercles.

Voir this example à partir du w3c SVG testsuite pour savoir comment utiliser les chemins de clip.

+0

Cela a fonctionné, mais j'ai dû pirater raphael.js pour jouer avec elle. Raphael.js seulement pris en charge les rectangles, j'ai donc ajouté un petit tweak au code. Voir http://github.com/DmitryBaranovskiy/raphael/issues/issue/100/#comment_212698 pour plus d'informations. NB Je sais que c'est une solution horrible, mais cela fonctionne et pour l'instant c'est tout ce qui me préoccupe. – betamax

4

Un moyen de dertermine si un point est à l'intérieur chemin fermé est la suivante:

  1. Choisissez coordonnées qui sont certainement en dehors de la forme.
  2. Faites une ligne à partir de ce point jusqu'à votre point actuel en question.
  3. Compter, à quelle fréquence la ligne croise le chemin.
  4. Si le nombre d'intersections est impair, alors votre point est à l'intérieur. Si c'est pair, le point est dehors.

Je ne sais pas si cela vous aide beaucoup puisque je ne connais pas raphael.js du tout. Mais c'est une approche géométrique du problème.

+0

intéressant :) comment calculer les interactions? Y at-il une commande ou vous devez le faire vous-même? – Bakaburg

+0

Désolé, vous devrez le faire vous-même. Je viens de décrire le concept mathématique. – selfawaresoup

1

Cela ressemble beaucoup à "Hit-testing SVG shapes?".

Vous aurez juste besoin d'appeler getIntersectionList() sur la position du cercle, et voir si elle renvoie la grande forme grise.

+0

Merci, cela semble être une solution solide, mais, selon le billet de blog qui a été référencé, ce n'est pas encore pris en charge correctement par Firefox/Safari qui est une exigence pour moi. J'aurais dû le mentionner dans mon post original. – betamax

+0

Peut-être que je suis un malentendu, mais j'ai essayé l'exemple sur son blog et cela a très bien fonctionné dans Firefox, Safari et Chrome. – Ken

+0

Ah, je passais juste par le texte dans le post qui disait qu'il n'est pas supporté par Safari ou Firefox mais l'exemple semble fonctionner pour moi aussi. Je vais devoir vérifier cela car il semble un peu plus robuste qu'un masque. Merci! – betamax

Questions connexes