IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Coordonnee X,Y sur une Ellipse


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    �tudiant
    Inscrit en
    Octobre 2015
    Messages
    2
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2015
    Messages : 2
    Par d�faut Coordonnee X,Y sur une Ellipse
    Bonjour a tous,

    Par avance desole pour l'absence d'accent mais j'utilise un clavier uk.

    voici mon petit probleme: je dispose de deux ellipses (sur un plan cartesien, c'est une image 2D en fait) dont je connais pour chacune la largeur (dx), la hauteur (dy), et le centre (centroid.x ou .y).
    Mon but et de savoir si ces ellipses se chevauchent ou non.
    En gros ce que j'ai fais c'est recuperer les variables suivantes: la distance entre les deux centres des ellipses (distCenter), la distance enter les centres en X (distCenterX), la meme chose en Y (distCenterY).

    Si je reflechi bien je suis face a 4 cas de figures possible:
    - mon ellipse de reference se trouve en bas a droite de la seconde
    - mon ellipse de reference se trouve en bas a droite de la seconde
    - mon ellipse de reference se trouve en haut a droite de la seconde
    - mon ellipse de reference se trouve en haut a droite de la seconde

    j'omet pour l'instant les cas ou les x et y des deux ellipses sont egaux...

    voici mon code:
    pour info:
    polygonList[compt] = un objet polygone duquel je recupere mes variables tel que le centre dudit objet, sa largeur, sa hauteur, etc... polygonList[compt2] etant bien evidemment le second objet (seconde ellipse).

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
                         	double distCenterX, distCenterY, distCenter, angle1, angle2, pi, x1 , y1, x2, y2, a1, b1, da1, db1, a2, b2, da2, db2;
                            pi=3.14;
                            // represente en gros mon hypotenuse
    			distCenter = sqrt(pow(polygonList[compt]->centroid.datapointx - polygonList[compt2]->centroid.datapointx, 2) + pow(polygonList[compt]->centroid.datapointy - polygonList[compt2]->centroid.datapointy, 2));
     
    			//4 possibilities
    			if (polygonList[compt]->centroid.datapointx > polygonList[compt2]->centroid.datapointx && polygonList[compt]->centroid.datapointy < polygonList[compt2]->centroid.datapointy) {
    				distCenterX = polygonList[compt]->centroid.datapointx - polygonList[compt2]->centroid.datapointx;
    				distCenterY = polygonList[compt2]->centroid.datapointy - polygonList[compt]->centroid.datapointy;
    				angle1 = acos(distCenterY / distCenter)* (180 / pi);
    				angle1 = angle1 + 90;
    				angle2 = acos(distCenterX / distCenter)* (180 / pi);
    				angle2 = 360 - angle2;		
    			}
    			else if (polygonList[compt]->centroid.datapointx < polygonList[compt2]->centroid.datapointx && polygonList[compt]->centroid.datapointy < polygonList[compt2]->centroid.datapointy) {
    				distCenterX = polygonList[compt2]->centroid.datapointx - polygonList[compt]->centroid.datapointx;
    				distCenterY = polygonList[compt2]->centroid.datapointy - polygonList[compt]->centroid.datapointy;
    				angle1 = acos(distCenterY / distCenter)* (180 / pi);
    				angle1 = 90 - angle1;
    				angle2 = acos(distCenterX / distCenter)* (180 / pi);
    				angle2 = angle2 + 180;	
    			}
    			else if (polygonList[compt]->centroid.datapointx < polygonList[compt2]->centroid.datapointx && polygonList[compt]->centroid.datapointy > polygonList[compt2]->centroid.datapointy) {
    				distCenterX = polygonList[compt2]->centroid.datapointx - polygonList[compt]->centroid.datapointx;
    				distCenterY = polygonList[compt]->centroid.datapointy - polygonList[compt2]->centroid.datapointy;
    				angle1 = acos(distCenterY / distCenter)* (180 / pi);
    				angle1 = 360 - angle1;
    				angle2 = acos(distCenterX / distCenter)* (180 / pi);
    				angle2 = angle2 + 90;
    			}
    			else if (polygonList[compt]->centroid.datapointx > polygonList[compt2]->centroid.datapointx && polygonList[compt]->centroid.datapointy > polygonList[compt2]->centroid.datapointy) {
    				distCenterX = polygonList[compt]->centroid.datapointx - polygonList[compt2]->centroid.datapointx;
    				distCenterY = polygonList[compt]->centroid.datapointy - polygonList[compt2]->centroid.datapointy;
    				angle1 = acos(distCenterY / distCenter)* (180 / pi);
    				angle1 = angle1 + 180;
    				angle2 = acos(distCenterX / distCenter)* (180 / pi);
    				angle2 = 90 - angle2;
     
    			}
     
     
    			a1 = polygonList[compt]->dx / 2;
    			b1 = polygonList[compt]->dy / 2;
    			da1 = polygonList[compt]->dx;
    			db1 = polygonList[compt]->dy;
     
    			a2 = polygonList[compt2]->dx / 2;
    			b2 = polygonList[compt2]->dy / 2;
    			da2 = polygonList[compt2]->dx;
    			db2 = polygonList[compt2]->dy;
     
    			angle1 = angle1*(pi / 180);
    			angle2 = angle2*(pi / 180);
     
    			x1 = polygonList[compt]->centroid.datapointx + (a1 * cos(angle1));
    			y1 = polygonList[compt]->centroid.datapointy + (b1 * sin(angle1));
    			x2 = polygonList[compt2]->centroid.datapointx + (a2 * cos(angle2));
    			y2 = polygonList[compt2]->centroid.datapointy + (b2 * sin(angle2));
    Dans l'idee je trace une droite entre les deux centres (distCenter); je trace une droite en x (distCenterX) et une en y (distCenterY). de la j'obtiens un rectangle "virtuel" duquel je deduis mes angles 1 et 2 que je convertis ensuite en radian. Cette operation s'effectue en fonction de la ou se trouve mon ellipse secondaire (polygonList[compt2]) par rapport a l'ellipse de reference (polygonList[compt]) (mes if, elseif ...).
    De la je tente ensuite de trouver les points x1 et y1 qui sont censes representer le point ou la droite virtuelle reliant mes deux centres des ellipses (distCenter) coupe mon ellipse de reference. Idem pour x2 et y2 qui sont les coordonees cette foi ci du point qui est cense representer l'endroit ou a droite entre mes deux centres coupe l'ellipse secondaire.

    c'est confus n'est-ce pas...?

    Apres moulte tests, mes angles semblent bons, mes distances aussi. A ce niveau la ce sont mes connaissances en prog et en geometrie qui ne suivent plus. Donc ami(e)s dev, pourriez vous me venir en aide: pourquoi mes points x1,y1 et x2,y2 ne tombent en rien la ou je les attend ? ou me trompe-je ?

    je precise que les ellipses ne sont pas necessairement toujours applaties, elles ne sont par contre jamais inclinees!

    De plus, desole pour le code "usine a gaz", mais je ne suis pas du tout developpeur... merci de votre comprehension

    edit: vous l'aurez compris, ce code est inclu dans une double boucle for...
    edit2/ une image saura davantage vous expliquer que mes loooongues phrases; voici donc mon art

    Nom : croqui.png
Affichages : 271
Taille : 38,0 Ko

    et les 4 cas de figures, et leurs angles:
    Nom : croquis2.png
Affichages : 226
Taille : 56,9 Ko


    je cherche donc les coordonnees des points en cyan sur l'image.

    Merci :�)

    Flo

  2. #2
    Membre Expert
    Homme Profil pro
    �tudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par d�faut
    Hello,

    Je ferais le calcul en 2 �tapes :
    - remplace tes ellipses par des rectangles et v�rifie s'ils se chevauchent (c'est rapide, pas de sqrt / sin / cos)
    - si les rectangles se chevauchent tu continue

    L'�quation d'une ellipse est
    x = u + a cos(t)
    y = v + b sin(t)

    avec {x,y} un point de l'ellipse
    {u,v} le centre
    a le grand rayon : max(dx / 2, dy / 2) dans ton cas
    b le petit rayon : min(dx / 2, dy / 2)
    t l'angle : angle1 ici

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    a1 = polygonList[compt]->dx / 2;
    b1 = polygonList[compt]->dy / 2;
     
    a2 = polygonList[compt2]->dx / 2;
    b2 = polygonList[compt2]->dy / 2;
    A priori ya une erreur ici : dx n'est pas forc�ment le grand rayon.

  3. #3
    Candidat au Club
    Homme Profil pro
    �tudiant
    Inscrit en
    Octobre 2015
    Messages
    2
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2015
    Messages : 2
    Par d�faut
    Merci pour ta r�ponse (enfin un clavier fr !).

    En effet l�ensemble du code passe par une analyse du chevauchement des rectangles, bien vu !!

    Les �quations de trigo que tu me donne sont donc d�j� impl�ment�es au code. En fait Polygon[compt].centroid.dx ou dy est la largeur et longueur en x et y de mon rectangle. je me ressert de ces variables pour d�finir les axes x et y de mon ellipse, qui est finalement virtuelle, elle n'existe jamais r�ellement dans mon code. Et j'ai beaucoup de mal a r�utiliser la distance dx pour obtenir mon point y dans la formule y=b.sin(t). En fait j'en vois pas la logique. J'ai d�j� cependant essayer de faire deux petits if pour inverser les demi grand axes si dy > dx mais les x1 y1 x2 y2 ne tombent toujours pas juste...

    je ne comprend plus ou se situe mon erreur. peut �tre mes angles? je suis tout perdu..

    help

    Flo

Discussions similaires

  1. Trois points sur une ellipse
    Par Foxaltex dans le forum Math�matiques
    R�ponses: 6
    Dernier message: 09/09/2015, 18h10
  2. Positionner un objet sur une ellipse
    Par Harry Covair dans le forum VBA PowerPoint
    R�ponses: 1
    Dernier message: 11/12/2013, 09h47
  3. d�placement sur une ellipse
    Par TERRIBLE dans le forum Windows Presentation Foundation
    R�ponses: 4
    Dernier message: 05/10/2010, 12h52
  4. �crire un titre sur une ellipse
    Par rawda dans le forum Langage
    R�ponses: 1
    Dernier message: 16/03/2006, 09h52
  5. R�ponses: 3
    Dernier message: 29/06/2005, 14h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo