2012-04-18 13 views
6

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í es un poco de código:Usando una matriz para rotar rectángulos individualmente

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 puedo rotar (lo que creo que debe ser r1) tanto R1 y R2 giran. Necesito poder rotar cada forma individualmente a medida que agrego más formas.

Respuesta

25

me gustaría utilizar 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(); 
    } 
} 

Se utiliza una matriz para llevar a cabo la rotación en un punto determinado, que debe ser el centro de cada rectángulo.

Luego, en el método de pintura, lo utilizan para sacar sus rectá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); 

Además, aquí es la línea para conectar las dos rectá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)); 

El uso de estos ajustes:

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

resultado en:

enter image description here

+1

Gracias. El ejemplo realmente ayudó. Descubrí que solo me faltaba el "g.ResetTransform();" llamada. Una vez que logré colocarlo, derribé mi pared y volví a la pista. Muchas gracias! – Orthmius