LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 2013
-
20 févr. 2008 à 11:44
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 2013
-
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!
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 21 févr. 2008 à 10:21
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
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 21 févr. 2008 à 11:52
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
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 20131 20 févr. 2008 à 13:01
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 20131 21 févr. 2008 à 09:30
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!
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
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 20131 21 févr. 2008 à 10:03
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....
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 21 févr. 2008 à 10:23
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
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 20131 21 févr. 2008 à 10:24
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?
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 20131 21 févr. 2008 à 10:31
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,
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 20131 21 févr. 2008 à 10:39
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 !!!
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 20131 21 févr. 2008 à 11:28
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 ?
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 20131 21 févr. 2008 à 11:38
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...
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 20131 21 févr. 2008 à 11:51
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....