PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Fonction de Dessin trouver les coordonnées suite à une rotation
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.

//Déclaration des variables de type image
//
MonRectangle est une Image
MonImage est une Image

//Déclarations des variables propre au rectangle à dessiner (Changement de taille ici)
nMaLargeurRectangle est un entier = 180
nMaHauteurRectangle est un entier = 100
MonAngleDeRotation est un entier = 45


//Déclaration Des tailles des variables images
nMaLargeurImage est un entier = 800
nMaHauteurImage est un entier = 600
MonImage..Hauteur = nMaHauteurImage
MonImage..Largeur = nMaLargeurImage
MonRectangle..Largeur = nMaLargeurRectangle + 5//Ajout de 5pix pour dessiner correctement le rectangle
MonRectangle..Hauteur = nMaHauteurRectangle + 5//Ajout de 5pix pour dessiner correctement le rectangle

//Emplacement X et Y du dessin du carré (Haut/Gauche)
nMonEmplacementX est un entier = 100
nMonEmplacementY est un entier = 100

// Variable pour le Calcul du décalage X
rMonRetourDeProc est un réel



// Ouvre en mode dessin la variable rectangle
dDébutDessin(MonRectangle,dEffacer)
//Dessine le rectangle
dRectangle(MonRectangle,0,0,nMaLargeurRectangle,nMaHauteurRectangle,RougePastel,Noir)
//Copie le rectangle (Celui avec une rotation de 0°)
dCopie(MonRectangle,MonImage,0,0,MonRectangle.Largeur,MonRectangle.Hauteur,nMonEmplacementX,nMonEmplacementY,MonRectangle.Largeur,MonRectangle.Hauteur)
//Efface le rectangle dans la variable image
dDébutDessin(MonRectangle,dEffacer)
//Dessine le rectangle qui va devoir être tourner
dRectangle(MonRectangle,0,0,nMaLargeurRectangle,nMaHauteurRectangle,BleuPastel,Noir)
//Effectue la rotation du rectangle avec un centre de gravité au centre de l'image (Logiquement ?????)
dRotation(MonRectangle,MonAngleDeRotation,drDéfaut)
//Calcul le décalage X
rMonRetourDeProc = CalculX(0,0,MonRectangle.Largeur/2,MonRectangle.Hauteur/2,MonAngleDeRotation)
//Copie le rectangle en appliquant le décalage calculé
dCopie(MonRectangle,MonImage,0,0,MonRectangle.Largeur,MonRectangle.Hauteur,nMonEmplacementX - rMonRetourDeProc ,nMonEmplacementY,MonRectangle.Largeur,MonRectangle.Hauteur)
//Affiche mon dessin dans le champ image
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)
// Basé sur la formule : (Xa - Xg) * Cos(Angle) - (Ya - Yg) * Sin(Angle) + Xg
// Ou :
//Xa = X du point de base (Haut Gauche du rectangle)
//Xg = X du point de gravité (Centre de rotation)
//Ya = Y du point de base (Haut Gauche du rectangle)
//Yg = Y du point de gravité (Centre de rotation)
//Angle = l'angle de rotation
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ème
Message 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..... :p

Voici le code fonctionnel :

MonRectangle est une Image
MonImage est une Image

//Déclarations des variables propre au rectangle à dessiner (Changement de taille ici)
nMaLargeurRectangle est un entier = 150
nMaHauteurRectangle est un entier = 220
MonAngleDeRotation est un entier =72


//Déclaration Des tailles des variables images
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


//Emplacement X et Y du dessin du carré (Haut/Gauche)
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


// Ouvre en mode dessin la variable rectangle
dDébutDessin(MonRectangle,dEffacer)
//Dessine le rectangle
dRectangle(MonRectangle,nMaLargeurRectangle,nMaHauteurRectangle,nMaLargeurRectangle*2,nMaHauteurRectangle*2,RougePastel,Noir)

//Copie le rectangle (Celui avec une rotation de 0°)
dCopie(MonRectangle,MonImage,nMaLargeurRectangle,nMaHauteurRectangle,nMaLargeurRectangle+1,nMaHauteurRectangle+1,nMonEmplacementX,nMonEmplacementY,nMaLargeurRectangle,nMaHauteurRectangle)

//Efface le rectangle dans la variable image
dDébutDessin(MonRectangle,dEffacer)
//Dessine le rectangle qui va devoir être tourner
dRectangle(MonRectangle,nMaLargeurRectangle,nMaHauteurRectangle,nMaLargeurRectangle*2,nMaHauteurRectangle*2,BleuPastel,Noir)
dTexte(MonRectangle,nMaLargeurRectangle+2,nMaHauteurRectangle+2,"Salut")
//Effectue la rotation du rectangle avec un centre de gravité au centre de l'image (Logiquement ?????)
dRotation(MonRectangle,MonAngleDeRotation,nMaLargeurRectangle + nMaLargeurRectangle/2, nMaHauteurRectangle+nMaHauteurRectangle/2,drSansAgrandissement)
//Calcul le décalage X
(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.