进行圆周运动后预测汽车位置
predict car position after making a circular movement
我在二维世界的 p 位置有一辆车。 car look vector是一个归一化的向量d.
圆的半径为r = 2/π.
我想创建一个函数 predict(p, d, clockwise, angle)
,给定初始位置 p
,观察方向 d
,它 returns 之后汽车的最终位置转 angle
度。如果是顺时针,则在R
圈内旋转,否则在L
.
内旋转
示例:如果我调用predict( (0,0), (0,1), true, 90 )
,这意味着汽车在(0,0),向上看,它应该顺时针旋转90º,停在位置(2/π,2/π)。
我尝试做所有假设汽车总是向上看然后根据其真实角度旋转结果但它没有正常工作。
思路是找到圆心,然后绕圆心旋转p
。这是伪代码:
d' = Rotate(d, clockwise ? -90 : 90)
circle_center = p + d' * circle_radius // Here, circle_radius is 2/pi
relative_p = p - circle_center
rotated_p = circle_center + Rotate(relative_p, clockwise ? -angle : angle)
此方法适用于任何 p
、d
和 circle_radius
。
我遵循了 Gilles-Philippe Paillé 围绕一个点旋转的想法并为此任务定义了一个方法:
Vector2 RotateAround(Vector2 v, Vector2 pivot, float angle) { //angle in degrees
angle *= Mathf.Deg2Rad;
float x = Mathf.Cos(angle) * (v.x - pivot.x) - Mathf.Sin(angle) * (v.y - pivot.y) + pivot.x;
float x = Mathf.Sin(angle) * (v.x - pivot.x) + Mathf.Cos(angle) * (v.y - pivot.y) + pivot.y;
return new Vector2(x, y);
}
然后,预测最终位置,给定 position
、lookDirection
、angle
和 clockwise
:
Vector2 PredictPosition(Vector2 position, Vector2 lookDirection, float angle, bool clockwise){
float radius = 2f / Mathf.PI;
Vector2 pivot = position + radius * (clockwise ? RIGHT : LEFT);
return RotateAround(transform.position, pivot, clockwise ? -angle : angle);
}
其中 RIGHT
和 LEFT
是对应于向右和向左看的汽车的向量(即 lookDirection
旋转 90º 和 -90º。使用 RotateAround(lookDirection, Vector2.zero, 90)
你取其一,后者只是前者的否定
我在二维世界的 p 位置有一辆车。 car look vector是一个归一化的向量d.
圆的半径为r = 2/π.
我想创建一个函数 predict(p, d, clockwise, angle)
,给定初始位置 p
,观察方向 d
,它 returns 之后汽车的最终位置转 angle
度。如果是顺时针,则在R
圈内旋转,否则在L
.
示例:如果我调用predict( (0,0), (0,1), true, 90 )
,这意味着汽车在(0,0),向上看,它应该顺时针旋转90º,停在位置(2/π,2/π)。
我尝试做所有假设汽车总是向上看然后根据其真实角度旋转结果但它没有正常工作。
思路是找到圆心,然后绕圆心旋转p
。这是伪代码:
d' = Rotate(d, clockwise ? -90 : 90)
circle_center = p + d' * circle_radius // Here, circle_radius is 2/pi
relative_p = p - circle_center
rotated_p = circle_center + Rotate(relative_p, clockwise ? -angle : angle)
此方法适用于任何 p
、d
和 circle_radius
。
我遵循了 Gilles-Philippe Paillé 围绕一个点旋转的想法并为此任务定义了一个方法:
Vector2 RotateAround(Vector2 v, Vector2 pivot, float angle) { //angle in degrees
angle *= Mathf.Deg2Rad;
float x = Mathf.Cos(angle) * (v.x - pivot.x) - Mathf.Sin(angle) * (v.y - pivot.y) + pivot.x;
float x = Mathf.Sin(angle) * (v.x - pivot.x) + Mathf.Cos(angle) * (v.y - pivot.y) + pivot.y;
return new Vector2(x, y);
}
然后,预测最终位置,给定 position
、lookDirection
、angle
和 clockwise
:
Vector2 PredictPosition(Vector2 position, Vector2 lookDirection, float angle, bool clockwise){
float radius = 2f / Mathf.PI;
Vector2 pivot = position + radius * (clockwise ? RIGHT : LEFT);
return RotateAround(transform.position, pivot, clockwise ? -angle : angle);
}
其中 RIGHT
和 LEFT
是对应于向右和向左看的汽车的向量(即 lookDirection
旋转 90º 和 -90º。使用 RotateAround(lookDirection, Vector2.zero, 90)
你取其一,后者只是前者的否定