предсказывать положение машины после кругового движения - PullRequest
2 голосов
/ 03 ноября 2019

У меня есть машина в положении p в 2D мире. Вектор вида автомобиля - нормализованный вектор d .

Радиус круга равен r = 2 / π .

Я хочу создатьфункция predict(p, d, clockwise, angle), которая, учитывая начальную позицию p, направление взгляда d, возвращает конечную позицию автомобиля после поворота angle градусов. Если это по часовой стрелке, это вращается в кругу R, иначе это вращается в L.

[1]

Пример: если я звоню predict( (0,0), (0,1), true, 90 ), это означает автомобильнаходится в (0,0), смотрит вверх и должен вращаться на 90º по часовой стрелке, останавливаясь в положении (2 / π, 2 / π).

Я пытался сделать все, предполагая, что машина всегда смотрит вверх, а затем вращаетсярезультаты в соответствии с его истинным углом, но он не работал должным образом.

Ответы [ 2 ]

1 голос
/ 03 ноября 2019

Идея состоит в том, чтобы найти центр круга, а затем повернуть 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.

0 голосов
/ 03 ноября 2019

Я следовал идее Жиля-Филиппа Пайе о вращении вокруг точки и определил метод для этой задачи:

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) Вы получаете один из них, последний - просто отрицание первого.

...