begin process at 2012 02 10 10:00:44
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

ActionScripts

 > DÉTECTION D'INTERSECTION DE DEUX LIGNES

DÉTECTION D'INTERSECTION DE DEUX LIGNES


 Information sur la source

Note :
Aucune note
Catégorie :ActionScripts Classé sous :GEOMETRY, DETECTION, LINES, SEGMENTS, POINT Niveau :Initié Date de création :21/10/2007 Date de mise à jour :23/10/2007 08:58:52 Vu / téléchargé :7 802 / 267

Auteur : top30

Ecrire un message privé
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (37)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
Exemple de détection d'intersection de lignes.
Exemple construit à partir de la fonction "intersection(p1,p2,p3,p4)"
de ma librairie "hopeSuite.sharedAS3.libs.LibGeom".

Fonction élaborée à parti d'un code PHP trouvé sur le réseau FlashSource.
Donc remerciement à "ASTALAVISTA".

En passant si quelqu'un type "AFAD", pouvais me donner la fonction permettant de savoir si un point fait partit d'un segment... Je me permettrais de lui retourner "au propre" !
= )



 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

21 octobre 2007 01:29:30 :
Oubli de package "hopeSuite"
21 octobre 2007 17:15:51 :
Mise a jour avec détection d'intersection de segment. Remerciement à Bali_Balo qui m'a permit de comprendre que : Si le segment [p1-p2] a le même coefficient directeur que [p2-p3] et que p3 fait partie du rectangle P1-P2 alors P3 fait partie du segment [P1-P2].. Non ???
23 octobre 2007 08:58:52 :
Mise à jour du Zip avec la fonction dñeouverte par BananaTree ! = )

 Sources du même auteur

Source avec Zip Source avec une capture UN PACKAGE "HISTORIC" POUR GÉRER VOS COMMANDES
Source avec Zip CLASS IMAGE ET IMAGEEVENT
Source avec Zip CONSTANTE D'OBJET INMODIAFIABLE ET DÉBLOQUABLE
Source avec Zip Source avec une capture PERSONNALISATION DE COMPOSANT ET GESTION XML
Source avec Zip Source avec une capture PHP COUNTER EVOLUTION

 Sources de la même categorie

Source avec Zip ZOOM SUR UNE IMAGE par yasdar
Source avec Zip Source avec une capture UN PEU DE MATH par yasdar
Source avec Zip Source avec une capture PARTICULE SYSTEM par yasdar
Source avec Zip Source avec une capture GALLERIE PHOTO AVEC XML par yasdar
Source avec Zip Source avec une capture MP3 LAYER NICE &SMALL par yasdar

Commentaires et avis

Commentaire de bali_balo le 21/10/2007 14:30:48

"En passant si quelqu'un type "AFAD", pouvais me donner la fonction permettant de savoir si un point fait partit d'un segment... Je me permettrais de lui retourner "au propre" !
= )"

Mais lol ^^, rien de plus simple.
Avec deux points , tu peux calculer l'équation de la droite passant par cela. Ensuite tu vérifie tout simplement si le point vérifie l'équation trouvée... Dois-je t'écrire le code où ça ira?... :P

Tiens, regarde cela http://www.iag.asso.fr/articles/intersection.htm, ou bien tapes tout simplement "intersection point segment" dans gougueuleux.


bali_balo....=]

Commentaire de bali_balo le 21/10/2007 14:47:25

P1(x1,y1) , P2(x2,y2) , P3(x3,y3) et le segment [P1,P2]
Equation d'une droite : y=ax+b
a=(y2-y1)/(x2-x1)
et b=y1-ax1 OU b=y2-ax2

Ensuite tu vérifie si ax3+b=y3 ou que (y3-b)/a=x3

Commentaire de bali_balo le 21/10/2007 14:54:58

Jcrois que je vais me faire une ptite classe dans le genre dans mon package geom. J'en ai marre de re-écrire ces fonctions dans mes classes. Limite je reprend la tienne ^^.
(C'est promis pour cette semaine je met enfin un morceau de mon package ^^)


bali_balo....=]

Commentaire de bali_balo le 21/10/2007 15:04:38

Ah j'oubliais ^^, si un point fait partie d'un "segment".
Vérifie aussi si le point est dans l'intervale du segment.
(dsl pour tous ces post)

Commentaire de top30 le 21/10/2007 15:36:02

Merci....
Mais pourrais-tu le traduire à un language plus claire pour moi, car comme tu as pu le remarquer, mon niveau de math/algèbre est relativement bas !!!!

= (

Commentaire de bali_balo le 21/10/2007 18:15:28

MMDDRR tu nous sort une classe remplie de calcul tous tordue les uns que les autres, et tu me dis que ton niveau de math est relativement bas... hum hum... ^^

import flash.geom.Point;
function isOnTheSegment( p1:Point,p2:Point,p3:Point ) :Boolean {
//calcul de l'équation de la droite des 2 points du segment
var a:Number = (p2.y-p1.y)/(p2.x-p1.x);
var b:Number = p1.y-a*p1.x;//OU bien b=p2.y-a*p2.x;
trace( a );
trace( b );
return ( a*p3.x+b == p3.y );// OU return ( (p3.y-b)/a == p3.x );
}

//retourne false
trace( isOnTheSegment( new Point(0,2) , new Point(2,0) , new Point(2,2) ) );

//retourne true
trace( isOnTheSegment( new Point(0,2) , new Point(2,0) , new Point(1,1) ) );

Commentaire de bali_balo le 21/10/2007 18:36:05

J'oubliais qu'il fallait vérifier aussi si le point est dans le même intervale que le segment : j'ai la flemme de re-écrire le code ^^.

Commentaire de top30 le 21/10/2007 18:38:03

Et uq'est-ce que cela veut dire "si le point est dans le même intervale que le segment "
Désolé de pas savoir...

Commentaire de top30 le 21/10/2007 18:47:10

Ahhh oui...
Et si mon niveau de math n'était pas si bas, mes calculs se seraient pas tordus...

= )

Commentaire de bali_balo le 21/10/2007 18:51:24

Bah...tu veux savoir si un point fait partie d'un segment.
Ma fonction détermine si un point est sur une droite, pas un segment.
Donc pour savoir si un point est sur le segment, il faut qu'il soit dans l'intervale formé par ses deux points.
Quand je disais que tes calculs sont tordus, je voulais dire par là qu'ils sont complexes :)


bali_balo....=]

Commentaire de top30 le 21/10/2007 18:58:17

De plus la fonction "hitTest" ajouté ne fonctionne pas à 100% !!!!

Commentaire de top30 le 21/10/2007 19:22:25

Problème résolu de facon facile :

Remplacer la fonction "hitTest" de "IntersectionExample"
par ceci :

public function hitTest ( $oP1 : Point, $oP2 : Point, $oP3 : Point )
: Boolean
{
      var nRnd : Number = 100000000 ;
      var nA12 : Number = LibNum.round (LibGeom.angle ($oP1, $oP2) , nRnd );
      var nA13 : Number = LibNum.round (LibGeom.angle ($oP1, $oP3) , nRnd );
      var nD12 : Number = LibGeom.distance ($oP1, $oP2 );
      var nD13 : Number = LibGeom.distance ($oP1, $oP3 );
      //
      return (nA12 == nA13) && (nD13 <= nD12) ;
}

En gros, si l'angle "P1-P2" est le même que "P1-P3", et que la distance de P1 à P3 est inférieure ou égale à la distance de P1 à P2, est alors en théorie sur le segment....

Commentaire de bali_balo le 21/10/2007 20:29:27

Oui, je pense aussi que cela marche, il y a bien des théorèmes en géométrie pour résoudre ce genre de problème.

Commentaire de top30 le 21/10/2007 20:38:40

Ben donne moi le plus "rapide"...
= )

Commentaire de rambc le 22/10/2007 16:29:30

Voici une méthode mathématique possible.

     M appartient au segment [AB]
si et seulement si
     M est le barycentre de (A,k) et (B,1-k) avec 0<=k<=1
si et seulement si
     x_M=k*x_A+(1-k)*x_B  et  y_M=k*y_A+(1-k)*y_B  avec 0<=k<=1
si et seulement si
     x_M=k*(x_A-x_B)+x_B  et  y_M=k*(y_A-y_B)+y_B  avec 0<=k<=1
si et seulement si
     x_M-x_B=k*(x_A-x_B)  et  y_M-y_B=k*(y_A-y_B)  avec 0<=k<=1

Quel est alors le programme ?
    TEST 1 : Si x_A=x_B, on regarde si y_M est entre y_A et y_B.
    TEST 2 : Si y_A=y_B, on regarde si x_M est entre x_A et x_B.
    Cas Général : On a  x_A<>x_B  et  y_A<>y_B. Dans ce cas, on calcule  k_1=(x_M-x_B)/(x_A-x_B)  et  k_2=(y_M-y_B)/(y_A-y_B) . On doit avoir  k_1=k_2  et ensuite  0<=k_1<=1 .

En espérant avoir été clair.

Commentaire de rambc le 22/10/2007 16:37:30

Compléments : pour éviter des arrondis hazardeux dus aux divisions, on peut noter grâce à un simple produit en croix que  k_1=k_2  si et seulement si  (x_M-x_B)*(y_A-y_B) = (y_M-y_B)*(x_A-x_B).

Commentaire de top30 le 22/10/2007 18:39:23

pas trop...
j'ai juste l'impression que c'est un peu "lourd" non ?

Commentaire de rambc le 22/10/2007 18:50:53

Pour calculer un angle, on fait des arrondies et pas des moindres, et pour une distance c'est la même chose. A programmer la méthode ci-dessus est TRES facile, et de plus rapide. Programmer n'est pas penser. A toi de voir si tu trouves plus simple et efficace, fais moi signe...

Sans méchanceté, je trouve que les adeptes du Flash devraient un  peu réviser leur classique.

Pour finir, la méthode des barycentres peut aussi servir à détecter si un point est dans un triangle ou non. Je n'arriverais jamais à comprendre les programmeurs qui ne veulent pas faire un minimum de maths (ceci réduit beaucoup les possibilités...).

Commentaire de bali_balo le 22/10/2007 19:29:03

"Je n'arriverais jamais à comprendre les programmeurs qui ne veulent pas faire un minimum de maths (ceci réduit beaucoup les possibilités...)."
Tout simplement parce que j'en ai bavé pendant 2 ans en DEUG MIAS :D. C'était limite si c'était pas de la philo... (Soit E un ensemble magma infini compris dans un ensemble infini qui lui est compris dans un ensemble infini....Et f une fonction homomorphisme... PLUS JAMAIS SA!!! :S)
Pourtant c'est vachement interessant! Math & Physique, j'adore, mais loin des théorèmes:P

Sinon toi qui a une méthode de barycentre dans ta classe Top30, le tour est joué ^^.


bali_balo....=]

Commentaire de top30 le 22/10/2007 20:57:41

Sauf que RAMBC, il a parlé chinois pour moi....
Si il etais sympa il nous la traduirais en AS non ?

; )

Commentaire de BananaTree le 23/10/2007 00:10:01

si la somme des distances (p1,p2) et (p2,p3) est egale à la longueur (p1,p3) alors p2 est sur le segment [p1, p3].
dixit flash.geom.Point.
(je peux me tromper, j'y entrave que d'alle en math)

Commentaire de bali_balo le 23/10/2007 00:50:02

Voilà de quoi on m'a gavé lorsque j'étais encore un pauvre étudiant en informatique :(

http://fr.wikipedia.org/wiki/Espace_vectoriel

(je pense que BananaTree nous a tous scillé avec sa soluce toute bète et simple à implémenter avec la fonction distance de la classe Point)

shame on us... :P

Commentaire de top30 le 23/10/2007 08:45:18

Après mise en application je confirme le bon
fonctionnement, dansla mesure ou la compraison est faite avec des arrondis des distances.

Simple et efficace.

BananaTree, je te remercie de me faire sentir aussi con !
= )

Commentaire de Slagt le 24/10/2007 22:46:34

Pour ne pas avoir à calculer les distances, on peut aussi se servir de l'équation d'une courbe de bézier linéaire, dans ce cas, il faut simplement que ces termes soient compris entre 0 et 1 (inclus) :

   (X3 - X1) / (X2 - X1)
et (Y3 - Y1) / (Y2 - Y1)

Avec {X1, Y1} les coordonnées du point 1
     {X2, Y2} les coordonnées du point 2
     {X3, Y3} les coordonnées du point à tester (3)

Commentaire de top30 le 25/10/2007 01:58:12

OOOUH !! à tester, mais ca parait un tres "joli" coup !!!

Commentaire de Slagt le 25/10/2007 22:56:37

Je l'ai pas tester mais ça devrait fonctionner logiquement. Sauf si justement j'ai fait une erreur de logique.

L'avantage, c'est que le nombre trouvé correspond à la position (en pourcent) du point.

si (X3 - X1) / (X2 - X1) = 0.5, ça veut dire que SUR X, on se trouve à 50% entre P1 et P2

donc si les deux sont égales à 0.5, on se trouve... au milieu du segment :)

Commentaire de Slagt le 25/10/2007 23:04:51

Ah... on a 2 conditions en fait :
- Deux valeur égale
(X3 - X1) / (X2 - X1) = (Y3 - Y1) / (Y2 - Y1)

- Compris entre 0 et 1
   0 <= (X3 - X1) / (X2 - X1) <= 1
ou 0 <= (Y3 - Y1) / (Y2 - Y1) <= 1

Commentaire de rambc le 25/10/2007 23:32:49

C'est juste ce que j'ai mis juste avant.... ;-)

Commentaire de top30 le 25/10/2007 23:47:52

OOH ! Encore plus fort !
Je te note après test !

Commentaire de Slagt le 26/10/2007 15:30:37

Désolé RAMBC, j'avais pas vu ton commentaire.

Ce que tu dis est vrai, mais tu pars de zéro ! Les maths c'est aussi savoir partir de ce qui a déjà été fait pour aller plus vite, et surtout pour que ceux qui n'y comprennent rien puisse y comprendre enfin quelque chose.

Les courbes de béziers sont absolument génial ! Elle permette de tracer une courbe "propre" d'un point à un autre en se rapprochant vaguement de ceux qu'on a mis entre les deux. C'est l'outils "plume" de Photoshop ou de Flash... Mais quand on a que 2 points, ça trace une simple droite.

L'avantage des courbes de bézier, c'est qu'elles ne sont pas définie en fonction des coordonées, mais en fonction d'un paramètre, "t", qui varie de 0 à 1. Quand t=0, on est sur le premier point, quand t="1", on est sur le dernier point.

Wikipédia (notre ami commun ;)), nous donne, pour 2 points, que l'équation d'une courbe de bézier est (on travaille avec des points, donc dans flash il faudra 2 équations en réalité, une avec X, et une avec Y, chacun remplacant simplement P dans l'équation) :
P3 = (1-t)*P1 + t*P2 (pour tout t de 0 à 1)

Donc logiquement, si P3 appartient au segment, on a P3 = (1-t)*P1 + t*P2
On se débrouille pour isolé t, et on trouve que t = (P3 - P1) / (P2 - P2)
Or on sait que t est compris entre 0 et 1, donc on a aussi (P3 - P1) / (P2 - P2) compris entre 0 et 1.

L'autre condition est logique, puisqu'on a 1 seul "t", donc il est forcément identique dans les 2 équations (ça serait stupide pour un même point, d'avoir un "t" différent selon X ou Y...)

2 façon de voir les choses, au fond... identique, mais bon, ça peut intéresser certains d'entre vous :)

Commentaire de BananaTree le 26/10/2007 18:22:25

et bla, et bla, et bla...
"l'équation d'une courbe de bézier linéaire [...]
"(X3 - X1) / (X2 - X1)
et (Y3 - Y1) / (Y2 - Y1)

Avec {X1, Y1} les coordonnées du point 1
     {X2, Y2} les coordonnées du point 2
     {X3, Y3} les coordonnées du point à tester (3)"

ça serait pas de l'algèbre de base sur les intervalles et un peut de géométrie dans le plan tout ça ?


si x est compris dans l'intervalle défini par les abscisses des extrémités du segment
et y est compris dans l'intervalle défini par les ordonées des extrémités du segment
alors le point (x,y) est sur le ségment.

bref, les vraies questions (aux quelles je suis sur que top30 va répondre ;)):

-1) quel est l'algorythme le plus simple à coder ?
-2) quel est l'algo le plus performant ?

ce qui répondra à :
"En passant si quelqu'un type "AFAD", pouvais me donner la fonction permettant de savoir si un point fait partit d'un segment... Je me permettrais de lui retourner "au propre" ! "

Commentaire de Slagt le 26/10/2007 22:01:02

>> si x est compris dans l'intervalle défini par les abscisses des extrémités du segment
et y est compris dans l'intervalle défini par les ordonées des extrémités du segment
alors le point (x,y) est sur le ségment.

Faux :) En fait, si les deux expressions sont comprises entre 0 et 1, le point est compris dans le rectangle défini par le segment (qui est sa diagonale). Le point appartient au segment si et seulement si, ces deux expressions sont égales.

>> ça serait pas de l'algèbre de base sur les intervalles et un peut de géométrie dans le plan tout ça ?
Si si, juste deux façon, identique dans le fond, de voir les choses.

Commentaire de top30 le 26/10/2007 22:03:49

La gagnante est :

public function hitTest ($oP1 : Point, $oP2 : Point, $oP3 : Point )
: Boolean{
    var n :Number= ($oP3.x - $oP1.x) / ($oP2.x - $oP1.x ) ;
    return !( n< 0 || n > 1 ) ;
}

Sachant que l'on cherche à savoir si le point est sur un segment de droite !

Commentaire de top30 le 26/10/2007 22:04:55

Et ca marche !
Donc le gagnant est : SLAGT !

Commentaire de BananaTree le 26/10/2007 23:03:19

>> Slagt
exact (j'ai pris mon crayon pour vérifier ;) )

Commentaire de bali_balo le 26/10/2007 23:12:36

Top30 tu te rends compte à quel point ta "petite" question fait débat :D
Pour savoir comment on détermine si un point est sur un segment...
MMDDRR!


bali_balo....=]

Commentaire de top30 le 27/10/2007 02:04:10

C'est ca l'interessant de la source au fond...

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Detection du plugin Flash... [ par TORIUKE ] Bonjour,Comment savoir si le navigateur client est equipe du plugin Flash, de maniere à l'orienter directement sur une page flash ou html (ou autres). Detection plugin et layer [ par sfj2 ] Salut à tous.Je souhaiterais détecter la présence du plugin Flash MX,et afficher ou non un layer suivant sa présence, au lieu de renvoyer sur une autr Detection connection internet [ par elz ] AlloJe cherche comment on pourrait detecter une connection internet pour que lorsqu'on clique sur un lien, si la personne a haute vitesse, un fichier Detection [ par hpotter ] Comment detecte ce qui à changer sur l'annimation ? Merci HPOTTER detection flash player [ par stricnoune ] J'ai fais un site tout en flash. Comment je peux faire pour detecter si les utilisateur possédent flash player et dans le cas où ils ne le possédent p detection flash player [ par stricnoune ] J'ai fais un site tout en flash. Comment je peux faire pour detecter si les utilisateur possédent flash player et dans le cas où ils ne le possédent p detection de flash player [ par tlecoz ] Bonjour, je viens de finir mon site que j'ai realisé entierement en flash. En fait je voudrais savoir deux chose :d'une part, pour utiliser la detecti detection majuscule/minuscule [ par kikos ] Slt à tous les flasheurs, Je souhaiterai savoir lors d'une animation flash que j'ai créer comment je peut faire pour voir si l'utilisateur est en maju detection [ par godak ] stop();getVersion();if (Version = 6) { gotoAndStop("Séquence 1", 1);} else { getURL("www.macromedia.com/downloads/", "_blank");}je voulais savoi detection des images [ par juju1975 ] Bonjour à tous,Je cherche un moyen de détection pour le chargement de photos...merci et je suis nouvelle sur le forumJUJU


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,196 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales