|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Membre du Club
![]() Inscription : juillet 2006 Messages : 166 ![]() |
Bonjour
J'aimerais déterminer si un point est dans un rectangle ou non. Le langage que j'utilises n'en n'est pas vraiment un, c'est plus une interface. On l'appele le jass2, c'est le langage de l'éditeur de warcraft3 en ce qui concerne la création de scripts. Bien qu'il existe une fonction qui détermine si un point est dans un rectangle, cela fonctionne uniquement pour les rectangles "normaux" (1 et 2) Et même si elle n'existait pas, il suffirait de vérifier si le X et le Y du point sont entre les valeurs minimales et maximales. Vous l'avez donc compris j'aimerais savoir si un point se situe dans un rectangle quelquonque (type 3). Je suis quasiment certain que cela est possible avec des intervalles de valeurs. Je dispose des opérateurs logiques nécessaires : == (égal) != (différent) >= (supérieur ou egal), etc. and, not, or et bien sûr if/then/else/elseif/endif Evidement on connait les coordonées des 4 points. si un matheux pouvait m'aider ca serait sympa PS : Désolé pour la piètre image, j'avais oublié la compression jpg Mais pas besoin d'avoir un talent d'artiste pour se faire comprendre non ? |
|
|
00
|
|
|
#2 |
![]() ![]() Romuald PerrotAttaché Temporaire d'Enseignement et de Recherche (ATER) Inscription : avril 2005 Messages : 4 144 ![]() |
Une idée pour gérer ça, et qu'on applique quelques fois en 3D, si tu sais résoudre le problème pour les rectangles 1 et 2, ramène toi via un changement de repère à ce problème. Ici, l'idée, c'est d'effectuer une rotation pour te ramener dans l'un où l'autre des cas.
Sinon, si tu ne veux pas t'embêter avec les rotations, une idée, c'est de prendre trois points : deux sur le rectangle et le point que tu souhaites tester. Tu regardes si le point à tester est à gauche ou à droite de la droite formée par les deux autres points. Le tout est de tester comme ça pour tous les points en les prenant dans un ordre trigo (inverse ou pas) Pour résumer, tu numérotes tes points dans un sens (on va dire le sens trigo), P0,P1,P2,P3. Le point à chercher s'appelle P. Tu prends les droites (P0 P1) (P1 P2) (P2 P3) (P3 P0) et à chaque fois tu regardes si P est à gauche de chacune de ces droites, si tel est le cas, ton point P est dans le rectangle.
__________________
http://rperrot.developpez.com http://phos-graphein.fr Vous désirez contribuer à la rubrique algorithmique, n'hésitez pas à me contacter. |
|
|
00
|
|
|
#3 |
|
Membre du Club
![]() Inscription : juillet 2006 Messages : 166 ![]() |
hmm y'a pas vraiment de gestion d'équations de droite possibles
Du coup ton idée rotation me semble la solution la plus efficace. Il y a des fonctions toutes faites pour savoir les différents angles. Je vais y réfléchir |
|
|
00
|
|
|
#4 | |
![]() ![]() Romuald PerrotAttaché Temporaire d'Enseignement et de Recherche (ATER) Inscription : avril 2005 Messages : 4 144 ![]() |
Citation:
On parle de tour gauche (ou de tour droit), c'est un simple calcul de déterminant. Pour savoir si P est à gauche de P1 P2, tu calcules det( P1P , P1P2 ) et si c'est positif, c'est un tour gauche (ie: P est à gauche de P1P2). C'est tout bête.
__________________
http://rperrot.developpez.com http://phos-graphein.fr Vous désirez contribuer à la rubrique algorithmique, n'hésitez pas à me contacter. |
|
|
|
00
|
|
|
#5 |
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 424 ![]() |
Changeons de probleme... Comment savoir que le point P n'est pas dans le rectangle ?
Etape 1. On crée un rectangle "droit" (en rouge) autour du rectangle incliné. Si le point P n'est pas dans ce grand rectangle => il n'est pas dans l'autre [FIN]. Etape 2. on créé 4 petits rectrangles (en bleu) dans le gros rectangle, tel que les cotés du rectangle incliné soient les diagonales des 4 petits rectrangles. On cherche ensuite dans lequel des 4 petits rectrangles se trouve le point P => (R1,R2,R3 ou R4). il peut etre dans plusieurs rectangles en meme temps, dans ce cas on doit faire l'etape suivante pour chaque rectangle. Etape 3. On doit determiner si le point P est dans la partie blanche (interieur) ou la partie rouge (exterieur) du petit rectrangle Ri. Pour cela, on regarde si la pente de la droite (coin-de-Ri,P) est plus petite/grande que la pente de la diagonale (= comparer les ratio Longueur/Largeur). S'il est dans le rouge => le point P est a l'exterieur [FIN] Dans les autres cas, il est dedans [FIN] Note: - On prend le coin-de-Ri qui est au milieu du grand rectangle rouge: c'est a dire les coordonnées du rectangle incliné. - on regarde si la pente est plus petite ou plus grande suivant le rectangle (R1,R2,R3,R4) ou est situé P. (cf dessin) rects.jpg l'algo total tient en quelques lignes, avec seulement des comparaisons inferieur/superieur, quelques if/else, des soustractions et des multiplications. Et a la fin, on se rend compte que le code est equivalent a la solution de promu@ld, car la comparaison de pente est equivalent au signe du determinant (car "a/b < c/d" <=> "a*d < b*c" <=> a*d-b*c<0 )
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
|
00
|
|
|
#6 |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 8 743 ![]() |
Sinon (eh oui je reviens à mon dada
Algo ici http://www.faqs.org/faqs/graphics/algorithms-faq/ sujet 2.03
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
|
|
00
|
|
|
#7 |
![]() Inscription : novembre 2006 Messages : 1 756 ![]() |
Quand le rectangle est centré sur l'origine et que ses côtés sont parallèles aux axes.
M appartient à R ssi -A/2<x<A/2 -B/2<y<B/2 A étant la largeur et B la longueur (à moins que ce ne soit le contraire). Il n'y a donc qu'à se placer dans un repère centré sur le rectangle et ayant des vecteurs unitaires parallèles aux côtés. |
|
|
00
|
|
|
#8 | ||
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 424 ![]() |
Allez, on commence le concours... voila ma solution:
Code java :
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
||
|
00
|
|
|
#9 |
![]() ![]() Romuald PerrotAttaché Temporaire d'Enseignement et de Recherche (ATER) Inscription : avril 2005 Messages : 4 144 ![]() |
Autre idée (si tu travailles en 2D sur une image), avec un algo de remplissage, tu remplis ton rectangle, si le point est dedans, alors il est de la même couleur que le rectangle , sinon, il est de la couleur du fond ...
__________________
http://rperrot.developpez.com http://phos-graphein.fr Vous désirez contribuer à la rubrique algorithmique, n'hésitez pas à me contacter. |
|
|
00
|
|
|
#10 |
|
Membre du Club
![]() Inscription : juillet 2006 Messages : 166 ![]() |
@PRomu@ld : Non l'éditeur n'offre pas de telles possiblitées, mon rectangle est on ne peu plus virtuel, il est juste délimité par 4 points mais n'a pas d'existence propre.
Je peux seulement en créer de type 1 et 2, et puis sans rentrer dans les détails, même si c'était possible, c'est assez lent de créer un rectangle par rapport à des comparaisons de coordonnées et quelques calculs simples (pour le jass2). Et comme je comptes faire cette vérification péridioquement (surement tous les 3 centièmes de secondes) @pseudocode : dis moi ta méthode fonctionnerait aussi pour un polygône quelquonque non ? @Zanoven : euh ouai mais pour mettre les axes parralèles il faut faire une rotation donc ... @souviron : L'anglais et moi, on est pas copain ![]() Sinon j'ai compris la méthode de rotation et il suffirait en prenant un point quelquonque du rectangle comme centre de rotation de recalculer les coordonnes X/Y des 3 autres points et bien sûr le point à tester. La rotation dépendant de l'angle d'inclinaison du rectangle bien sûr (donc un calcul d'angle). Puis une fois le rectangle horizontal ou vertical, au choix, vérifier si les coordonnees du point sont bien dans la plage. A vrai dire j'étais parti sur cette solution mais j'attends de savoir la réponse de pseudocode sur le coté "universel" de sa solution |
|
|
00
|
|
|
#11 | ||
![]() ![]() Romuald PerrotAttaché Temporaire d'Enseignement et de Recherche (ATER) Inscription : avril 2005 Messages : 4 144 ![]() |
Citation:
(en même temps, c'est peut-être pas si con ...) Citation:
__________________
http://rperrot.developpez.com http://phos-graphein.fr Vous désirez contribuer à la rubrique algorithmique, n'hésitez pas à me contacter. |
||
|
|
00
|
|
|
#12 | |
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 424 ![]() |
Citation:
![]() non: les conditions de sortie "au plus tot" ne sont valides que pour le rectangle (car les sous-regions recouvrent entierement la bounding-box) oui: la methode qui consiste a tester le signe du determinant permet de savoir de quel coté on est par rapport a une arrete. Pour un polygône quelquonque (concave ou convexe), on doit tester toutes les arrete et compter le nombre de fois qu'on est d'un coté ou de l'autre. Cet algo generique s'appelle le "Winding Number" (et vive la topologie !) ![]() @FR119492,souviron34,Nemerle: ca sent la modération tout ca...
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
|
|
00
|
|
|
#13 |
![]() ![]() Jean-Marc Blanc Inscription : avril 2007 Messages : 2 660 ![]() |
Salut!
Il y a une méthode qui marche pour tout polygone convexe, dont les sommets sont numérotés 1, 2, 3, ..., n, le point qui t'intéresse portant le numéro 0: Tu notes le sens du produit vectoriel des vecteurs 12 et 10. Tu calcules ensuite le sens des produits vectoriels des vecteurs 23 et 20, 34 et 30, etc. jusqu'à n1 et n0. Si le sens est toujours le même, le point 0 est à l'intérieur. Mais ça ne te garantit que la réponse est correcte que si ton polygone est convexe. Pour le vérifier, tu notes le sens du produit vectoriel des vecteurs 12 et 23, puis 23 et 34, etc. Si le sens est toujours le même, le polygone est convexe. Sinon, tu le découpes en deux polygones. Il y a plus de chances qu'ils soient convexes. Si ton point est à l'intérieur d'un des polygones, il est à l'intérieur de leur réunion. Ainsi tu as un algorithme qui marche dans tous les cas. Bonne chance. Jean-Marc Blanc |
|
|
00
|
|
|
#14 |
|
Membre du Club
![]() Inscription : juillet 2006 Messages : 166 ![]() |
Bon finalement la méthode de rotation est celle que je maitrise le mieux, je vais donc l'utiliser et poster le code lorsque ca sera fait.
On sait jamais si un warcraftien s'était perdu ici |
|
|
00
|
|
|
#15 | ||
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 424 ![]() |
Un petit truc utile a savoir dans ce cas:
cos(arctan(x)) = 1/racine(1+x²) sin(arctan(x)) = x/racine(1+x²) ca permet de ne pas utiliser les couteuses fonctions trigonometriques. Code java :
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
||
|
00
|
|
|
#16 | ||
![]() Inscription : novembre 2006 Messages : 1 756 ![]() |
Rien qu'avec les 4 opérations (sans trigo).
Soit ABCD le rectangle. On calcule les vecteurs AB AD On écrit la matrice P dont les colonnes sont ces coordonnées. On inverse cette matrice (il n'y a qu'un déterminant à calculer) On a alors les formules de changt de cordonnées de la base canonique à la base orthonomée ci-dessus. Pour changer l'origine une simple translation. Reste alors à exprimer les conditions d'inclusion le plus simplement du monde. Pas de rotation, pas de trigo rien que les 4 opérations Code :
|
||
|
|
00
|
|
|
#17 | ||||
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 424 ![]() |
Pourquoi changer l'origine ? Autant garder le point A comme origine du nouveau repere et tester que le transformé du point (M-A) a des coordonnées (x,y) entre 0 et 1.
PS: Ta multiplication de matrice m'a l'air d'etre a l'envers... ![]() Code :
Code java :
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
||||
|
00
|
|
|
#18 | ||
![]() Inscription : novembre 2006 Messages : 1 756 ![]() |
Citation:
Citation:
|
||
|
|
00
|
|
|
#19 | |
|
Membre du Club
![]() Inscription : juillet 2006 Messages : 166 ![]() |
@Zanoven : Si je veux gérer les vecteur et les matrices je vais devoir recréer ces fonctions, elles n'existent pas.
Je n'ai vu que trés brièvement les vecteurs et pas du tout les matrices (ou du moins je ne m'en rappelle plus )Donc à moins que j'ai mal compris ton algo, il me manque des précisions. Citation:
|
|
|
|
00
|
|
|
#20 | ||
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 424 ![]() |
Ca n'empeche pas que, d'apres moi, la formule est a l'envers...
Dans le code java que j'ai donné j'ai pris le meme formalisme que toi, et si je prend ta formule (X1=M[0]*X1+M[1]*Y1) ca ne marche pas. il faut prendre X1=M[0]*X1+M[2]*Y1. Citation:
Citation:
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
||
|
00
|
Copyright © 2000-2012 - www.developpez.com