Как преобразовать градусы (угол) в число - PullRequest
1 голос
/ 26 января 2012

У меня есть изображение, которое содержит 40 повернутых изображений.

С индексом изображения, начинающимся с 0. 0-39.

Вот код, который преобразует 0-39 в градусы

int image_direction = 0; //Can be 0-39
int facing_degrees = (int)(360.0 * (-(image_direction- 10.0))/40.0);
while(facing_degrees < 0)
    facing_degrees += 360;
while (facing_degrees > 360)
    facing_degrees -= 360;

Так что да, он также может выдавать отрицательные градусы, а также градусы свыше 360. Так вот почему есть 2 цикла while.

Теперь я хочу обратить вспять этот процесс, указав, что я задаю 90градусов я хотел бы получить обратно 0 ..

Я думал о том, чтобы сделать что-то вроде

 if(degrees == 90 || degrees >= 80 && degrees <= 99)
    image_direction = 0;
 elseif(degrees == 100 || degrees >= 91 && degrees <= 109)
    image_direction = 39;
//etc.......

Ну, я не очень хорош в математике, ну, я забыл о таких вещах.

Мне интересно, как вы можете повернуть функцию, которая выдает градусы из image_direction, для запуска в обратном направлении в простом уравнении, чтобы избежать огромного случая операторов if.

Вот некоторые результаты rotation results

Image Index = 0 Image Degree = 90
Image Index = 1 Image Degree = 81
Image Index = 2 Image Degree = 72
Image Index = 3 Image Degree = 63
Image Index = 4 Image Degree = 54
Image Index = 5 Image Degree = 45
Image Index = 6 Image Degree = 36
Image Index = 7 Image Degree = 27
Image Index = 8 Image Degree = 18
Image Index = 9 Image Degree = 9
Image Index = 10 Image Degree = 0
Image Index = 11 Image Degree = 351
Image Index = 12 Image Degree = 342
Image Index = 13 Image Degree = 333
Image Index = 14 Image Degree = 324
Image Index = 15 Image Degree = 315
Image Index = 16 Image Degree = 306
Image Index = 17 Image Degree = 297
Image Index = 18 Image Degree = 288
Image Index = 19 Image Degree = 279
Image Index = 20 Image Degree = 270
Image Index = 21 Image Degree = 261
Image Index = 22 Image Degree = 252
Image Index = 23 Image Degree = 243
Image Index = 24 Image Degree = 234
Image Index = 25 Image Degree = 225
Image Index = 26 Image Degree = 216
Image Index = 27 Image Degree = 207
Image Index = 28 Image Degree = 198
Image Index = 29 Image Degree = 189
Image Index = 30 Image Degree = 180
Image Index = 31 Image Degree = 171
Image Index = 32 Image Degree = 162
Image Index = 33 Image Degree = 153
Image Index = 34 Image Degree = 144
Image Index = 35 Image Degree = 135
Image Index = 36 Image Degree = 126
Image Index = 37 Image Degree = 117
Image Index = 38 Image Degree = 108
Image Index = 39 Image Degree = 99
Image Index = 0 Image Degree = 90
Image Index = 1 Image Degree = 81
Image Index = 2 Image Degree = 72
Image Index = 3 Image Degree = 63
Image Index = 4 Image Degree = 54
Image Index = 5 Image Degree = 45
Image Index = 6 Image Degree = 36
Image Index = 7 Image Degree = 27
Image Index = 8 Image Degree = 18

Ответы [ 2 ]

1 голос
/ 26 января 2012

Из вашего сопоставления входных данных и выходных данных я вставил их в Excel и выяснил, что формула для вычисления градусов выглядит следующим образом:

RawDegrees = 90 - (index * 9)

Затем, обрезав это до 0 ... 360 (оберните с помощью цикла while), вы получите окончательный результат в градусах. Формула, чтобы инвертировать это, найдена, переставляя вышеупомянутое, чтобы сделать Индекс предметом

    RawDegrees - 90 = - (index * 9) --- 1
    RawDegrees/9.0 - 10 = -index    --- 2

    Therefore
    index = 10 - Degrees/9.0

Это даст вам следующее отображение

    Degree  Discovered Index
    90      0
    81      1
    72      2
    63      3
    54      4
    45      5
    36      6
    27      7
    18      8
    9       9
    0       10
    351     -29
    342     -28
    333     -27
    324     -26
    315     -25
    306     -24
    297     -23
    288     -22
    279     -21
    270     -20
    261     -19
    252     -18
    243     -17
    234     -16
    225     -15
    216     -14
    207     -13
    198     -12
    189     -11
    180     -10
    171     -9
    162     -8
    153     -7
    144     -6
    135     -5
    126     -4
    117     -3
    108     -2
    99      -1
    90      0
    81      1
    72      2
    63      3
    54      4
    45      5
    36      6
    27      7
    18      8

Все, что вам нужно сделать, это выполнить обтекание, чтобы обрезать ответ до 0..39, например

index = index < 0 ? index + 40 : index;

чтобы получить правильный вывод.

Кстати, ваш индекс индекса в градусах может быть разложен следующим образом, чтобы получить тот же результат (действительно для входов 0..39)

int facing_degrees = (int)(90.0 - (image_direction * 9.0));    
facing_degrees = facing_degrees < 0 ? facing_degrees + 360 : facing_degrees;
1 голос
/ 26 января 2012

хм, почему бы не использовать что-то похожее на «формулу в процентах» с небольшой подстройкой:

image_direction = (int)(((float)(degrees-90) / 360) * 40) % 40;
if (image_direction < 0)
    image_direction += 40; // for negative integers

Разбивка формулы;мы делим градусы на 360 и умножаем на 40, чтобы получить правильное изображение с заданной степенью, затем используем оператор по модулю, чтобы сохранить направление изображения в диапазоне 0-39 для градусов> +360 или <-360 и, наконец, если степеньбыло отрицательным image_direction окажется отрицательным, поэтому добавление 40 к нему исправит image_direction. </p>

Надеюсь, это поможет.

Редактировать: О, извините, я, кажется, пропустил часть о степени 90 == индекс изображения 0, достаточно легко добавить сюда, просто вычтите 90 из фактической степени (код отредактирован выше)

...