Math 计算球员的新位置

Math 计算球员的新位置,math,position,Math,Position,编辑:我将总结我的问题,因为它很长(感谢Len指出) 我想知道的是,在X时间段后,一名球员将获得一个新的位置。 已知以下变量: -速度 -两点之间的长度 -震源位置(X,Y) -目的地位置(X,Y) 在给定这些变量的情况下,如何计算源和目标之间的位置 例如: 资料来源:0,0 目的地:10,0 速度:1 因此,在1秒后,球员的位置将是1,0 下面的代码可以工作,但它相当长,所以我正在寻找更短/更符合逻辑的代码 ===========================================

编辑:我将总结我的问题,因为它很长(感谢Len指出)

我想知道的是,在X时间段后,一名球员将获得一个新的位置。 已知以下变量: -速度 -两点之间的长度 -震源位置(X,Y) -目的地位置(X,Y)

在给定这些变量的情况下,如何计算源和目标之间的位置

例如:

资料来源:0,0 目的地:10,0 速度:1

因此,在1秒后,球员的位置将是1,0

下面的代码可以工作,但它相当长,所以我正在寻找更短/更符合逻辑的代码

======================================================================

我很难计算出一个球员在我身上的新位置

这段代码是服务器端的,用于跟踪玩家(这是一个模拟器,所以我无法访问客户端代码)

服务器的碰撞检测工作正常,我使用bresenham的直线算法和光线投射来确定碰撞发生的点

一旦我确定了碰撞,我会计算玩家要走的路径的长度以及总时间

我想知道每秒钟一名球员的新位置

这是我目前正在使用的代码。它是C++的,但是我把服务器移植到C语言,我还没有在C语言中编写代码。
//源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;
            }