Usando uma matriz para girar retângulos individualmente

Tendo um pouco de complicação de desenho, você chamaria isso. Minha matemática é um pouco enferrujada quando se trata de matrizes e rotações de desenho em formas. Aqui está um pouco 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; } 

quando eu girar (o que eu acho que deveria ser r1), ambos r1 e r2 rotacionam. Eu preciso ser capaz de girar cada forma individualmente conforme eu adiciono mais formas.

Eu usaria uma function semelhante a esta:

 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(); } } 

Ele usa uma matriz para executar a rotação em um certo ponto, que deve ser o meio de cada retângulo.

Em seguida, no seu método de pintura, use-o para desenhar seus retângulos:

 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); 

Além disso, aqui está a linha para conectar os dois retângulos:

 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 configurações:

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

resultou em:

insira a descrição da imagem aqui