Как да разбера кога да увелича или намаля ъгъла, за да получа определен ъгъл?

Програмирам игра и стигнах до много трудно място. По принцип имам окръжност и имам 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) .

алтернативен текст

алтернативен текст

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