Objective c 我需要一个沿椭圆等速运动的方程

Objective c 我需要一个沿椭圆等速运动的方程,objective-c,math,swift,Objective C,Math,Swift,我正在编程一些东西,比如行星围绕太阳运行,为了移动行星,我使用了一个函数 CGPointMake(object.center.x + 1, sqrt(75*75*150*150 - 75*75*(object.center.x - 300)*(object.center.x - 300))/150 + 150) 使用椭圆方程,其中a=150,b=75,p=300,q=150,但当物体接近x=450时,它的速度上升,我猜这是因为皮塔戈拉,因为它通过的路径是c=sqrtx-x0^2*y-y0^2

我正在编程一些东西,比如行星围绕太阳运行,为了移动行星,我使用了一个函数

CGPointMake(object.center.x + 1, sqrt(75*75*150*150 - 75*75*(object.center.x - 300)*(object.center.x - 300))/150 + 150)
使用椭圆方程,其中a=150,b=75,p=300,q=150,但当物体接近x=450时,它的速度上升,我猜这是因为皮塔戈拉,因为它通过的路径是c=sqrtx-x0^2*y-y0^2

我注意到我的c总是在0.5左右,但当它到达x域的末尾时,它会上升到0.8,所以我需要一个程序或数学解决方案,使对象以相同的速度绕椭圆曲线移动

谢谢大家!

如果你想要真实的东西

然后,靠近恒星系统主焦点质量中心的行星。。。非常接近恒星的区域移动速度更快,请使用此处:。别忘了检查答案中的所有子链接,你可以在那里找到你需要的一切

如果你想要恒定的速度

然后利用参数椭圆方程

x(a)=x0+rx*cos(a)
y(a)=y0+ry*sin(a)
其中a为角度x0,y0为椭圆中心,rx,ry为椭圆半轴半径

如果a以恒定速度增加,则面积增加是恒定的,因此a是平均圆角度,而不是椭圆上的可视角度!!!有关更多信息,请查看此处:

[edit1]正如马丁纳指出的,速度不是恒定的

这是近似的速度公式。椭圆是由x0,y0,rx,ry rx>=ry周长近似值l定义的轴对齐:

如果你想沿着周长有n块大小相等的台阶,那么

l/=n;
初步计算:

双x0,y0,rx,ry,n,l,h; x0=Form1->ClientWidth>>1;//中心是以形式为中心的 y0=Form1->ClientHeight>>1; rx=200;//半轴rx>=ry!!! ry=75; n=40.0;//每个椭圆的块数1/速度 //l=2.0*M_PI*sqrt0.5*rx*rx+ry*ry;//不够准确 h=rx ry/rx+ry;h*=3.0*h;l=M_PI*rx+ry*1.0+h/10.0+sqrt4.0-h;//这更准确 l/=n;//以单位、像素或其他任何单位表示的单步大小 首先是缓慢的暴力攻击黑色:

int i; 双a,da,x,y,xx,yy,ll; a=0.0; x=x0+rx*cosa; y=y0+y*sina; 对于i=n;i> 0;我- { xx=x;yy=y; 对于da=a;; { a+=0.001; x=x0+rx*cosa; y=y0+y*sina; ll=sqrtxx-x*xx-x+yy-y*yy-y; 如果ll>=l中断; }da=a-da; scr->移动到5.0+50.0*a,5.0; scr->LineTo5.0+50.0*a、5.0+300.0*da; scr->MoveTox0,y0; scr->LineToxx,yy; scr->LineTox,y; ll=sqrtxx-x*xx-x+yy-y*yy-y; scr->TextOutA0.5*x+xx+20.0*cosa,0.5*y+yy+20.0*sina,地板; } 现在近似值为蓝色:

a=0.0;da=0; x=x0+rx*cosa; y=y0+y*sina; 对于i=n;i> 0;我- { scr->移动到5.0+50.0*a,5.0+300.0*da; xx=rx*sina; yy=ry*cosa; da=l/sqrtxx*xx+yy*yy;a+=da; scr->LineTo5.0+50.0*a、5.0+300.0*da; xx=x;yy=y; x=x0+rx*cosa; y=y0+y*sina; scr->MoveTox0,y0; scr->LineToxx,yy; scr->LineTox,y; ll=sqrtxx-x*xx-x+yy-y*yy-y; scr->TextOutA0.5*x+xx+40.0*cosa,0.5*y+yy+40.0*sina,floorll; } 这是一个干净的椭圆步骤,没有调试绘图

a=???;//一些初始角度 //椭圆上的点 x=x0+rx*cosa; y=y0+y*sina; //下一个角度几乎恒定的速度 xx=rx*sina; yy=ry*cosa; da=l/sqrtxx*xx+yy*yy;a+=da; //椭圆上的下一点。。。 x=x0+rx*cosa; y=y0+y*sina; 这里是比较暴力和近似的输出:

[edit2]精度提升很小

a、 da=???;//一些初始角度和最后一步 x=x0+rx*cosa; y=y0+y*sina; //下一个角度几乎恒定的速度 xx=rx*sina+0.5*da;//使用半步进角进行近似。。。。 yy=ry*cosa+0.5*da; da=l/sqrtxx*xx+yy*yy;a+=da; //椭圆上的下一点。。。 x=x0+rx*cosa; y=y0+y*sina; 如果你想要真实的东西,半步角近似会导致更接近暴力攻击的结果

然后,靠近恒星系统主焦点质量中心的行星。。。非常接近恒星的区域移动速度更快,请使用此处:。别忘了检查答案中的所有子链接,你可以在那里找到你需要的一切

如果你想要恒定的速度

然后利用参数椭圆方程

x(a)=x0+rx*cos(a)
y(a)=y0+ry*sin(a)
其中a为角度x0,y0为椭圆中心,rx,ry为椭圆半轴半径

如果a以恒定速度增加,则面积增加是恒定的,因此a是平均圆角度,而不是椭圆上的可视角度!!!有关更多信息,请查看此处:

[edit1]正如马丁纳指出的,速度不是恒定的

这是近似的速度公式。椭圆是由x0,y0,rx,ry rx>=ry周长近似值l定义的轴对齐:

如果你想沿着周长有n块大小相等的台阶,那么

l/=n;
初步计算:

双x0,y0,rx,ry,n,l,h; x0=Form1->ClientWidth>>1;//中心是以形式为中心的 y0=Form1->ClientHeight>>1; rx=200;//半轴rx>=ry!!! ry=75; n=40.0;//每个椭圆的块数1/速度 //l=2.0*M_PI*sqrt0.5*rx*rx+ry*ry;//不够准确 h=rx ry/rx+ry;h*=3.0*h;l=M _PI*rx+ry*1.0+h/10.0+sqrt4.0-h;//这更准确 l/=n;//以单位、像素或其他任何单位表示的单步大小 首先是缓慢的暴力攻击黑色:

int i; 双a,da,x,y,xx,yy,ll; a=0.0; x=x0+rx*cosa; y=y0+y*sina; 对于i=n;i> 0;我- { xx=x;yy=y; 对于da=a;; { a+=0.001; x=x0+rx*cosa; y=y0+y*sina; ll=sqrtxx-x*xx-x+yy-y*yy-y; 如果ll>=l中断; }da=a-da; scr->移动到5.0+50.0*a,5.0; scr->LineTo5.0+50.0*a、5.0+300.0*da; scr->MoveTox0,y0; scr->LineToxx,yy; scr->LineTox,y; ll=sqrtxx-x*xx-x+yy-y*yy-y; scr->TextOutA0.5*x+xx+20.0*cosa,0.5*y+yy+20.0*sina,地板; } 现在近似值为蓝色:

a=0.0;da=0; x=x0+rx*cosa; y=y0+y*sina; 对于i=n;i> 0;我- { scr->移动到5.0+50.0*a,5.0+300.0*da; xx=rx*sina; yy=ry*cosa; da=l/sqrtxx*xx+yy*yy;a+=da; scr->LineTo5.0+50.0*a、5.0+300.0*da; xx=x;yy=y; x=x0+rx*cosa; y=y0+y*sina; scr->MoveTox0,y0; scr->LineToxx,yy; scr->LineTox,y; ll=sqrtxx-x*xx-x+yy-y*yy-y; scr->TextOutA0.5*x+xx+40.0*cosa,0.5*y+yy+40.0*sina,floorll; } 这是一个干净的椭圆步骤,没有调试绘图

a=???;//一些初始角度 //椭圆上的点 x=x0+rx*cosa; y=y0+y*sina; //下一个角度几乎恒定的速度 xx=rx*sina; yy=ry*cosa; da=l/sqrtxx*xx+yy*yy;a+=da; //椭圆上的下一点。。。 x=x0+rx*cosa; y=y0+y*sina; 这里是比较暴力和近似的输出:

[edit2]精度提升很小

a、 da=???;//一些初始角度和最后一步 x=x0+rx*cosa; y=y0+y*sina; //下一个角度几乎恒定的速度 xx=rx*sina+0.5*da;//使用半步进角进行近似。。。。 yy=ry*cosa+0.5*da; da=l/sqrtxx*xx+yy*yy;a+=da; //椭圆上的下一点。。。 x=x0+rx*cosa; y=y0+y*sina; 近似情况下的半步角导致更接近暴力攻击的结果

你可以用SpriteKit很容易地伪造这样的东西。注意,您的整个应用程序不必使用SpriteKit。您可以相当轻松地将SKView放入非SpriteKit应用程序中

无论如何

创造你的星球

SKSpritNode *planet = [SKSpritNode spriteNodeWithImageNamed:@"mars"];
[solarSystemView addChild:planet];
创建您的椭圆路径

UIBezierPath *ellipse = [UIBezierPath bezierPathWithOvalInRect:/*your rect*/]; //or create it any other way.
创建一个动作

SKAction *singleOrbit = [SKAction followPath:ellipse.CGPath speed:10];
SKAction *orbit = [SKAction repeatActionForever:singleOrbit];
[planet runAction:orbit];
运行操作

SKAction *singleOrbit = [SKAction followPath:ellipse.CGPath speed:10];
SKAction *orbit = [SKAction repeatActionForever:singleOrbit];
[planet runAction:orbit];

你可以用SpriteKit很容易地伪造这样的东西。注意,您的整个应用程序不必使用SpriteKit。您可以相当轻松地将SKView放入非SpriteKit应用程序中

无论如何

创造你的星球

SKSpritNode *planet = [SKSpritNode spriteNodeWithImageNamed:@"mars"];
[solarSystemView addChild:planet];
创建您的椭圆路径

UIBezierPath *ellipse = [UIBezierPath bezierPathWithOvalInRect:/*your rect*/]; //or create it any other way.
创建一个动作

SKAction *singleOrbit = [SKAction followPath:ellipse.CGPath speed:10];
SKAction *orbit = [SKAction repeatActionForever:singleOrbit];
[planet runAction:orbit];
运行操作

SKAction *singleOrbit = [SKAction followPath:ellipse.CGPath speed:10];
SKAction *orbit = [SKAction repeatActionForever:singleOrbit];
[planet runAction:orbit];

这可能更像是一个数学或物理问题。但据我所知,行星不会在椭圆轨道上以恒定速度运动。我知道,但我需要一个真实行星运动的方程,或者上面问题的解决方案,因为这样看起来很不现实。当物体在x:150-170范围内时,可以通过降低x燃烧来解决这个问题,因为这就是c增加的地方,但我认为这是非常糟糕的编程guess@JosipBogdan编辑了我的答案。顺便说一句,即使这个问题更像是一个数学或物理问题,它看起来还是有效的。但据我所知,行星不会在椭圆轨道上以恒定速度运动。我知道,但我需要一个真实行星运动的方程,或者上面问题的解决方案,因为这样看起来很不现实。当物体在x:150-170范围内时,可以通过降低x燃烧来解决这个问题,因为这就是c增加的地方,但我认为这是非常糟糕的编程guess@JosipBogdan编辑了我的答案。顺便说一句,即使rxIs是你关于恒定速度的陈述真的成立,它看起来还是有效的?速度是sqrtrx^2*sin^2at+ry^2*cos^2at*a't,即使a't仅在特殊情况下是常数,但这不是常数。@MartinR现在你是对的,面积是常数,而不是常数arclength@MartinR你的方程式在我的答案中添加了[edit1]。。。周长计算的精度对这一点影响很大,所以对于高偏心率,这不是很精确。这看起来很好,sry没有尽早检查它,非常感谢,我自己已经为此工作了一周,但这是我需要的解决方案,非常重要,我很想给你买一瓶啤酒。你说的恒速真的吗?速度是sqrtrx^2*sin^2at+ry^2*cos^2at*a't,即使a't仅在特殊情况下是常数,但这不是常数。@MartinR现在你是对的,面积是常数,而不是常数arclength@MartinR你的方程式在我的答案中添加了[edit1]。。。周长计算的精度对这一点影响很大,所以对于高偏心率,这不是很精确。这看起来很好,谢谢你,我自己已经做了一周了,但这是我需要的解决方案,真的,我非常想给你买杯啤酒