Bonjour,
N'étant pas un expert en géométrie, j'aimerais avoir un algo permettant de calculer les nouvelles coordonnées des 4 coins du rectangle losque l'on lui à appliquer une rotation d'un angle donné par rapport à son centre de gravité.
Bonjour,
N'étant pas un expert en géométrie, j'aimerais avoir un algo permettant de calculer les nouvelles coordonnées des 4 coins du rectangle losque l'on lui à appliquer une rotation d'un angle donné par rapport à son centre de gravité.
bien le bonjour
je pense que les nombres complexes pourront t'aider :
coordonnées du centre de grav : xg = moyenne des xi, pareil pour yg.
le premier coin A de ton rectangle a les coordonnées (x1,y1).
primo tu changes de repère et tu prends un repère centé sur G, les nouvelles coordonnées de A deviennent (x1-xg, y1-yg). l'affixe de A dans ce repère est donc
za=sqrt(abscisse²+ordonnée²).exp(i.arctan(ordonnée/abscisse)) en notation exponentielle, si je dis pas de bêtises.
tu fais une rotation de centre G donc le module ne changera pas c(est cool).
Après rotation d'angle théta, tu as
za'=sqrt(la même chose).exp(i.(arctan(....) + théta )).
ensuite, tu redécomposes en écriture algébrique : par exemple z=m*exp(i*théta) est égal à m.cos(thétha) + i.m.sin(théta) et tu peux en tirer les coordonnées de ton point DANS LE REPERE CENTRE SUR G. warning!
mais, tu rajoutes xg et yg à tes coordonnées nouvellement obtenues pour avoir les coordonnées recherchées.
j'espère que c'est juste !
pour faire simple disons que
xa'=sqrt( (xa-xg)²+(ya-yg)² ). cos (Arctan( (ya-yg)/(xa-xg) ) + théta ) + xg
ya'=sqrt( (xa-xg)²+(ya-yg)² ). sin(Arctan( (ya-yg)/(xa-xg) ) + théta ) + yg
J'ai l'impression que ton algo ne fonctionne pas.
Voici la traduction java de ton algo:
les coordonnees du rectangle sont dans 2 tableaux xpoints et ypoints de taille 4, je parcours donc les 2 tableaux enincrementant i.
Voici le resultat:
Rectangle de depart:
Point0: (100;100)
Point1: (150;50)
Point2: (300;200)
Point3: (250;250)
Rectangle obtenu pour une rotation de 90°: -> il est défomé
Point0(:200;200)
Point1(:123;338)
Point2(:250;225)
Point3(:193;247)
je suis pas un pro du java mais il me semble que ta racine carrée n'est pas refermée. Autre chose, les unités d'angles sont-elles bien les mêmes ? degrés / radians.
j'ai effacé effectivement la parenthese de fin de la racine carré, mais elle y figure bien dans mon programme, donc ca ne vient pas de ca
Je fais une conversion degré vers radian
ca ne vient pas de ca non plus.
je suppose que tu fais un truc du genre
et donc tu écrases les coordonnées du premier rectangle par celle du second, mais dans ton poly.ypoints[i], tu appelles xpoints[i] que tu viens juste de modifier. tu mélanges les coordonnées de tes deux rectangles.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 boucle i de 1 à 4 poly.xpoints[i]=.... poly.ypoints[i]=.... finboucle
prends 2 tableaux bien séparés.
effectivement, je faisais comme ca, j'ai corrigé en placant les x du rectangle dans une var temporaire que j'utilise dans le calcul des nouveaux y.
Mais malheureusment ca ne marche toujours pas.
Je te remercie pour ton aide aussi bien en geometrie que pour le debuggage.
voici le code complet de ma fonction :
Les resultats donnent:
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 public void rotation(double a) { /*conversion en radian*/ a=Math.toRadians(a); int temp; for(int i=0;i<poly.npoints;i++) { temp=poly.xpoints[i]; System.out.print("Point"+i +":("+poly.xpoints[i]+";"+poly.ypoints[i]+")"); poly.xpoints[i]= (int)(( Math.sqrt( (poly.xpoints[i]-centreGravite().x) *(poly.xpoints[i]-centreGravite().x) +(poly.ypoints[i]-centreGravite().y) *(poly.ypoints[i]-centreGravite().y) ) * Math.cos( Math.atan( (poly.ypoints[i]-centreGravite().y) /(poly.xpoints[i]-centreGravite().x)) + a ) ) + centreGravite().x); poly.ypoints[i]= (int)(( Math.sqrt( (temp-centreGravite().x) *(temp-centreGravite().x) +(poly.ypoints[i]-centreGravite().y) *(poly.ypoints[i]-centreGravite().y)) * Math.sin( Math.atan( (poly.ypoints[i]-centreGravite().y) /(temp-centreGravite().x)) + a ) ) + centreGravite().y); System.out.println(" / Point"+i+ ":"+poly.xpoints[i]+";"+poly.ypoints[i]+")"); }
Ancien point / Point nouveau
Point0: (100;100) / Point0:149;269)
Point1: (150;50) / Point1:25;233)
Point2: (300;200) / Point2:186;356)
Point3: (250;250) / Point3:120;404)
En faisant sur papier la rotation, je pense que l'on devrait obtenir à peu près:
Point0150;250)
Point1100;200)
Point2250;50)
Point3300;100)
Il peut y avoir un probleme d'arrondi, vu que je fais un cast de double en entier mais elle ne doit pas etre si importante
je te propose une autre formule un peu plus simple et qui devrait poser moins de problèmes :
xa'=(xa-xg).cos théta - (ya-yg).sin théta + xg
ya'=(ya-yg).cos théta + (xa-xg).sin théta + yg
il suffit de se souvenir que l'écriture complexe d'une rotation est
z'-oméga = exp(i.théta) . (z-oméga)
j'espère que cette fois ci ça marchera correctement.
cet algo marche,
J'étais bloqué sur ce problème depuis quelques jours et je dois avouer que mes souvenirs sur la géométrie, la trigonométrie et les complexes étaient très vague...
Un grand merci pour ton aide précieuse et ta rapidité de réponse.
salut;
je suis entrain de faire la meme chose pour pivoter mes rectangles. mais mon probleme c que je veux les afficher dans un BMP, et les valeur retourner par cos et sin sont de nature double. donc pour manipuler des pixel (des entiers) ca marche pa. avez vous une idée ?
si je cast je v perdre la precision.
merci et a bientot
je pense que le plus simple est de manipuler jusqu'à la fin des nombres flottants pour conserver la précision des sin et cos.
Et juste à la fin, lorsque tu veux dessiner ton bmp, tu mets les coordonnées de tes points à l'échelle de ton bmp, histoire d'avoir les nombres les plus grands possibles, et tu tronques pour avoir des entiers.
Bonjour à vous
Je trouve ce sujet très intéressant, mais si j'ai une rotation à effectuer non pas à partir du centre de gravité, mais depuis un des côtés du rectangle (côté A(xa,ya) de ABCD) est ce que cela marche? j'ai essayé mais mon rectangle se déforme légèrement ce qui a tendance a m'agacer légèrement aussi
merci de votre aide
bien le bonjour
théoriquement, la formule de rotation fonctionne à partir de n'importe quel point ( je parle de celle avec les nombres complexes).
poste ton code.
Merci ben c'est ce que je voulais savoir, donc visiblement l'erreur ne vient pas de là
C'est interne à mon prog faut que je cherche
merci pour ta réponse très rapide
salut
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager