gpt4 book ai didi

c# - 如何进行半圆运动?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:20:36 24 4
gpt4 key购买 nike

假设我有一辆车在位置 P0,我想把它移到位置 P1,就像这 4 个例子:

enter image description here

P0 和P1 之间的直线距离为d,运动到达的垂直最大高度为d/3。我想模拟这个从P0到P1的顺时针半圆运动。

假设dir = P1 - P0(长度d)并且perp是向量(长度d/3) 垂直于 dir

假设t = 0是半圆运动的开始,t = 1是结束,我如何测量汽车的角度和位置在 t = i

最佳答案

我们必须找到这个圆弧和圆心的角度。

首先求半径。

R^2 = (d/2)^2 + (R-d/3)^2  //pythagorean
R = 13/24 * d

现在角度

half_angle = arcsin(12/13) ~ 67.4 degrees 
angle = 2 * half_angle ~ 135 degrees = 2.35 radians

归一化perp向量

uperp = perp / len(perp)

获取圆心

M = (P0 + P1)/2   //chord middle
C = M + uperp * 5/24 * d

起始角度

A0 = atan2(P0.Y-C.Y, P0.X-C.X)

最后坐标

Car.X = C.X + R * Cos(A0 + t * angle)
Car.Y = C.Y + R * Sin(A0 + t * angle)

在 Unity 中,这看起来像:

Vector2 startPosition;
Vector2 endPosition;
Vector2 perp;
float t;

float d = (endPosition - startPosition).magnitude;

float radius = 13f/24f * d;
float angle = 2f * Mathf.Asin(12f/13f);

Vector2 uperp = perp.normalized;

Vector2 M = (startPosition+endPosition)*0.5f;
Vector2 C = M + uperp * 5f/24f * d;

float A0 = Mathf.Atan2(startPosition.y-C.y, startPosition.x-C.x);
float At = A0 + t * angle;

Vector2 newPos = C + radius * new Vector2(Mathf.Cos(At), Mathf.Sin(At));

enter image description here

关于c# - 如何进行半圆运动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58444040/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com