Rotation d'objet [Résolu]

LaTatadu91 968 Messages postés jeudi 20 mai 2004Date d'inscription 26 avril 2013 Dernière intervention - 20 févr. 2008 à 11:44 - Dernière réponse : LaTatadu91 968 Messages postés jeudi 20 mai 2004Date d'inscription 26 avril 2013 Dernière intervention
- 21 févr. 2008 à 14:17
Bonjour,
suite à un problème pour tracer des rectangles de manière oblique
je me demande si il n'existe pas une fonction permettant la rotation d'un objet
dans mon cas un rectangle!
ce qui me permettrait de tracer des rectangles avec un certain angle car je n'a&rrive a tracer des rectangles que verticalement et horizontalement!

 
Afficher la suite 

24 réponses

Répondre au sujet
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 21 févr. 2008 à 10:21
+3
Utile
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
Dim RectW As Single = 90.0F
Dim RectH As Single = 40.0F
Dim CircleDiam As Single = 100.0F
Dim CircleCenterX As Single = 175.0F
Dim CircleCenterY As Single = 175.0F

'# On dessine le cercle
e.Graphics.DrawEllipse(Pens.Red, CircleCenterX - CircleDiam / 2.0F, CircleCenterX - CircleDiam / 2.0F, CircleDiam, CircleDiam)

'# On reinitialise les transformations (sinon, elle s'accumuleraient)
e.Graphics.ResetTransform()
'# On place le centre du repère au centre du cercle
e.Graphics.TranslateTransform(CircleCenterX, CircleCenterY)
'# On tourne le repère
e.Graphics.RotateTransform(45)
'# On dessine notre rectangle, en centrant les diagonales de celui-ci sur le centre du cercle
e.Graphics.DrawRectangle(Pens.Black, -RectW / 2.0F, -RectH / 2.0F, RectW, RectH)

'# On dessine le repère, ca pourra t'aider a comprendre le phénomène...
e.Graphics.DrawLine(Pens.DarkBlue, -100, 0, 100, 0)
e.Graphics.DrawLine(Pens.DarkBlue, 0, -100, 0, 100)
End Sub
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Renfield
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 21 févr. 2008 à 11:52
+3
Utile
Public Class Form1
Dim RectW As Single = 90.0F
Dim RectH As Single = 40.0F
Dim CircleDiam As Single = 100.0F
Dim CircleCenterX As Single = 175.0F
Dim CircleCenterY As Single = 175.0F
Dim DrawingMatrix As Drawing2D.Matrix
Dim Rect As Rectangle = New Rectangle(-RectW / 2.0F, -RectH / 2.0F, RectW, RectH)

Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
Dim pts As Point()
Dim InvMatrix As Drawing2D.Matrix
ReDim pts(0)
If (DrawingMatrix) IsNot Nothing Then
'# On récupère la matrix inverse :
'# on souhaite transposer les coordonnées de la souris depuis le repère graphique vers les coordonnées classiques
InvMatrix = DrawingMatrix.Clone
InvMatrix.Invert()
'# Transposition des coordonnées
pts(0) = e.Location
InvMatrix.TransformPoints(pts)

'# Le contains fonctionne désormais
If Rect.Contains(pts(0)) Then
Me.Text = "In"
Else
Me.Text = "Out"
End If
End If
End Sub

Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
'# On dessine le cercle
e.Graphics.DrawEllipse(Pens.Red, CircleCenterX - CircleDiam / 2.0F, CircleCenterX - CircleDiam / 2.0F, CircleDiam, CircleDiam)

'# On reinitialise les transformations (sinon, elle s'accumuleraient)
e.Graphics.ResetTransform()
'# On place le centre du repère au centre du cercle
e.Graphics.TranslateTransform(CircleCenterX, CircleCenterY)
'# On tourne le repère
e.Graphics.RotateTransform(45)
'# On dessine notre rectangle, en centrant les diagonales de celui-ci sur le centre du cercle
e.Graphics.DrawRectangle(Pens.Black, Rect)

'# On dessine le repère, ca pourra t'aider a comprendre le phénomène...
e.Graphics.DrawLine(Pens.DarkBlue, -100, 0, 100, 0)
e.Graphics.DrawLine(Pens.DarkBlue, 0, -100, 0, 100)

'# On enregistre la matrice de transformation
DrawingMatrix = e.Graphics.Transform
End Sub
End Class
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Renfield
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 20 févr. 2008 à 12:17
0
Utile
tu peu faire un rotate transform je crois de ton objet graphics
Commenter la réponse de Renfield
LaTatadu91 968 Messages postés jeudi 20 mai 2004Date d'inscription 26 avril 2013 Dernière intervention - 20 févr. 2008 à 13:01
0
Utile
de mon objet graphics? donc du dessin entier?
car mon but est de faire une rotation simple de plusieurs rectangles dans un cercle...et pas une rotation entiere du cercle!

un peu comme une montre qui aurait plusieurs aiguilles qui evolueraient

 
Commenter la réponse de LaTatadu91
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 20 févr. 2008 à 14:00
0
Utile
soit tu joues avec la trigo de base du collège.
soit tu fais un changement de ton repère...

ca influera sur ce qui VA ETRE dessiné
ca n'impactera pas ce qui a deja été dessiné.
Commenter la réponse de Renfield
LaTatadu91 968 Messages postés jeudi 20 mai 2004Date d'inscription 26 avril 2013 Dernière intervention - 20 févr. 2008 à 15:55
0
Utile
en fait je n'ai pas de rectangle , je n'arrive pas a en tracer des rectangles en oblique

donc j'ai des lignes mais ce ne sont pas des objets donc je ne peux pas les reconnaitre en tant que tel ...

 
Commenter la réponse de LaTatadu91
waspy59 190 Messages postés mercredi 24 novembre 2004Date d'inscription 15 mai 2013 Dernière intervention - 20 févr. 2008 à 21:30
0
Utile
et avec un truc du genre:

e.Graphics.ResetTransform()
e.Graphics.TranslateTransform(CoordonnéesX, CoordonnéesY)
e.Graphics.RotateTransform(AngleRotation)
e.Graphics.DrawRectangle(Pens.Black, 0, 0, Longueur, Largeur)

Avec ca tu dessines un rectangle (non plein) de dimension Longueur et Largeur, aux coordonnées X et Y avec un angle de rotation de....

C'est ca que tu cherches as faire?
Commenter la réponse de waspy59
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 21 févr. 2008 à 04:26
0
Utile
au pire, si on applique les même transformations  au point, il sera dans le même repère que le rectangle... .contains porrait fonctionner.

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Commenter la réponse de Renfield
LaTatadu91 968 Messages postés jeudi 20 mai 2004Date d'inscription 26 avril 2013 Dernière intervention - 21 févr. 2008 à 09:30
0
Utile
Bon je m'en rapproche ,
mais j'ai besoin de savoir quelle origine est prise pour la rotation?
car mes rectangles bougents effectivement mais j'aimerais que l'angle de rotation se fasse à partir du centre de mon cercle en fait!

merci encore de votre aide a vous deux!

 
Commenter la réponse de LaTatadu91
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 21 févr. 2008 à 09:57
0
Utile
Je t'avais deja indiqué rotatetransform... le plus simple reste surement de lire la doc.
http://msdn2.microsoft.com/fr-fr/library/a0z3f662.aspx

dans l'exemple de waspy59, le centre de rotation (CoordonnéesX, CoordonnéesY)

Après, une fois ta matrice mise au point, tu peut utiliser la méthode TransformPoints de ton objet Graphics pour passer les coordonnées d'un repere a l'autre
Commenter la réponse de Renfield
LaTatadu91 968 Messages postés jeudi 20 mai 2004Date d'inscription 26 avril 2013 Dernière intervention - 21 févr. 2008 à 10:03
0
Utile
la effectivement j'arrive a faire des rotations a partir du point X,Y qui est le coin haut gauche de mon rectangle
moi je voudrais tracer un rectangle avec pour coordonnées ces memes X,Y mais la rotation  a partir d'un autre point (origine de mon cercle)
est ce possible?

je vais lire ta doc sur rotate transform , merci....

 
Commenter la réponse de LaTatadu91
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 21 févr. 2008 à 10:23
0
Utile
tu etais en fait partie d'un mauvais concept.

les methodes transform modifient le repère de ta surface de dessin.
il s'agit donc simplement de centrer le repère au niveau du centre du cercle, d'effectuer la rotation souhaitée
et ensuite, dessiner le rectangle comme si de rien n'était... en centrant le rectangle au point 0,0 : le centre du cercle
Commenter la réponse de Renfield
LaTatadu91 968 Messages postés jeudi 20 mai 2004Date d'inscription 26 avril 2013 Dernière intervention - 21 févr. 2008 à 10:24
0
Utile
j'en suis la :

graph_pdt(nn_pdt(n_fur)).ResetTransform()
      origine.X = Fce_x_pix(0) + Fur_lgt_pix(0) / 2
      origine.Y = Fce_y_pix(0) + Fur_lgt_pix(0) / 2
      graph_pdt(nn_pdt(n_fur)).TranslateTransform(X_1, Y_1)
      graph_pdt(nn_pdt(n_fur)).RotateTransform(R_TOP.sP_HMI.s_pcha(n_fur).s_1pdt(nn_pdt(n_fur)).pdt.angle_cha)
      ' Get temperature color                               
      c = R_TOP.Trans_VC(R_TOP.sP_HMI.s_pcha(0).s_1pdt(nn_pdt(n_fur)).pdt.T_tmp_avg)
      ColorT = Color.FromArgb(R_TOP.red(c), R_TOP.green(c), R_TOP.blue(c))
      If (R_TOP.red(c) + R_TOP.green(c) + R_TOP.blue(c)) > 400 Then
         color1 = Color.Black
      Else
         color1 = Color.White
      End If
      Dim pdt_font_brush As New SolidBrush(color1)
      Dim pdt_SolidBrush As New SolidBrush(ColorT)
      graph_pdt(nn_pdt(n_fur)).FillRectangle(pdt_SolidBrush, 0, 0, R_TOP.sP_HMI.s_pcha(n_fur).s_1pdt(nn_pdt(n_fur)).pdt.lgt * RatioX(0), R_TOP.sP_HMI.s_pcha(n_fur).s_1pdt(nn_pdt(n_fur)).pdt.wid * RatioX(0))
      graph_pdt(nn_pdt(n_fur)).DrawRectangle(Pens.Black, 0, 0, R_TOP.sP_HMI.s_pcha(n_fur).s_1pdt(nn_pdt(n_fur)).pdt.lgt * RatioX(0), R_TOP.sP_HMI.s_pcha(n_fur).s_1pdt(nn_pdt(n_fur)).pdt.wid * RatioX(0))

avec X_1 et Y_1 qui sont les coordonnées du coin haut gauche du rectangle ....
si dans la fonction : graph_pdt(nn_pdt(n_fur)).TranslateTransform(X_1, Y_1) je met a la place des coordonnées X,Y du rectangle les coordonnées X,Y de l'origine de mon cercle, et qu'ensuite a la place de DrawRectangle(Pens.Black, 0, 0,...) je mets DrawRectangle(Pens.Black, X1, Y1,

ben ca marche pas mais pourtant c'est sensiblement ce que je veux faire.....tu vois?

 
Commenter la réponse de LaTatadu91
LaTatadu91 968 Messages postés jeudi 20 mai 2004Date d'inscription 26 avril 2013 Dernière intervention - 21 févr. 2008 à 10:31
0
Utile
oki j'ai bien compris ton prog, le truc c'est que moi je ne veux pas que mes rectangles soient collés au centre du cercle,
dommage que je ne puisse aps te faire de dessin...

en gros j'ai mon cercle qui est assez large  et mon rectangle est placé sur un rayon mais  n'a pas pour coordonnées 0,0,  mais Rayon - distance donnée dans SGBD,

 
Commenter la réponse de LaTatadu91
LaTatadu91 968 Messages postés jeudi 20 mai 2004Date d'inscription 26 avril 2013 Dernière intervention - 21 févr. 2008 à 10:39
0
Utile
c'est bon j'ai trouver en fait comme mon origine de repere a changer mes valeurs X1 et Y1 étaient trop grandes il fallait refaire le calcul avec le nouveau repere
et HOP c'est du tout beau merci, je t'aime !!!

 
Commenter la réponse de LaTatadu91
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 21 févr. 2008 à 10:40
0
Utile
ok, ravi de voir que ca fonctionne.

je pense que de pouvoir visualiser le repère t'a aidée.

en fait, il faut oublier la rotation, elle ne compte pas.
tout ce que tu as a faire, c'est placer ton rectangle comme tu le souhaite.
Commenter la réponse de Renfield
LaTatadu91 968 Messages postés jeudi 20 mai 2004Date d'inscription 26 avril 2013 Dernière intervention - 21 févr. 2008 à 11:28
0
Utile
je reviens à la charge car effectivement mon desin est parfait maintenant c'est vraiment top, mais en fait tous mes rectangles sont définis de la meme maniere puis on leur fait faire une rotation!

donc si je clique sur un rectangle qui est a 180° ben pour lui :
 Contains renvoie donc false ...
c'est triste!!!

y'a t'il moyen de récupérer les nouvelles coordonnées de mes rectangles apres rotation ?

 
Commenter la réponse de LaTatadu91
LaTatadu91 968 Messages postés jeudi 20 mai 2004Date d'inscription 26 avril 2013 Dernière intervention - 21 févr. 2008 à 11:38
0
Utile
en fait forcément comme je trace tjrs le meme rectangle auquel je fais subir différentes rotations et qu'en plus je suis dans un repere différent de celui de depart, qui est aussi celui de la souris
ben tout ceci fait que lorsque je clique sur mes rectangles ben contains me renvoit FALSE...

 
Commenter la réponse de LaTatadu91
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 21 févr. 2008 à 11:44
0
Utile
te faut transposer les coordonnées depuis le repère vers le repère de windows (utilisé avec les coordonnées de la souris)
Commenter la réponse de Renfield
LaTatadu91 968 Messages postés jeudi 20 mai 2004Date d'inscription 26 avril 2013 Dernière intervention - 21 févr. 2008 à 11:51
0
Utile
oui en fait c'est possible d'avoir les coordonnées X,Y  du coin en haut a gauche mais
si ton rectangle à un angle de 45° par exemple, comment connaitre son height et width?

en fait si je recalcule mes coordonnées XY et que je garde mon width et height il va prendre des rectangles tous horizontaux !
malheureusement....

tu vois ce que je veux dire?

 
Commenter la réponse de LaTatadu91

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

rotation d'objet - page 2