Usando una matriz para rotar rectangularjs individualmente

Teniendo un poco de complicación de dibujo lo llamarías. Mi matemática está un poco oxidada cuando se trata de Matrices y dibujar rotaciones en las formas. Aquí hay un poco de código:

private void Form1_Paint(object sender, PaintEventArgs e) { g = e.Graphics; g.SmoothingMode = SmoothingMode.HighQuality; DoRotation(e); g.DrawRectangle(new Pen(Color.Black), r1); g.DrawRectangle(new Pen(Color.Black), r2); // draw a line (PEN, CenterOfObject(X, Y), endpoint(X,Y) ) g.DrawLine(new Pen(Color.Black), new Point((r1.X + 50), (r1.Y + 75)), new Point((/*r1.X + */50), (/*r1.Y - */25))); this.lblPoint.Text = "X-pos: " + r1.X + " Y-pos: " + r1.Y; //this.Invalidate(); } public void DoRotation(PaintEventArgs e) { // move the rotation point to the center of object e.Graphics.TranslateTransform((r1.X + 50), (r1.Y + 75)); //rotate e.Graphics.RotateTransform((float)rotAngle); //move back to the top left corner of the object e.Graphics.TranslateTransform(-(r1.X + 50), -(r1.Y + 75)); } public void Form1_KeyDown(object sender, KeyEventArgs e) { case Keys.T: rotAngle += 1.0f; } 

cuando giro (lo que creo que debería ser r1), tanto r1 como r2 giran. Necesito poder rotar cada forma individualmente a medida que agrego más formas.

Yo usaría una función similar a esto:

 public void RotateRectangle(Graphics g, Rectangle r, float angle) { using (Matrix m = new Matrix()) { m.RotateAt(angle, new PointF(r.Left + (r.Width / 2), r.Top + (r.Height / 2))); g.Transform = m; g.DrawRectangle(Pens.Black, r); g.ResetTransform(); } } 

Utiliza una matriz para realizar la rotación en un cierto punto, que debe ser el medio de cada rectángulo.

Luego, en su método de pintura, úselo para dibujar sus rectangularjs:

 g.SmoothingMode = SmoothingMode.HighQuality; //g.DrawRectangle(new Pen(Color.Black), r1); //DoRotation(e); //g.DrawRectangle(new Pen(Color.Black), r2); RotateRectangle(g, r1, 45); RotateRectangle(g, r2, 65); 

Además, aquí está la línea para conectar los dos rectangularjs:

 g.DrawLine(Pens.Black, new Point(r1.Left + r1.Width / 2, r1.Top + r1.Height / 2), new Point(r2.Left + r2.Width / 2, r2.Top + r2.Height / 2)); 

Usando estas configuraciones:

 private Rectangle r1 = new Rectangle(100, 60, 32, 32); private Rectangle r2 = new Rectangle(160, 100, 32, 32); 

resultó en:

enter image description here