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]。。。周长计算的精度对这一点影响很大,所以对于高偏心率,这不是很精确。这看起来很好,谢谢你,我自己已经做了一周了,但这是我需要的解决方案,真的,我非常想给你买杯啤酒