|
Posté par rodymary
bonjour à tous,
soit 2 segments A et B dont on connait les coordonnées x,y de chacun des points des segments. j'aimerai savoir s'il existe une méthode simple pour savoir si ces 2 segments se croisent, autrement qu'en calculant leur equation respective, le déterminant, ... je ne cherche pas à connaitre les coordonnées du point d'intersection, juste savoir s'il existe une intersection. c'est pour une application informatique merci d'avance |
|
Posté par Flodelarab
oui.
Les intervalles des x et des y doivent avoir une partie commune. Ensuite, prend le rectangle le plus ressérré possible sur ton point concours supposé.... tu trouveras la condition d'intersection @Dominique: Merci de respecter l'énoncé ... pas d'equation ! |
|
Posté par Dominique Lefebvre
J'y pense, il existe une solution assez simple.
Tu traces le premier segment en mémorisant les pixels activés. En traçant le second segment, tu vérifie si le pixel que tu veux écrire est déjà activé. Si oui, il s'agit du point d'intersection. |
|
Posté par Flodelarab
pffff
je reve |
|
Posté par Dominique Lefebvre
Pourquoi, ça marche parfaitement! et en plus tu peux tester si les deux segments sont superposés!
PS: sais-tu que c'est comme ça que fonctionnent les algo d'effacement des arêtes cachées... |
|
Posté par rodymary
de manière illustrée, voici mes 2 segments :
Flodelarab, lorsque tu dis "Les intervalles des x et des y doivent avoir une partie commune." => là c'est bon, je pige, c'est après... |
l'abscisse bleue et
l'abscisse jaune.
et
alors les segments ne se croisent pas. Sinon, il se croisent.|
Posté par rodymary
euh, non c'est pas beaucoup plus clair
ok pour la "plus petite boite" quand on parle d'abscisse, c'est bien l'horizontale ? si je comprends ton explication, ça ne marche pas, car regardes ci-dessous, j'ai inversé le sens du segment (cd) désolé de paraître boulet mais ce n'était pas un euphémisme de dire que je n'étais pas matheux ! merci pour ta patience ! |
|
Posté par Flodelarab
Aucun probleme.
ça marche toujours. Si je prends l'ordre des ordonnées pour xm, j'ai [ab] au dessus de [cd] et si je prends l'ordre des ordonnées pour xM, j'ai [ab] au dessus de [cd]. Donc [ab] et [cd] ne se croisent pas ... |
), on observe en Xm que [AB] est en dessus de [CD]. On observe également qu'en XM, [AB] est en dessous de [CD]

devient

correspond au point P, et
correspond au point Q.
trouvé est compris entre 0 et 1, alors les deux segments se coupent. Sinon, ils ne se coupent pas !|
Posté par Flodelarab
On te dit de pas calculer les équations.
|
|
Posté par rodymary
ce que j'arrive pas à interpreter de façon mathématique (afin de le retranscrire informatiquement), c'est la notion de "en dessous" ou "au dessus" ?
|
![4$ Y(X_m_{[AB]})\ > \ Y(X_m_{[CD]}) 4$ Y(X_m_{[AB]})\ > \ Y(X_m_{[CD]})](http://www.maths-forum.com/images/latex/21831c888e8abc40e971c97b6dba51d9.gif)
![4$ Y(X_M_{[AB]})\ > \ Y(X_M_{[CD]}) 4$ Y(X_M_{[AB]})\ > \ Y(X_M_{[CD]})](http://www.maths-forum.com/images/latex/9a41f90bb764d9fa0a75256819ac55f4.gif)
![4$ Y(X_m_{[AB]})\ > \ Y(X_m_{[CD]}) 4$ Y(X_m_{[AB]})\ > \ Y(X_m_{[CD]})](http://www.maths-forum.com/images/latex/21831c888e8abc40e971c97b6dba51d9.gif)
![4$ Y(X_M_{[AB]})\ < \ Y(X_M_{[CD]}) 4$ Y(X_M_{[AB]})\ < \ Y(X_M_{[CD]})](http://www.maths-forum.com/images/latex/2099fa661636d5b0b5606b61d4ab5cdc.gif)
|
Posté par Quidam
Personne n'a dit ça !
|
|
Posté par rodymary
j'aimerai savoir s'il existe une méthode simple pour savoir si ces 2 segments se croisent, autrement qu'en calculant leur equation respective
|
![4$ Y(X_m_{[AB]})\ 4$ Y(X_m_{[AB]})\](http://www.maths-forum.com/images/latex/4c5a8203bbe8438bd8f00eac594c103c.gif)
, mais que veut dire
?
|
Posté par rodymary
Oh là, restons bons enfants.
J'aurais peut-être dû expliquer d'avantage pourquoi je souhaiterai ne pas utiliser d'équations. Ma priorité absolue étant d'optimiser les calculs et donc de réduire au maximum les diverses manipulations de variables, je dois éviter tant que possible : - l'utilisation de fonctions complexes genre trigo, exposants, ... même si les ordinateurs possèdent à présent tous un co-processeur arithmétique - les divisions afin de na pas avoir à tester et gérer les éventuelles divisions par zéro Il vaut mieux faire quelques conditions imbriquées (SI...ALORS...) que de lancer brutalement des calculs mathématiques et en exploiter les résultats. C'est pourquoi la solution de Flodelarab m'intéresse tout particulièrement, encore faudrait-il que je la comprenne. A ce titre, je ne comprends toujours pas une formule du genre ![]() Ok pour , mais que veut dire ? |
|
Posté par Flodelarab
Y: l'ordonnée pour le segment [AB] a l'abscisse xm prédéfini (droite bleue me semble t il)
|
|
Posté par rodymary
ah, c'est bien ce qui m'inquiétait... c'est qu'il me faut trouver cette ordonnée, et pour ce faire, c'est calcul de l'équation de [AB] pour trouver l'intersection entre xm et [AB]... ça n'est du coup plus si "rapide" que je ne le pensais.
Tu vois ce que je veux dire, il aurait suffi de faire quelques SI...ALORS... c'était nickel, mais dès lors qu'il faut passer par une équation (même 2 pour xm et xM), test de division pour le coef de pente a de y=ax+b, ... A moins que je n'aie mal compris, je te remercie tout de même pour ta patience !!! |
| soit 2 segments A et B dont on connait les coordonnées x,y de chacun des points des segments. |
|
Posté par rodymary
Je précise mon énoncé.
Soient A et B 2 segments dont on connait les coordonnées de leurs extrémités réspectives : segment A : (x1A,y1A)-----------(x2A,y2A) segment B : (x1B,y1B)-----------(x2B,y2B) Ces 2 segments peuvent être perpendiculaires, parrallèles, séquants ou non, bref toutes les configurations possibles et inimaginables. Admettons que nous ayons en notre possession 2 fonctions permettant de renvoyer la valeur minimum ou maximum de 2 variables : Notons les Min(variable1,variable2) et Max(variable1,variable2). Est-ce possible de savoir si oui ou non ces 2 segments possèdent une intersection, uniquement en utilisant ces 2 fonctions, des tests de supériorité/infériorité/égalité/inégalité que nous noterons respectivement > < = ou <>, un algorithme simple du genre Si toto<titi ALORS... Interdiction d'utiliser la division, et possibilité d'utiliser des variables de travail. Le tout avec le moins de lignes possibles. Quel challenge me direz-vous ! |
|
Posté par Flodelarab
En fait tu connais rien du segment proprement dit
|
|
Posté par rodymary
Effectivement, ça risque d'être lourd dans ce cas.
|
|
Posté par Flodelarab
LOURD ????? |
|
Posté par rodymary
...je dois calculer tous les points d'intersections de ces segments entre eux....
|
|
Posté par rodymary
Oui, lourd, car quand l'objectif est de savoir si 2 segments se croisent, ça va, mais dans mon cas, j'ai environ 10000 segments dans tous les sens, et je dois calculer tous les points d'intersections de ces segments entre eux, dans ce cas la moindre économie de calcul se traduit immédiatement par des centièmes de gagné !
|
|
Posté par Flodelarab
heureusement que tu nous as dit le contraire ....
|
|
Posté par Dominique Lefebvre
Pour y voir plus clair, tes 10 000 segments sont stockés où et comment? S'agit-il de pur calcul ou bien dois-tu les afficher?
Dans quel type d'application gères-tu 10 000 segments. Je ne vois que des applis. graphiques pour ça (ou de CAO/DAO)... |
|
Posté par rodymary
en Visual Basic
|
|
Posté par rodymary
optimisation
|
|
Posté par rodymary
C'est effectivement une application de type DAO, écrite en Visual Basic. Ce n'est certes pas le langage le plus approprié mais il correspond à mon besoin et à mes connaissances. La partie affichage de ces segments n'est pas un problème, alors que la partie calcul et stockage des données nécessite quant à elle un soin attentif et une optimisation en conséquence.
Le choix du type de variable utilisée dans ce langage est primordial et je travaille à ce titre sur des entiers (c'est le plus gros poste d'optimisation). Revers de la médaille, ce type de variable possède des limites car stocké sur 4 octets, et un "overflow" arrive vite. |
|
Posté par Dominique Lefebvre
Bon, je ne vais pas me moquer de ton usage de VB, moi... On fait avec ce qu'on a!
Par contre, je ne suis pas certain que ton seul (et même principal) poste d'optimisation soit l'usage d'entiers! Pourquoi d'ailleurs utilises-tu des long (4 octets) plutôt que des integer (2 octets). As-tu besoin de 4 octets pour stocker les coordonnées d'un point? A mon sens, ton gros problème d'optimisation va tenir dans le choix de la structure de données que tu vas utiliser pour stocker tes données. En DAO, l'accès doit être très rapide.... Et tu dois gérer 10 000 segments... Comment procèdes-tu? |
|
Posté par rodymary
Je ne relèverai pas plus que ça la moquerie de notre ami...
J'utilise du Long par nécessité, la plus petite unité de mesure recherchée étant le millimètre et je dois pouvoir gérer plusieurs centaines de mètres (les +/-32767 de l'Integer ne suffisent donc pas). Mon application étant basée sur des segments, je les stocke dans un tableau Segt() défini comme suit : Type infoSegt x1 as Long y1 as Long x2 as Long y2 as Long Group as Long autres caractéristiques (gras, pointillés, ...) End Type L'application est un "AutoCAD Like" très simplifié et sur mesure en terme d'ergonomie/manipulation, pour un apprenti infographiste de 60 ans que le mulot rebute. |
|
Posté par Dominique Lefebvre
1/ si je comprends bien, tu gères une précision du millimètre sur plusieurs centaines de mètres.... Curieux!
|
|
Posté par Dominique Lefebvre
2/Tu stockes tes segments dans un tableau... Je m'en doutais un peu remarque! Et comment accèdes-tu aux données: en séquentiel? Dois-tu rechercher un segment (ou plusieurs) en particulier?
|
|
Posté par Dominique Lefebvre
Bon, cela ne nous dit pas comment chercher l'intersection de deux ou plusieurs segments le plus rapidement possible... Je vais chercher dans ma doc, il doit bien y avoir un algo d'intersection bien pensé dans la littérature!
|
|
Posté par rodymary
Salut Dominique.
J'ai laissé de côté la gestion de classes et de collections qui ne ferait qu'allourdir les traitements de masse, d'ou l'utilisation d'un tableau simple. L'accès aux données se fait effectivement en séquentiel, mais est quasi-instantanné car je maintiens en parallèle d'autres tableaux de points dits d'accroche qui changent de couleur au passage du mulot (milieu de segment, points d'intersection, ...). |
-