Как «округлить» 2D вектор до ближайших 15 градусов - PullRequest
2 голосов
/ 27 января 2012

Я работаю над простой игрой и пытаюсь упростить часть реакции на столкновение 2D в игре.Когда определенные объекты ударяются о стены, я вычисляю нормальное столкновение (collisionPoint - objectCenter) и отражаю на основе этого нормального.Я заинтересован в округлении этого нормального вектора до ближайшего 15 °, но я не уверен в том, что есть хороший способ сделать это.

Моя текущая мысль делает что-то подобное

float angle = atan2(normal.Y, normal.X) * Rad2Deg;
float newAngle = ((int)(angle + 7.5f) / 15) * 15.0f * Deg2Rad;
vector2 newNormal = vector2(cos(newAngle), sin(newAngle));

Это разумный способ сделать это?Есть ли лучший способ?

Ответы [ 2 ]

2 голосов
/ 28 января 2012

Попробуйте это:

float roundAngle = 15 * Deg2Rad;
float angle = (float)Math.Atan2(normal.Y, normal.X);
Vector2 newNormal;

if (angle % roundAngle != 0)
{
    float newAngle = (float)Math.Round(angle / roundAngle) * roundAngle;
    newNormal = new Vector2((float)Math.Cos(newAngle), (float)Math.Sin(newAngle));
}
else
{
    newNormal = Vector2.Normalize(normal);
}

Вам не нужно добавлять 7.5, возьмите этот пример:

// 4 degrees should round to 0
    (4 + 7.5) / 15 == 11.5 / 15 == 0.77
// When this gets rounded up to 1 and multiplied by 15 again, it becomes 15 degrees.

// Don't add 7.5, and you get this:
    4 / 15 == 0.27
// When rounded, it becomes 0 and, as such the correct answer

// Now how about a negative number; -12
    -12 / 15 == -0.8
// Again, when rounded we get the correct number
0 голосов
/ 28 января 2012

на самом деле это более правильно, если вы хотите ближайший угол 15 градусов: сделайте это:

newangle% = INT(((angle%+7.5)/15)*15) 

INT ВСЕГДА округляет ВНИЗ по умолчанию, это должно правильно дать вам ближайший угол в любом случае, который является положительным илиотрицательно повеселиться !!и добавьте часть, где вы используете градусы, в рад, а в градусах, если необходимо, ВНУТРИ паренов (например, рядом с углом%, если этот угол не задан в градусах, тогда используйте там какой-то множитель rad2deg, это больше похоже на то, как высделать это в основном, с некоторой модификацией Это будет работать в коде c или что-то, ну удачи !!

...