Позиции на точки на въртящ се правоъгълник

Имам правоъгълник, който искам да завъртя.

Имам само една точка от правоъгълника (позиция на мишката), дължината и ширината на правоъгълника и ъгъла на въртене. Сега имам нужда от позицията на другите три ъгъла на правоъгълника, за да мога лесно да начертая своя правоъгълник с Graphics.DrawPolygon().

Нямам представа, тъй като нямах математика от няколко години и имам нужда от вашата помощ :D

Опитах много решения от интернет, но нищо не е подходящо за моя проблем.


person Todeshuegel    schedule 03.07.2013    source източник
comment
каква е връзката между въртене и начертан правоъгълник? И въртене около коя централна точка?   -  person Tigran    schedule 03.07.2013
comment
има 1 правоъгълник и 1 текстово поле или подобно, където потребителят трябва да напише ъгъла на завъртане.. и правоъгълникът се преначертава с новите позиции.. централната точка е позицията на мишката (центърът на правоъгълника или горната лява част на правоъгълника (още не мога да реша)).. и за това ми трябват позициите на ъглите.. така че 3 или 4 x и y   -  person Todeshuegel    schedule 03.07.2013
comment
Така че създавате винаги линия, подравнена към някаква конкретна ос/повърхност, да кажем към оста X. След като бъде изтеглен, приложете необходимото завъртане около определена точка.   -  person Tigran    schedule 03.07.2013
comment
да, винаги създавам правоъгълник, но в момента без ъгъл   -  person Todeshuegel    schedule 03.07.2013


Отговори (1)


Следният клас прави това, което търсите. За справка вижте как работи ротацията: 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;
    }
}
person mrtig    schedule 20.08.2013