Как узнать, когда увеличить или уменьшить угол, чтобы получить определенный угол?

Я программирую игру и попал в очень трудную ситуацию. В основном у меня есть круг, и у меня есть 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 часов, пытаясь понять это.


person Thomas    schedule 11.06.2010    source источник


Ответы (3)


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

alt text

альтернативный текст

person Nick Dandoulakis    schedule 11.06.2010
comment
Потрясающе спасибо. Только что выяснил, что означает первый символ в уравнении. - person Thomas; 11.06.2010
comment
@Thomas: я рад, что смог помочь. Вы имеете в виду a? Это угол, измеряемый в градусах. Если у вас есть угол в радианах, то тип проще: L = theta * r - person Nick Dandoulakis; 11.06.2010
comment
Этот ответ бесполезен. Поскольку r, pi и 180 являются константами, вы, по сути, говорите используйте тот угол, который меньше — вот с чем у него проблемы! - person BlueRaja - Danny Pflughoeft; 12.06.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;
person Pete Kirkham    schedule 12.06.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
person BlueRaja - Danny Pflughoeft    schedule 11.06.2010