Math 计算球员的新位置
编辑:我将总结我的问题,因为它很长(感谢Len指出) 我想知道的是,在X时间段后,一名球员将获得一个新的位置。 已知以下变量: -速度 -两点之间的长度 -震源位置(X,Y) -目的地位置(X,Y) 在给定这些变量的情况下,如何计算源和目标之间的位置 例如: 资料来源:0,0 目的地:10,0 速度:1 因此,在1秒后,球员的位置将是1,0 下面的代码可以工作,但它相当长,所以我正在寻找更短/更符合逻辑的代码 ====================================================================== 我很难计算出一个球员在我身上的新位置 这段代码是服务器端的,用于跟踪玩家(这是一个模拟器,所以我无法访问客户端代码) 服务器的碰撞检测工作正常,我使用bresenham的直线算法和光线投射来确定碰撞发生的点 一旦我确定了碰撞,我会计算玩家要走的路径的长度以及总时间 我想知道每秒钟一名球员的新位置 这是我目前正在使用的代码。它是C++的,但是我把服务器移植到C语言,我还没有在C语言中编写代码。Math 计算球员的新位置,math,position,Math,Position,编辑:我将总结我的问题,因为它很长(感谢Len指出) 我想知道的是,在X时间段后,一名球员将获得一个新的位置。 已知以下变量: -速度 -两点之间的长度 -震源位置(X,Y) -目的地位置(X,Y) 在给定这些变量的情况下,如何计算源和目标之间的位置 例如: 资料来源:0,0 目的地:10,0 速度:1 因此,在1秒后,球员的位置将是1,0 下面的代码可以工作,但它相当长,所以我正在寻找更短/更符合逻辑的代码 ===========================================
//源X和目标X之间的差异
//和源y-目的地y
浮动xDiff,yDiff;
xDiff=xDes-xSrc;
yDiff=yDes-ySrc;
浮动行走长度=0.00F;
float NewX=xDiff*xDiff;
float NewY=yDiff*yDiff;
行走长度=NewX+NewY;
行走长度=sqrt(行走长度);
常数浮点PI=3.14159265F;
浮动角度=0.00F;
如果(xDes>=xSrc&&yDes>=ySrc)
{
角度=atanf((yDiff/xDiff));
角度=角度*180/PI;
}
else if(xDes=ySrc)
{
角度=atanf((-xDiff/yDiff));
角度=角度*180/PI;
角度+=90.00F;
}
else if(xDes=xSrc&&yDes=1000)
{
睡眠(1000);
i+=速度;
步行时间-=1000;
}
其他的
{
睡眠(步行时间);
i+=速度*行走时间;
步行时间-=1000;
完成=正确;
}
如果(角度>=0和角度<90)
{
浮动xNew=cosf(角度*PI/180)*i;
浮动yNew=sinf(角度*PI/180)*i;
float NewCharacterX=xSrc+xNew;
float NewCharacterY=ySrc+yNew;
}
我已经切掉了循环的最后一部分,因为它只有3个else if语句和3个其他角度条件,唯一的变化是sin和cos
给定的速度参数是速度/秒
上面的代码可以工作,但正如您所看到的,它相当长,所以我正在寻找一种新的方法来计算它
顺便说一句,不要介意while循环来计算每个新位置,我将在C中使用计时器#
非常感谢你忘记角度吧。三角法既需要代码,也需要时间。你应该改用向量 下面是对您的代码的重写:
float xDiff=xDes-xSrc;
浮点数yDiff=yDes-ySrc;
//从源到目标的欧几里德距离
浮动行走长度=sqrt(xDiff*xDiff+yDiff*yDiff);
浮动行走时间=行走长度/速度;
bool Done=false;
浮点数i=0;
同时(我<行走长度&&!完成)
{
如果(行走时间>=1f)
{
睡眠(1000);
i+=速度;
行走时间-=1f;
}
其他的
{
睡眠((int)(步行时间*1000f));
i+=速度*行走时间;
行走时间-=1f;
完成=正确;
}
float xNew=xDiff/行走长度*i;
float yNew=yDiff/行走长度*i;
float NewCharacterX=xSrc+xNew;
float NewCharacterY=ySrc+yNew;
}
xDiff/walkingLength
将与代码中的cosf(Angle*PI/180)相同。忘记角度。三角法既需要代码,也需要时间。应该改用向量
下面是对您的代码的重写:
float xDiff=xDes-xSrc;
浮点数yDiff=yDes-ySrc;
//从源到目标的欧几里德距离
浮动行走长度=sqrt(xDiff*xDiff+yDiff*yDiff);
浮动行走时间=行走长度/速度;
bool Done=false;
浮点数i=0;
同时(我<行走长度&&!完成)
{
如果(行走时间>=1f)
{
睡眠(1000);
i+=速度;
行走时间-=1f;
}
其他的
{
睡眠((int)(步行时间*1000f));
i+=速度*行走时间;
行走时间-=1f;
完成=正确;
}
float xNew=xDiff/行走长度*i;
float yNew=yDiff/行走长度*i;
float NewCharacterX=xSrc+xNew;
float NewCharacterY=ySrc+yNew;
}
xDiff/walkingLength
将与代码中的cosf(Angle*PI/180)
相同。这里的代码太多了,你可能会发现人们不愿意帮忙,只是因为不太清楚真正的问题是什么。你能试着在顶部总结一下吗
// Difference between the source X - destination X
//and source y - destionation Y
float xDiff, yDiff;
xDiff = xDes - xSrc;
yDiff = yDes - ySrc;
float walkingLength = 0.00F;
float NewX = xDiff * xDiff;
float NewY = yDiff * yDiff;
walkingLength = NewX + NewY;
walkingLength = sqrt(walkingLength);
const float PI = 3.14159265F;
float Angle = 0.00F;
if(xDes >= xSrc && yDes >= ySrc)
{
Angle = atanf((yDiff / xDiff));
Angle = Angle * 180 / PI;
}
else if(xDes < xSrc && yDes >= ySrc)
{
Angle = atanf((-xDiff / yDiff));
Angle = Angle * 180 / PI;
Angle += 90.00F;
}
else if(xDes < xSrc && yDes < ySrc)
{
Angle = atanf((yDiff / xDiff));
Angle = Angle * 180 / PI;
Angle += 180.00F;
}
else if(xDes >= xSrc && yDes < ySrc)
{
Angle = atanf((xDiff / -yDiff));
Angle = Angle * 180 / PI;
Angle += 270.00F;
}
float WalkingTime = (float)walkingLength / (float)speed;
bool Done = false;
float i = 0;
while(i < walkingLength)
{
if(Done == true)
{
break;
}
if(WalkingTime >= 1000)
{
Sleep(1000);
i += speed;
WalkTime -= 1000;
}
else
{
Sleep(WalkTime);
i += speed * WalkTime;
WalkTime -= 1000;
Done = true;
}
if(Angle >= 0 && Angle < 90)
{
float xNew = cosf(Angle * PI / 180) * i;
float yNew = sinf(Angle * PI / 180) * i;
float NewCharacterX = xSrc + xNew;
float NewCharacterY = ySrc + yNew;
}