2012-04-18 32 views
6

Có một chút biến chứng vẽ mà bạn sẽ gọi nó. Toán học của tôi hơi bị gỉ khi nói đến Ma trận và vẽ các hình tròn. Dưới đây là một chút mã:Sử dụng ma trận để xoay hình chữ nhật riêng lẻ

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

khi tôi xoay (điều tôi nghĩ là r1) cả xoay r1 và r2. Tôi cần có khả năng xoay từng hình dạng riêng lẻ khi tôi thêm nhiều hình dạng.

Trả lời

25

Tôi sẽ sử dụng một chức năng tương tự như sau:

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

Nó sử dụng một ma trận để thực hiện luân phiên tại một điểm nhất định, mà nên là giữa mỗi hình chữ nhật.

Sau đó, trong phương pháp sơn của bạn, sử dụng nó để vẽ hình chữ nhật của bạn:

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

Ngoài ra, đây là dòng để kết nối hai hình chữ nhật:

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

Sử dụng các thiết lập này:

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

dẫn đến:

enter image description here

+1

Cảm ơn bạn. Ví dụ thực sự hữu ích. Tôi thấy tôi chỉ thiếu "g.ResetTransform();" gọi điện. Một khi tôi nhận được nó đặt nó rơi xuống tường của tôi và trở lại theo dõi. Cảm ơn bạn rất nhiều! – Orthmius

Các vấn đề liên quan