Using a matrix to rotate rectangles alternately

You have a bit of difficulty with the drawings that you would call. My math is a little rusty when it comes to Matrisov and draws turns on shapes. Here is some code:

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

when I rotate (which, it seems to me, should be r1), both r1 and r2 rotate. I need to be able to rotate each shape individually when I add more shapes.

+7
source share
1 answer

I would use a function like this:

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

It uses a matrix to rotate at a specific point, which should be in the middle of each rectangle.

Then in your drawing method use it to draw your rectangles:

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

In addition, here is a line for connecting two rectangles:

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

Using these settings:

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

Led to:

enter image description here

+25
source

Source: https://habr.com/ru/post/913529/


All Articles