2012-04-18 10 views
6

Po odrobinie komplikacji rysunku nazwałbyś to. Moja matematyka jest nieco zardzewiała, jeśli chodzi o Matryce i rysowanie rotacji kształtów. Oto fragment kodu:Używanie macierzy do obracania prostokątów pojedynczo

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

kiedy obracać (co myślę powinny być R1), oba R1 i R2 obracać. Muszę być w stanie obracać każdy kształt indywidualnie, dodając kolejne kształty.

Odpowiedz

25

byłoby użyć funkcję podobną do tej:

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

Wykorzystuje ona macierz wykonywać ruch obrotowy w pewnym punkcie, który powinien być w środku każdego prostokąta.

Następnie w metodzie farby, należy ją zwrócić prostokąty:

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

Również tutaj jest linia do łączenia dwóch prostokątów:

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

Stosując te ustawienia:

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

w wyniku czego:

enter image description here

+1

Dziękuję. Przykład naprawdę pomógł. Odkryłem, że brakuje mi tylko "g.ResetTransform();" połączenie. Kiedy już to zrobiłem, powaliłem moją ścianę i Powrót na tor. Dziękuję bardzo! – Orthmius

Powiązane problemy