Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 计算两点间的速度_C#_Math - Fatal编程技术网

C# 计算两点间的速度

C# 计算两点间的速度,c#,math,C#,Math,我有一艘敌舰和一艘游船 我希望敌舰在任何时候都能直飞玩家,即使玩家在移动 我将使用C#XNA的Ray类来实现这一点 我有两个向量坐标,射线的位置/原点(玩家当前位置)和射线的方向(敌人当前位置)。我希望敌人的阵地逐渐向玩家的阵地移动 到目前为止,我有这个代码 enemyPlayerTrack.Position = playerPos; enemyPlayerTrack.Direction = enemyPos; 我不确定是否需要另一个速度矢量 最后,敌人将被带着以下代码的新位置吸引到屏幕上:

我有一艘敌舰和一艘游船

我希望敌舰在任何时候都能直飞玩家,即使玩家在移动

我将使用C#XNA的Ray类来实现这一点

我有两个向量坐标,射线的位置/原点(玩家当前位置)和射线的方向(敌人当前位置)。我希望敌人的阵地逐渐向玩家的阵地移动

到目前为止,我有这个代码

enemyPlayerTrack.Position = playerPos;
enemyPlayerTrack.Direction = enemyPos;
我不确定是否需要另一个速度矢量

最后,敌人将被带着以下代码的新位置吸引到屏幕上:

enemyWorldMatrix = Matrix.CreateTranslation(new Vector3(x, y, z));

如果没有数学背景,我很难创建一个速度来将两个向量越来越近地连接起来。

我们选择一些速度
s
。那么玩家从敌人那里得到的方向是:

dir_x = player_x - enemy_x
dir_y = player_y - enemy_y
总速度s=sqrt(vel_x^2+vel_y)^2,因此我们缩放dir向量以获得速度:

factor = s / sqrt(dir_x^2 + dir_y^2)
vel_x = dir_x * factor
vel_y = dir_y * factor
distance = sqrt(dir_x^2 + dir_y^2)
delay_to_reaching_player = 2    // some measure of time
enemy_speed = min(s, distance/delay_to_reaching_player)
所以现在敌人总是以相同的速度飞向玩家。但是,如果玩家靠近敌人,敌人就会出击,并在玩家身上来回弹跳。所以我们限制速度:

factor = s / sqrt(dir_x^2 + dir_y^2)
vel_x = dir_x * factor
vel_y = dir_y * factor
distance = sqrt(dir_x^2 + dir_y^2)
delay_to_reaching_player = 2    // some measure of time
enemy_speed = min(s, distance/delay_to_reaching_player)

这样,通过设置延迟,敌人将在接近玩家时减速,一旦它接近到足以停止以最大速度移动。

我前面没有XNA,所以这只是伪代码

两者之间的总差值应为:

var delta = playerPosition - enemyPosition;
这给出了方向,但通常会有错误的大小;因此,我们可以通过以下方式将其重新缩放为单位向量:

var magnitude = Math.Sqrt(delta.x * delta.x + delta.y * delta.y +
                  delta.z * delta.z); // however many dimensions you have...
var unitDelta = delta / magnitude; // assuming non-zero; if zero, don't move
var newVelocity = unitDelta * enemySpeed;

但是,请注意,这是一个非常基本的方法(它不考虑玩家的速度-这会让人觉得AI很愚蠢)。

如果你有一个来自敌人->玩家的向量,你基本上有一个可以应用于敌人的转换,让它跳到玩家的位置。你需要通过将向量归一化回到“单位”,将向量总长度设置为“1”,但它仍然指向玩家的方向,然后你可以将该值乘以你实际想要得到的向量的速度,以将敌人移动到玩家的方向

正如人们已经回答的,要得到一个单位,你需要求向量两个分量的乘积之和,然后取平方根。这与毕达哥拉斯定理有关,例如:

如果你取一个向量的分量

(2,2)

这将是:

  2 
  ^
  |
  |
--> 2
然后在原点(0,0)和向量端点相交的点之间画一条线-得到一个三角形

  2
  ^
 /|
/ |
--> 2
这条线表示向量的大小,取两个分量的平方和,然后将其sqrt以获得这条线的长度:

2*2+2*2=8

sqrt(8)=2.82

所以这个向量的长度是2.82,这意味着2和2的值是单个单位向量的2.82倍

为了得到“1”长或“单位”长的分量,我们需要对向量进行归一化——我们通过将每个分量除以大小来实现

2/2.82=0.70

这听起来是对的-我知道这个向量的角度是45度(上2跨2必须是一个完美的对角线),所以你可以使用余弦或正弦来检查它,因为余弦/正弦为给定角度提供向量分量的水平或垂直单位长度

sin(45)或cos(45)=0.70

当场

现在你知道了,对玩家的角度使用了一个长度为1的向量,它包含以下分量

(0.7,0.7)

要将敌人的3个单位移向玩家,你只需将组件乘以3即可

0.7*3=2.1

所以

(2.1,2.1)

将在这一物理步中向玩家移动敌人的3个单位


这有什么帮助吗?

然后我如何将其实现到最终的移动代码中?enemyWorldMatrix=Matrix.CreateTranslation(新向量3(vel_x,vel_y,z))???减速?不。。。撞击速度;p平移是位置的变化,即速度乘以时间增量。如果您知道屏幕更新的频率,请使用此选项(例如0.01秒),但如果您不知道,则最好捕获自最后一帧起的时间并使用该选项。@MarcGravel:对于初学者,可能最好避免使用冲突代码……游戏开发至少需要一些数学背景。尝试,从数千本书中:克里斯托弗·特雷姆布雷。游戏开发者的数学。课程技术,2004年。ISBN 9781592000388我同意前面的评论,尤其是三角学:)