|
Fonction de Dessin trouver les coordonnées suite à une rotation |
Débuté par cedricscha, 21 jan. 2019 19:22 - 3 réponses |
| |
| | | |
|
| |
Membre enregistré 16 messages Popularité : +1 (1 vote) |
|
Posté le 21 janvier 2019 - 19:22 |
Bonjour,
Je bloque sur un point..... J'espère que vous pourrez m'aider :
Soit le code suivant
MonRectangle est une Image MonImage est une Image
nMaLargeurRectangle est un entier = 80 nMaHauteurRectangle est un entier = 30 MonAngleDeRotation est un entier = 45
nMaLargeurImage est un entier = 800 nMaHauteurImage est un entier = 600
nMonEmplacementX est un entier = 200 nMonEmplacementY est un entier = 100
MonImage..Hauteur = nMaHauteurImage MonImage..Largeur = nMaLargeurImage
MonRectangle..Largeur = nMaLargeurRectangle + 5 MonRectangle..Hauteur = nMaHauteurRectangle + 5
dDébutDessin(MonRectangle,dEffacer)
dRectangle(MonRectangle,0,0,nMaLargeurRectangle,nMaHauteurRectangle,RougePastel,Noir)
dCopie(MonRectangle,MonImage,0,0,MonRectangle.Largeur,MonRectangle.Hauteur,nMonEmplacementX,nMonEmplacementY,MonRectangle.Largeur,MonRectangle.Hauteur)
dDébutDessin(MonRectangle,dEffacer)
dRectangle(MonRectangle,0,0,nMaLargeurRectangle,nMaHauteurRectangle,BleuPastel,Noir)
dRotation(MonRectangle,MonAngleDeRotation,drDéfaut)
dCopie(MonRectangle,MonImage,0,0,MonRectangle.Largeur,MonRectangle.Hauteur,nMonEmplacementX,nMonEmplacementY,MonRectangle.Largeur,MonRectangle.Hauteur)
Ce code à pour but de tracer deux rectangles. un normal et un de même dimension tourné à 45°.
Je souhaiterais que le coin supérieur soit dessiner sur le même point.
Est-ce qu'on peux facilement trouvé le décalage en coordonées que le deuxième rectangle dois avoir ?
J'espère que l'un d'entre vous auras la solution et pourras me l'indiquer ou m'orientez dans mes recherches.
J'espère avoir été assez clair dans mon explication et vous remercie par avance pour le temps passé à étudier mon problème.
Meilleures salutations
Cédric |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 16 messages Popularité : +1 (1 vote) |
|
Posté le 21 janvier 2019 - 22:11 |
J'ai un peu avancé selon diverses informations trouvées sur le net....
Ben c'est pas glorieux..... au moins ça marche sur un carré..... mais je suis loin d'un résultat probant sur un rectangle.
MonRectangle est une Image MonImage est une Image
nMaLargeurRectangle est un entier = 180 nMaHauteurRectangle est un entier = 100 MonAngleDeRotation est un entier = 45
nMaLargeurImage est un entier = 800 nMaHauteurImage est un entier = 600 MonImage..Hauteur = nMaHauteurImage MonImage..Largeur = nMaLargeurImage MonRectangle..Largeur = nMaLargeurRectangle + 5 MonRectangle..Hauteur = nMaHauteurRectangle + 5
nMonEmplacementX est un entier = 100 nMonEmplacementY est un entier = 100
rMonRetourDeProc est un réel
dDébutDessin(MonRectangle,dEffacer)
dRectangle(MonRectangle,0,0,nMaLargeurRectangle,nMaHauteurRectangle,RougePastel,Noir)
dCopie(MonRectangle,MonImage,0,0,MonRectangle.Largeur,MonRectangle.Hauteur,nMonEmplacementX,nMonEmplacementY,MonRectangle.Largeur,MonRectangle.Hauteur)
dDébutDessin(MonRectangle,dEffacer)
dRectangle(MonRectangle,0,0,nMaLargeurRectangle,nMaHauteurRectangle,BleuPastel,Noir)
dRotation(MonRectangle,MonAngleDeRotation,drDéfaut)
rMonRetourDeProc = CalculX(0,0,MonRectangle.Largeur/2,MonRectangle.Hauteur/2,MonAngleDeRotation)
dCopie(MonRectangle,MonImage,0,0,MonRectangle.Largeur,MonRectangle.Hauteur,nMonEmplacementX - rMonRetourDeProc ,nMonEmplacementY,MonRectangle.Largeur,MonRectangle.Hauteur)
IMG_SansNom1 = MonImage
PROCEDURE INTERNE CalculX(nP1_X est un entier ,nP1_Y est un entier, nPCg_X est un entier, nPCg_Y est un entier, nAngle est un entier) rMonCalculX est un réel
rMonCalculX = (nPCg_X - nP1_X)*Cosinus(nAngle) - (nPCg_Y - nP1_Y) * Sinus(nAngle) + (nPCg_X - nP1_X) RENVOYER rMonCalculX FIN
voilà mon code à l'heure actuelle, j'espère que l'un d'entre vous pourras me corriger ou m'indiquer dans quel sens aller.
En vous remerciant par avance du temps que vous passerez sur mon problèmeMessage modifié, 21 janvier 2019 - 22:37 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 16 messages Popularité : +1 (1 vote) |
|
Posté le 22 janvier 2019 - 17:26 |
Bon, ben je continue tout seul sur ce problème. je reste à votre disposition si quelqu'un à déjà eu se cas ? ou aimerait y réfléchir.
Voici ou en est ma procédure de calcul, cela à l'air de fonctionner pour un point, les calculs de rotation ont l'air de corespondre selon mes tests sur papier.
Trace(CalculNouvelleCoordonéeAprèsRotation(110,120,85,95,45))
PROCEDURE INTERNE CalculNouvelleCoordonéeAprèsRotation(nP1_X est un entier, nP1_Y est un entier, nPRot_X est un entier, nProt_Y est un entier, nMonAngle est un entier) nP2_x , nP2_Y sont des numériques nLongeurX, nLongeurY sont des entiers nLongeurX = nP1_X - nPRot_X nLongeurY = nP1_Y - nProt_Y nP2_x = nLongeurX * Cosinus(nMonAngle) + nLongeurY * Sinus(nMonAngle) + nPRot_X nP2_Y = - nLongeurX * Sinus(nMonAngle) + nLongeurY * Cosinus(nMonAngle) + nProt_Y RENVOYER (nP2_x,nP2_Y) FIN
Il faudrait maintenant que j'arrive à interfacer cela avec la fonction dessin pour pouvoir via la fonction copie faire correspondre mon coin haut gauche de mon rectangle.
Si vous avez une idées, je vous écoute volontiers. |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 16 messages Popularité : +1 (1 vote) |
|
Posté le 22 janvier 2019 - 21:40 |
Et bien voilà.... Je me réponds encore à moi-même, et à Wilson.....
Voici le code fonctionnel :
MonRectangle est une Image MonImage est une Image
nMaLargeurRectangle est un entier = 150 nMaHauteurRectangle est un entier = 220 MonAngleDeRotation est un entier =72
nMaLargeurImage est un entier = 800 nMaHauteurImage est un entier = 600 MonImage..Hauteur = nMaHauteurImage MonImage..Largeur = nMaLargeurImage
SI nMaLargeurRectangle > nMaHauteurRectangle ALORS MonRectangle..Largeur = nMaLargeurRectangle *3 MonRectangle..Hauteur = nMaLargeurRectangle *3 SINON MonRectangle..Largeur = nMaHauteurRectangle *3 MonRectangle..Hauteur = nMaHauteurRectangle *3 FIN
nMonEmplacementX est un entier = 200 nMonEmplacementY est un entier = 200
xMonRetourX est un numérique xMonRetoury est un numérique
MonXLePlusPetit est un numérique MonXLePlusGrand est un numérique MonYLePlusPetit est un numérique MonYLePlusGrand est un numérique
dDébutDessin(MonRectangle,dEffacer)
dRectangle(MonRectangle,nMaLargeurRectangle,nMaHauteurRectangle,nMaLargeurRectangle*2,nMaHauteurRectangle*2,RougePastel,Noir)
dCopie(MonRectangle,MonImage,nMaLargeurRectangle,nMaHauteurRectangle,nMaLargeurRectangle+1,nMaHauteurRectangle+1,nMonEmplacementX,nMonEmplacementY,nMaLargeurRectangle,nMaHauteurRectangle)
dDébutDessin(MonRectangle,dEffacer)
dRectangle(MonRectangle,nMaLargeurRectangle,nMaHauteurRectangle,nMaLargeurRectangle*2,nMaHauteurRectangle*2,BleuPastel,Noir) dTexte(MonRectangle,nMaLargeurRectangle+2,nMaHauteurRectangle+2,"Salut")
dRotation(MonRectangle,MonAngleDeRotation,nMaLargeurRectangle + nMaLargeurRectangle/2, nMaHauteurRectangle+nMaHauteurRectangle/2,drSansAgrandissement)
(xMonRetourX,xMonRetoury) = CalculNouvelleCoordonéeAprèsRotation(nMaLargeurRectangle,nMaHauteurRectangle,nMaLargeurRectangle+nMaLargeurRectangle/2,nMaHauteurRectangle+nMaHauteurRectangle/2,MonAngleDeRotation)
xMaPosXCalculée, xMaPosYCalculée sont des numériques
SI xMonRetourX > MonXLePlusPetit _ET_ xMonRetoury = MonYLePlusPetit ALORS xMaPosXCalculée = nMonEmplacementX - (xMonRetourX - MonXLePlusPetit) xMaPosYCalculée = nMonEmplacementY SINON SI xMonRetourX = MonXLePlusPetit _ET_ xMonRetoury > MonYLePlusPetit xMaPosXCalculée = nMonEmplacementX xMaPosYCalculée = nMonEmplacementY - (xMonRetoury-MonYLePlusPetit) SINON SI xMonRetourX > MonXLePlusPetit _ET_ xMonRetoury > MonYLePlusPetit xMaPosYCalculée = nMonEmplacementY - (xMonRetoury-MonYLePlusPetit) xMaPosXCalculée = nMonEmplacementX - (xMonRetourX - MonXLePlusPetit) SINON xMaPosXCalculée = nMonEmplacementX xMaPosYCalculée = nMonEmplacementY FIN
dCopie(MonRectangle,MonImage,MonXLePlusPetit,MonYLePlusPetit,MonXLePlusGrand-MonXLePlusPetit,MonYLePlusGrand-MonYLePlusPetit,xMaPosXCalculée,xMaPosYCalculée,MonXLePlusGrand-MonXLePlusPetit,MonYLePlusGrand-MonYLePlusPetit)
IMG_SansNom1 = MonImage
PROCEDURE INTERNE CalculNouvelleCoordonéeAprèsRotation(nP1_X est un entier, nP1_Y est un entier, nPRot_X est un entier, nProt_Y est un entier, nMonAngle est un entier) nP2_x , nP2_Y sont des numériques nLongeurX, nLongeurY sont des entiers nLongeurX = nP1_X - nPRot_X nLongeurY = nP1_Y - nProt_Y nP2_x = nLongeurX * Cosinus(nMonAngle) + -nLongeurY * Sinus(nMonAngle) + nPRot_X nP2_Y = nLongeurX * Sinus(nMonAngle) + nLongeurY * Cosinus(nMonAngle) + nProt_Y MonXLePlusPetit = nP2_x MonXLePlusGrand = nP2_x MonYLePlusPetit = nP2_Y MonYLePlusGrand = nP2_Y SI MonXLePlusPetit > nLongeurX * Cosinus(nMonAngle) + nLongeurY * Sinus(nMonAngle) + nPRot_X ALORS Monxlepluspetit = nLongeurX * Cosinus(nMonAngle) + nLongeurY * Sinus(nMonAngle) + nPRot_X SI MonXLePlusPetit > -nLongeurX * Cosinus(nMonAngle) + nLongeurY * Sinus(nMonAngle) + nPRot_X ALORS Monxlepluspetit = -nLongeurX * Cosinus(nMonAngle) + nLongeurY * Sinus(nMonAngle) + nPRot_X SI MonXLePlusPetit > -nLongeurX * Cosinus(nMonAngle) + -nLongeurY * Sinus(nMonAngle) + nPRot_X ALORS Monxlepluspetit = -nLongeurX * Cosinus(nMonAngle) + -nLongeurY * Sinus(nMonAngle) + nPRot_X SI MonXLePlusGrand < nLongeurX * Cosinus(nMonAngle) + nLongeurY * Sinus(nMonAngle) + nPRot_X ALORS MonXLePlusGrand = nLongeurX * Cosinus(nMonAngle) + nLongeurY * Sinus(nMonAngle) + nPRot_X SI MonXLePlusGrand < -nLongeurX * Cosinus(nMonAngle) + nLongeurY * Sinus(nMonAngle) + nPRot_X ALORS MonXLePlusGrand = -nLongeurX * Cosinus(nMonAngle) + nLongeurY * Sinus(nMonAngle) + nPRot_X SI MonXLePlusGrand < -nLongeurX * Cosinus(nMonAngle) + -nLongeurY * Sinus(nMonAngle) + nPRot_X ALORS MonXLePlusGrand = -nLongeurX * Cosinus(nMonAngle) + -nLongeurY * Sinus(nMonAngle) + nPRot_X SI MonYLePlusPetit > nLongeurX * Sinus(nMonAngle) + -nLongeurY * Cosinus(nMonAngle) + nProt_Y ALORS MonYLePlusPetit = nLongeurX * Sinus(nMonAngle) + -nLongeurY * Cosinus(nMonAngle) + nProt_Y SI MonYLePlusPetit > -nLongeurX * Sinus(nMonAngle) + nLongeurY * Cosinus(nMonAngle) + nProt_Y ALORS MonYLePlusPetit = -nLongeurX * Sinus(nMonAngle) + nLongeurY * Cosinus(nMonAngle) + nProt_Y SI MonYLePlusPetit > -nLongeurX * Sinus(nMonAngle) + -nLongeurY * Cosinus(nMonAngle) + nProt_Y ALORS MonYLePlusPetit = -nLongeurX * Sinus(nMonAngle) + - nLongeurY * Cosinus(nMonAngle) + nProt_Y SI MonYLePlusGrand < nLongeurX * Sinus(nMonAngle) + -nLongeurY * Cosinus(nMonAngle) + nProt_Y ALORS MonYLePlusGrand = nLongeurX * Sinus(nMonAngle) + -nLongeurY * Cosinus(nMonAngle) + nProt_Y SI MonYLePlusGrand < -nLongeurX * Sinus(nMonAngle) + nLongeurY * Cosinus(nMonAngle) + nProt_Y ALORS MonYLePlusGrand = -nLongeurX * Sinus(nMonAngle) + nLongeurY * Cosinus(nMonAngle) + nProt_Y SI MonYLePlusGrand < -nLongeurX * Sinus(nMonAngle) + -nLongeurY * Cosinus(nMonAngle) + nProt_Y ALORS MonYLePlusGrand = -nLongeurX * Sinus(nMonAngle) + -nLongeurY * Cosinus(nMonAngle) + nProt_Y
RENVOYER (nP2_x,nP2_Y) FIN
En espérant qu'il soit utile à quelqu'un par la suite, le code n'est pas encore des plus propre... (Qui à dit pas du tout ????)
Si j'y pense, une fois épuré et commenté correctement, je viendrais le poster ici.
En attendant, je reste volontiers à votre écoute pour toute améliorations et/ou conseils. |
| |
| |
| | | |
|
| | | | |
| | |
|