Как узнать, когда увеличивать или уменьшать угол, чтобы получить определенный угол? - PullRequest
1 голос
/ 11 июня 2010

Я программирую игру, и я попал в очень трудное положение. В основном у меня есть круг, и у меня есть 2 угла на этот круг. Угол 1 (A) - это точка, в которую я хочу направить угол 2 (B). Во время моей игры каждый кадр мне нужно проверять, нужно ли нам увеличивать или уменьшать значение моего угла на определенную величину (скорость), чтобы в конечном итоге достичь первого угла. У меня вопрос, как мне это сделать?

Я пытался сделать это, но, похоже, я не делаю это правильно.

bool increase = false;

float B = [self radiansToDegrees:tankAngle];
float A = [self radiansToDegrees:tankDestinationAngle];
float newAngle = B;

if(B < A) {

    float C = B - (360 - A);
    float D = A - B;

    if(C < D) increase = false;
    else increase = true;

} else if(B > A) {

    float C = B - A;
    float D = A - (360 - B);

    if(C < D) increase = false;
    else increase = true;

}

if(increase) {
    newAngle += 1.0;
} else {
    newAngle -= 1.0;
}

if(newAngle > 360.0) {
    newAngle = 0 + (newAngle - 360.0);
} else if(newAngle < 0.0) {
    newAngle = 360 + newAngle;
}

if(newAngle == 0) newAngle = 360;

newAngle = [self degreesToRadians:newAngle];

[self setTanksProperPositionRotation:newAngle];

Основной эффект, которого я пытаюсь достичь, - это когда пользователь создает новую точку, которая будет углом 1, угол 2 будет двигаться в направлении угла 1, выбирая самое быстрое направление. Я думаю, что потратил около 4 часов, чтобы понять это.

Ответы [ 3 ]

1 голос
/ 12 июня 2010

Нормализовать углы между 0 и 360 градусами и взять в зависимости от того, что меньше:

float normalize(float angle)
{
    while(angle < 0)
        angle += 360;
    return angle % 360;
}

//To use...
float angle1 = A - B;
float angle2 = B - A;
if(normalize(angle1) < normalize(angle2))
    //Use angle1
else
    //Use angle2
1 голос
/ 13 июня 2010

Предполагая, что текущий и желаемый положительные и меньше 360:

float inc; // abs. distance from current to desired if incrementing
float dec; // abs. distance from current to desired if decrementing

if (current > desired)
{
    inc = current + 360.0f - desired; // incrementing would wrap over
    dec = current - desired;
}
else
{
    inc = desired - current;
    dec = current + 360.0f - desired; // decrementing would wrap over
}

// the expressions above are arranged so inc and dec are both +ve
// so just compare them
if (inc < dec)
    newAngle = current + step;
else 
    newAngle = current - step;
0 голосов
/ 11 июня 2010

Как правило, вы хотите проверить, какой угол дает наименьшую дугу длину (L).

alt text

alt text

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