使用 C# windows 应用程序在不改变位置的情况下对三角形进行度数旋转?

degree rotation on triangle without changing position using C# windows application?

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#画三角形的,但是没有绘制三角形位置我就不能旋转它。我怎样才能做到这一点?

您混合使用了多种方法。不要一起旋转 pen/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();
    }
}

我会用它自己的原点来定义三角形,这样你就可以draw/rotate它在面板上的任何地方。

这将进行旋转:

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