2013-07-03 88 views
1

我有一個我想要旋轉的矩形。旋轉矩形的點位置

我只有矩形的一個點(鼠標位置),矩形的長度和寬度以及旋轉的角度。現在我需要矩形的其他三個角的位置,以便我可以使用Graphics.DrawPolygon()輕鬆繪製我的矩形。

我不知道,因爲我沒有好幾年的數學和需要你的幫助:d

我試圖從互聯網,但沒有許多解決方案真正適合我的問題。

+0

*旋轉*和*矩形繪製*之間的關係是什麼?並圍繞什麼*中心點*旋轉? – Tigran

+0

有1個矩形和1個文本框或類似的地方,用戶必須寫入旋轉的角度..矩形重新繪製新的位置..中心點是鼠標位置(矩形的中心或左上角的矩形(還不能決定))..爲此,我需要的位置的角落..所以3或4 x和y – Todeshuegel

+0

因此,你創建* always * traignle對齊到某些特定軸/表面,說X軸。一次繪製,應用所需的旋轉角度指定點。 – Tigran

回答

2

下面的課程是你正在尋找的。作爲參考,看看旋轉如何工作:http://en.wikipedia.org/wiki/Rotation_matrix

public class MyRectangle 
{ 
    public double Length { get; set; } 
    public double Width { get; set; } 
    public double Rotation { get; private set; } 
    public Coord Center { get; private set; } 
    public Coord TopLeft { get; private set; } 
    public Coord TopRight { get; private set; } 
    public Coord BottomLeft { get; private set; } 
    public Coord BottomRight { get; private set; } 

    public MyRectangle(Coord origin, double length, double width) 
    { 
     Length = length; 
     Width = width; 
     Center = origin; 

     BottomLeft = new Coord(Center.X - Width/2, Center.Y - Length/2); 
     BottomRight = new Coord(Center.X + Width/2, Center.Y - Length/2); 
     TopLeft = new Coord(Center.X - Width/2, Center.Y + Length/2); 
     TopRight = new Coord(Center.X + Width/2, Center.Y + Length/2); 
    } 

    private void Move(Coord c) 
    { 

     InitCorners(new Coord((c.X - Center.X), (c.Y - Center.Y))); 
     Center.X = Center.X + (c.X - Center.X); 
     Center.Y = Center.Y + (c.Y - Center.Y); 
    } 

    private void InitCorners(Coord c) 
    { 
     BottomRight.X = (BottomRight.X + c.X); 
     BottomRight.Y = (BottomRight.Y + c.Y); 

     BottomLeft.X = (BottomLeft.X + c.X); 
     BottomLeft.Y = (BottomLeft.Y + c.Y); 

     TopRight.X = (TopRight.X + c.X); 
     TopRight.Y = (TopRight.Y + c.Y); 

     TopLeft.X = (TopLeft.X + c.X); 
     TopLeft.Y = (TopLeft.Y + c.Y); 
    } 

    public void Rotate(double qtyRadians) 
    { 
     //Move center to origin 
     Coord temp_orig = new Coord(Center.X, Center.Y); 
     Move(new Coord(0, 0)); 

     BottomRight = RotatePoint(BottomRight, qtyRadians); 
     TopRight = RotatePoint(TopRight, qtyRadians); 
     BottomLeft = RotatePoint(BottomLeft, qtyRadians); 
     TopLeft = RotatePoint(TopLeft, qtyRadians); 

     //Move center back 
     Move(temp_orig); 
    } 

    Coord RotatePoint(Coord p, double qtyRadians) 
    { 
     Coord temb_br = new Coord(p.X, p.Y); 
     p.X = temb_br.X * Math.Cos(qtyRadians) - temb_br.Y * Math.Sin(qtyRadians); 
     p.Y = temb_br.Y * Math.Cos(qtyRadians) + temb_br.X * Math.Sin(qtyRadians); 

     return p; 
    } 
} 

[DebuggerDisplay("({X},{Y})")] 
public class Coord 
{ 
    public double X { get; set; } 
    public double Y { get; set; } 
    public Coord(double x, double y) 
    { 
     X = x; 
     Y = y; 
    } 
}