Градус поворота на треугольнике без изменения положения с помощью приложения C# windows?

private void panel1_Paint(object sender, PaintEventArgs e)
{
    Pen myPen = new Pen(Color.Blue, 1);
    Pen myPen2 = new Pen(Color.Red, 1);
    Point[] array = { new Point(639, 75), new Point(606, 124), new oint(664, 123) };
    matrix.TransformPoints(array);
    e.Graphics.Transform = matrix;

    e.Graphics.RotateTransform(ang, MatrixOrder.Append);

    myPen2.RotateTransform(ang, MatrixOrder.Append);

    e.Graphics.DrawPolygon(myPen2, array);
}

Я использую Visual Studio 2010. Приведенный выше код должен быть для рисования треугольника в C#, но я не могу повернуть его без расположения нарисованного треугольника. Как я могу этого достичь?

2 ответа

Решение

Это сделает вращение:

private void panel1_Paint(object sender, PaintEventArgs e)
{
    Pen myPen = new Pen(Color.Blue, 1);
    Pen myPen2 = new Pen(Color.Red, 1);
    Point[] array = { new Point(239, 75), new Point(206, 124), new Point(264, 123) };

    float x = array.Select(_ => _.X).Sum() / array.Length;
    float y = array.Select(_ => _.Y).Sum() / array.Length;

    e.Graphics.DrawPolygon(myPen, array);

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

    e.Graphics.DrawPolygon(myPen2, array);
}

Нет необходимости вращать простую ручку, хотя для более продвинутых ручек это вполне может потребоваться.

Я рассчитал координаты центра вращения, а затем переместить Graphics' Происхождение там, поверните его и затем вернитесь назад. Тогда мы можем рисовать.

Для тестирования вы можете использовать трекбар:

float ang = 0f;

private void trackBar1_Scroll(object sender, EventArgs e)
{
    ang = (float) trackBar1.Value;
    panel1.Invalidate();
}

Вы используете несколько методов, перепутанных. Не вращайте ручку / e.Graphics / Matrix все вместе. Когда вы звоните e.Graphics.RotateTransform вы манипулируете e.Graphics.Transform

Вам необходимо настроить матрицу и назначить ее для преобразования. В вашем случае у вашего треугольника есть мировые координаты, поэтому вам нужно перевести их, прежде чем вы сможете повернуть их.

Это поможет:

public partial class Form1 : Form
{
    // define triangle points  ('world coords :'-(   ?????????
    private Point[] _triangle = { new Point(639, 75), new Point(606, 124), new Point(664, 123) };

    // cache the angle
    private float _angle = 0;

    // cache the GObjects!!
    private Pen _myPen = new Pen(Color.Blue, 1);
    private Pen _myPen2 = new Pen(Color.Red, 1);

    // The rotation origin position
    private Point _origin = new Point(637, 110);

    public Form1()
    {
        InitializeComponent();
    }


    private void panel1_Paint(object sender, PaintEventArgs e)
    {
        // draw the origin triangle
        e.Graphics.DrawPolygon(_myPen, _triangle);

        // create a matrix
        Matrix matrix = new Matrix();

        // first translate the triangle coordinates with the negative origin coords (translate coords to origin coordinate system)
        // This translation is only needed, because your triangle is in world coordinates..
        matrix.Translate(-_origin.X, -_origin.Y, MatrixOrder.Append);

        // do the rotation..
        matrix.Rotate(_angle, MatrixOrder.Append);

        // translate the triangle coordinates back to the 'world' coordinate system
        matrix.Translate(_origin.X, _origin.Y, MatrixOrder.Append);

        // assign the matrix to the Graphics
        e.Graphics.Transform = matrix;

        // Draw the polygon
        e.Graphics.DrawPolygon(_myPen2, _triangle);
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {

        float.TryParse(textBox1.Text, NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture.NumberFormat, out _angle);
        panel1.Refresh();
    }
}

Я бы определил треугольник с его собственным происхождением, так что вы можете нарисовать / повернуть его в любом месте на панели.

Другие вопросы по тегам