如何实现多重重力源,特别是所需的trig。(C#)VS 2010
我正在设计一个小游戏,其中的物体被多个物体同时吸引。我所做的是绘制这些物体的拍摄路线 为了计算行星的引力,我使用以下公式:gravityStr/distToTarg^2(伪代码)。我的问题在于计算我需要镜头移动的方向(以及随后的cos和sine)。下面是我的“Shot”类的代码 这里没有包括的其他类是“Planet”类,它有一个xy值(表格左上角为0,0)。还有重力(拉力的强度) 似乎发生的是,行星拒绝了我的射击。我试过反转planetModY和planetModX的符号,但我得到了更奇怪的效果 值得注意的是,当它从行星的右上角开始拍摄时,以及当它向下和向右移动时,镜头似乎起作用 我真的希望得到一些答案,以及代码更正 C#:如何实现多重重力源,特别是所需的trig。(C#)VS 2010,c#,physics,trigonometry,gravity,C#,Physics,Trigonometry,Gravity,我正在设计一个小游戏,其中的物体被多个物体同时吸引。我所做的是绘制这些物体的拍摄路线 为了计算行星的引力,我使用以下公式:gravityStr/distToTarg^2(伪代码)。我的问题在于计算我需要镜头移动的方向(以及随后的cos和sine)。下面是我的“Shot”类的代码 这里没有包括的其他类是“Planet”类,它有一个xy值(表格左上角为0,0)。还有重力(拉力的强度) 似乎发生的是,行星拒绝了我的射击。我试过反转planetModY和planetModX的符号,但我得到了更奇怪的效果
公共类快照
{
静态公共快照[]快照=新快照[0];
静态公共int shotSteps=3000;
公共常数双rad=Math.PI/180;
PointF[]PointFs=新的PointF[0];
公共快照(整数x,整数y,整数dir,整数pow)
{
addShot(这个);
双cos=数学cos((dir*rad));
double sin=数学sin((dir*rad));
添加点(新点f(x,y));
添加点(新点F((浮点)(cos*pow+x),(浮点)(sin*pow+y));
对于(int step=2;step
提示!每个物体不仅有一个位置,还有一个速度。在每一步中,速度随物体加速度而变化,位置随速度而变化(二阶系统)。如果计算出每个重力对对对物体的总贡献并将其矢量相加,则需要做什么
若我对你们说希腊语(另外因为我是希腊语),那个么你们需要一本介绍向量力学的物理学入门书
也要考虑两个物体太近的情况下,导致大的重力和大的距离步长。这不是一个微不足道的问题,使它足够稳定而令人愉快,但这是可能的。如果你成功了,它将是非常令人欣慰的。
以下是其他人以类似方式所做的事情(public class Shot
{
static public Shot[] Shots = new Shot[0];
static public int shotSteps = 3000;
public const double rad = Math.PI / 180;
PointF[] PointFs = new PointF[0];
public Shot(int x, int y, int dir, int pow)
{
addShot(this);
double cos = Math.Cos((dir * rad));
double sin = Math.Sin((dir * rad));
addPoint(new PointF(x, y));
addPoint(new PointF((float)(cos * pow + x), (float)(sin * pow + y)));
for (int step = 2; step < shotSteps; step++)
{
PointF prevPrevPoint = PointFs[step - 2];
PointF prevPoint = PointFs[step - 1];
Double radians = Math.Atan2(prevPoint.Y - prevPrevPoint.Y, prevPoint.X - prevPrevPoint.X);
Double curCos = Math.Cos(radians);
Double curSin = Math.Sin(radians);
PointF curPoint = new PointF(prevPoint.X + (float)curCos * pow, prevPoint.Y + (float)curSin * pow);
int planetModX = 0;
int planetModY = 0;
for (short index = 0; index < Planet.Planets.Length; index++)
{
Planet curPlanet = Planet.Planets[index];
double planetRadians = Math.Atan2(curPoint.Y - curPlanet.Y, curPoint.X - curPlanet.X);
double planetCos = Math.Cos(planetRadians);
double planetSin = Math.Sin(planetRadians);
double planetShotDist = distTo(curPlanet.X, curPlanet.Y, curPoint.X, curPoint.Y);
double pullPower = curPlanet.Gravity / (planetShotDist * planetShotDist);
planetModY += (int)(planetSin * pullPower);
planetModY += (int)(planetCos * pullPower);
}
curPoint.X += planetModX;
curPoint.Y += planetModY;
addPoint(curPoint);
}
}