Как повернуть 2d объект в C # - PullRequest
1 голос
/ 24 марта 2019

В основном у меня есть форма окна, в которой пользователь сможет рисовать различные формы (например, квадрат, круг и треугольник), пользователь сможет выделить любую из этих фигур после рисования, а затем управлять выделенной формой, перемещая или поворачивая ее.Я не знаю, как вращать форму.любой может помочь, это мой код (только для рисования квадрата) PS: пользователю нужно дважды щелкнуть форму, чтобы нарисовать фигуру между этими двумя точками, как показано ниже, также я знаю, что должен использовать метод onPaint, но этотребования задачи

Спасибо

public Square(Point keyPt, Point oppPt)   // constructor
    {
        this.keyPt = keyPt;
        this.oppPt = oppPt;
    }

    // You will need a different draw method for each kind of shape. Note the square is drawn
    // from first principles. All other shapes should similarly be drawn from first principles. 
    // Ideally no C# standard library class or method should be used to create, draw or transform a shape
    // and instead should utilse user-developed code.
    public void draw(Graphics g, Pen blackPen)
    {
        // This method draws the square by calculating the positions of the other 2 corners
        double xDiff, yDiff, xMid, yMid;   // range and mid points of x & y  

        // calculate ranges and mid points
        xDiff = oppPt.X - keyPt.X;
        yDiff = oppPt.Y - keyPt.Y;
        xMid = (oppPt.X + keyPt.X) / 2;
        yMid = (oppPt.Y + keyPt.Y) / 2;

        // draw square
        g.DrawLine(blackPen, (int)keyPt.X, (int)keyPt.Y, (int)(xMid + yDiff / 2), (int)(yMid - xDiff / 2));
        g.DrawLine(blackPen, (int)(xMid + yDiff / 2), (int)(yMid - xDiff / 2), (int)oppPt.X, (int)oppPt.Y);
        g.DrawLine(blackPen, (int)oppPt.X, (int)oppPt.Y, (int)(xMid - yDiff / 2), (int)(yMid + xDiff / 2));
        g.DrawLine(blackPen, (int)(xMid - yDiff / 2), (int)(yMid + xDiff / 2), (int)keyPt.X, (int)keyPt.Y);
    }

    public void fillSquare(Graphics g, Brush redBrush)
    {
        float xDiff = oppPt.X - keyPt.X;
        float yDiff = oppPt.Y - keyPt.Y;
        float xMid = (oppPt.X + keyPt.X) / 2;
        float yMid = (oppPt.Y + keyPt.Y) / 2;

        var path = new GraphicsPath();
        path.AddLines(new PointF[] {
        keyPt,
        new PointF(xMid + yDiff/2, yMid-xDiff/2),
        oppPt
        });

        path.AddLines(new PointF[] {
        keyPt,
        new PointF(xMid - yDiff/2, yMid + xDiff/2),
        oppPt
        });

        path.CloseFigure();

        // Fill Triangle
        g.FillPath(redBrush, path);

    }
}

}

Я пробовал этот метод, но что-то не хватает, я не знаю, что это

private void itemRotation(PaintEventArgs e)
    {
        Pen blackpen = new Pen(Color.Black);
        Graphics g = e.Graphics;
        Font myFont = new System.Drawing.Font("Helvetica", 9);
        Brush blackwriter = new SolidBrush(System.Drawing.Color.Black);


        if (rotateItem)
        {
            for (int i = 0; i < shapes.Count; i++)
            {
                if (shapes[i].Selected)
                {
                    if (shapes[i].ShapeType == (int)ShapeTypes.Square)
                    {
                        PointF center = new PointF(shapes[i].keyPt.X + (shapes[i].oppPt.X / 2.0F), shapes[i].keyPt.Y + (shapes[i].oppPt.Y / 2.0F));
                        shapes[i].keyPt = new Point(shapes[i].keyPt.X, shapes[i].keyPt.Y);
                        shapes[i].oppPt = new Point(shapes[i].oppPt.X, shapes[i].oppPt.Y);
                        Matrix myMatrix = new Matrix();
                        myMatrix.Rotate(30);
                        g.Transform = myMatrix;
                        ((Square)shapes[i]).draw(g, blackpen);
                        g.DrawString("2nd pos", myFont, blackwriter, shapes[i].keyPt.X, shapes[i].oppPt.X);
                    }
                }
            }
        }
    }

1 Ответ

2 голосов
/ 25 марта 2019

Ниже приведен пример того, как нарисовать одну и ту же фигуру (a GraphicsPath) в различных местах и ​​поворотах.

Ключом здесь являются следующие две команды

e.Graphics.TranslateTransform(x, y);
e.Graphics.RotateTransform(-angle);

См.результаты ниже:

screenshot

и код, использованный для его генерации:

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    // This code defines a graphics shape using a GraphicsPath
    // and draws multiple copies along a grid and with various
    // rotation angle angles.
    e.Graphics.SmoothingMode=SmoothingMode.AntiAlias;
    var target = sender as PictureBox;

    // Step 1 - Define a rectangle 20 by 12 pixels, center at origin.
    var gp = new GraphicsPath();
    gp.AddLines(new PointF[] {
        new PointF(-10, -6),
        new PointF( 10, -6),
        new PointF( 10,  6),
        new PointF(-10,  6) });
    gp.CloseFigure();

    // Step 2 - Define a 10×9 grid with two loops
    float angle = 0;
    for (int i = 0; i<9; i++)
    {
        // divide the control height into 10 divisions
        float y = (i+1)*target.Height/10;
        for (int j = 0; j<10; j++)
        {
            // divide the control width into 11 divisions
            float x = (j+1)*target.Width/11;
            // Save the default transformation state
            var state = e.Graphics.Save();

            // Traslate the origin to (x,y), each grid point
            e.Graphics.TranslateTransform(x, y);
            // Rotate shape by an angle (negative = CCW)
            e.Graphics.RotateTransform(-angle);

            // Draw the shape
            e.Graphics.FillPath(Brushes.LightSeaGreen, gp);
            e.Graphics.DrawPath(Pens.Black, gp);

            // Restore the default transformation state
            e.Graphics.Restore(state);

            // Increment the angle by one degree. 
            // The idea is to show all 90 degrees of rotation in a 10×9 grid.
            angle++;
        }
    }
}
...