C# WinForm三角动画

C# WinForm三角动画,c#,animation,geometry,move,C#,Animation,Geometry,Move,我试着让一个三角形在弧上来回移动,三角形在移动的同时应该旋转 为了更好地解释,我制作了一张图片: 数学对我来说是正确的,有人能告诉我我做错了什么吗 public partial class Form1 : Form { bool turn = false; double angle = 0; public Form1() { InitializeComponent(); } protected override void

我试着让一个三角形在弧上来回移动,三角形在移动的同时应该旋转

为了更好地解释,我制作了一张图片:

数学对我来说是正确的,有人能告诉我我做错了什么吗

public partial class Form1 : Form
{
    bool turn = false;
    double angle = 0;

    public Form1()
    {
        InitializeComponent();


    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        Brush solidBlackBrush = new SolidBrush(Color.Black); //En solid svart brush som brukes flere steder
        Pen solidBackPen = new Pen(solidBlackBrush);//En solid svart pen som brukes flere steder

        //Trekant = Norwegian for Triangle, Trekant is a class that draws a polygon shaped as a Triangle.
        Trekant tre = new Trekant();

        e.Graphics.DrawArc(solidBackPen, new Rectangle(new Point(50,50), new Size(100,100)) , 180, 180);

        //X = a + r*Cos(angle) | Y = b + r*Sin(angle)
        double x = (50+(100/2)) + (100/2) * Math.Cos(Trekant.DegreeToRadian(angle));
        double y = (50+(100/2)) - (100/2) * Math.Sin(Trekant.DegreeToRadian(angle));

        e.Graphics.TranslateTransform((float)x - 15, (float)y - 40);//Flytter 0 slik at pistolen havner på rett sted
        e.Graphics.RotateTransform((float)-Trekant.RadianToDegree(Trekant.DegreeToRadian(angle-90)));

        tre.Draw(e.Graphics);
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        if (angle == 0)
        {
            turn = false;
        }
        if (angle == 180)
        {
            turn = true;
        }
        if (turn)
        {
            angle -= 10;
        }
        if (!turn)
        {
            angle += 10;
        }

        this.Invalidate();
    }
}

不必进行编码,让我们先建立数学模型

假设图片中的半椭圆宽度为
2w
,高度为
h
。假设您希望移动以
n
步进行

然后在每一步
s
时,旋转角度为
s*180f/n
。旋转点的
x
保持在
w
加上椭圆具有的任何偏移量
ox
,但必须从偏移量
oy
垂直移动其
y
,首先在每一步向下移动
(w-h)*2f/n
,然后再以相同的量向上移动

图形本身也会随之移动

因此,旋转点有一个
TranslateTransform
,旋转Transform,然后是另一个
TranslateTransform
来放置图像,然后是
DrawImage
,最后是一个
ResetTransform


我希望这有帮助。如果这不起作用,请更新问题,我们会把它做对的,我确信..

它目前做什么?我觉得奇怪的是,你在旋转之前进行平移三角形是相对于0绘制的,所以我将0移动到圆弧上的右侧点,然后将三角形旋转到正确的角度。到目前为止,旋转角度似乎是向右的,三角形不在正确的位置。为什么这:
(50+(100/2))+(100/2)
和这:
(50+(100/2))-(100/2)
-这些计算每次都是一样的。i、 这只是一个常量。您是否缺少一个变量?还有一个性能提示:只声明一次笔和画笔,并在类中重用它们,而不是每次都重新创建它们。(50+(100/2))是弧中心的x和y。100/2是半径。这两件事一直是一样的。公式是X=a+rcos(角度),Y=b+rsin(角度)。在这种情况下,a=b,因为我把弧的起始点设为一个sircle。