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。