2012-04-18 2 views
6

Mit ein bisschen Zeichnung Komplikation würden Sie es nennen. Meine Mathe ist ein bisschen rostig, wenn es um Matrizen und Zeichendrehungen auf Formen geht. Hier ist ein Stück Code:Verwenden einer Matrix, um Rechtecke einzeln zu drehen

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

wenn ich drehen (was ich denke, sollte r1 sein), die beide R1 und R2 drehen. Ich muss in der Lage sein, jede Form einzeln zu drehen, wenn ich weitere Formen hinzufüge.

Antwort

25

würde ich eine ähnliche Funktion wie folgt verwenden:

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

es eine Matrix verwendet, die Drehung zu einem bestimmten Zeitpunkt durchzuführen, die der Mitte eines jeden Rechtecks ​​sein sollte.

Dann in Ihrer Farbe Methode, es verwenden, um Ihre Rechtecke zu zeichnen:

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

Auch hier ist die Linie, die die beiden Rechtecke zu verbinden:

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

diese Einstellungen verwenden:

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

resultierte in:

enter image description here

+1

Vielen Dank. Das Beispiel hat mir sehr geholfen. Ich fand, dass ich nur die "g.ResetTransform()" vermisste; Anruf. Sobald ich es bekommen habe, hat es meine Wand umgeworfen. Ich danke dir sehr! – Orthmius

Verwandte Themen