动画基础数学

4
假设我有一个表单并在其上绘制了一个椭圆形。然后我想要取一个控件(如picturebox),并且在保持控件的左上角正好在线上的同时,我希望控件沿着绘制的椭圆形逐像素移动。
基本上,我想要计算我的椭圆形中每个位置/像素的顶部/左侧点。我知道这是一个基本公式,但我无论如何都想不起它叫什么或者它是如何完成的。
有人可以帮忙吗?
示例图像:https://istack.dev59.com/khKw2.webp

3
不是你确切的问题,但很接近:https://dev59.com/Ik3Sa4cB1Zd3GeqPwqHE - ChrisWue
2个回答

4
double step=1.0; //  how fast do you want it to move

double halfWidth=100.0; //  width of the ellipse divided by 2
double halfHeight=50.0; //  height of the ellipse divided by 2

for (double angle=0; angle<360; angle+=step)
{
    int x=(int)halfWidth * Math.Cos(angle/180*Math.PI);
    int y=(int)halfHeight * Math.Sin(angle/180*Math.PI);
    pictureBox.TopLeft=new Point(x,y);
}

编辑:

现在,如果您问为什么按照上述方式编写代码时它不会动,那么您需要添加消息循环处理,形式如下:

Application.DoEvents();

你需要将它放在循环内部。


@Dve - 我从83年开始在ZX Spectrum上做这个,那是我第一个“程序” :) - Daniel Mošmondor
想要修复你的代码,我会将其标记为答案。Math.Cos(x/180Math.PI); 和 Math.Sin(y/180Math.PI); 是错误的(我认为你是想说宽度和高度???),还有一个x的双重声明。 - Maxim Gershkovich
@Maxim - 这是正确的代码 - 应该将角度放入循环中,而不是x和y - 是我的错误。 - Daniel Mošmondor

1

椭圆的标准形式:

x-x^2/a^2 + y^2/b^2 = 1

其中a = X半径,b = Y半径。例如,如果您想要椭圆底部矩形的左上角点:

y = Sqrt((1-x^2/a^2)*b^2)

更新:将椭圆移动到指定点XC,YC,将每个x替换为(x-XC)(y-YC)。因此,如果您(在C#中)在矩形中绘制椭圆,则XC = rect.X + a YC = rect.Y + b,最终方程式为y = Sqrt((1 - Pow(x - rect.X - rect.Width / 2, 2) * Pow(rect.Height / 2, 2)) + rect.Y + rect.Height / 2...看起来是正确的)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接