Рассчитать два значения int по текущему времени - PullRequest
1 голос
/ 24 июня 2011

Я немного застрял с этим. Я хочу определить два значения непрозрачности int. Один должен увеличиваться, а другой уменьшаться на час.

Представьте себе, день состоит из 4 частей. Ночь, восход, день и закат. Каждая из частей изображена два изображения, которые наложены. Ночь имеет изображение ночи и изображение восхода солнца. В полночь ночью изображение имеет непрозрачность, скажем, 255, а восход фактически невидим.

В то время как время истекает, например, В 4 часа ночи непрозрачность изображения снижается, а непрозрачность восхода увеличивается. В 5 часов ночь заканчивается с непрозрачностью изображения 0, в то время как изображение восхода имеет непрозрачность 255.

Итак, в каждой из 4 частей я хочу вычислить два значения непрозрачности, одно увеличивая, а другое уменьшая. В каждой части непрозрачность изменяется от 255 до 0, а с другой стороны - от 0 до 255.

Вот так я разделяю детали в часах

switch (hour) {
        //night to sunrise
        case 23: case 0: case 1: case 2: case 3: case 4:
            [self setSetting:1 andOpacity:opacIn andOpacity:opacOut];
            break;
        //sunrise to day
        case 5: case 6: case 7: case 8: case 9: case 10:
            [self setSetting:1 andOpacity:opacIn andOpacity:opacOut];
            break;
        //day to sunset
        case 11: case 12: case 13: case 14: case 15: case 16:
            [self setSetting:4 andOpacity:opacIn andOpacity:opacOut];
            break;
        //sunset to night
        case 17: case 18: case 19: case 20: case 21: case 22:
            [self setSetting:2 andOpacity:opacIn andOpacity:opacOut];
            break;
    }

Я пробовал это с этим решением

int opacIn = hour * 10;

if (opacIn >= 230) {
    opacIn += 25;
}

int opacOut = 255 - opacIn;

Проблема в том, что это определяет непрозрачность по отношению ко всему дню. Таким образом, он идет от 255 до 0 только один раз. Но я хочу, чтобы это было так для каждой части дня.

Есть идеи по этому поводу? Как я могу определить непрозрачность для каждой части?

1 Ответ

3 голосов
/ 24 июня 2011

Похоже, вам нужна черта старой модульной арифметики.Ваш день разбит на четыре сегмента по шесть часов каждый;каждый час вы хотите изменить какое-либо значение, и соответствующие часы в каждом сегменте имеют одно и то же значение.

Итак, сначала разделите целевое значение на количество шагов:

// Avoid magic numbers
#define MAX_OPACITY 255
#define HOURS_PER_SEGMENT 6
#define OPACITY_STEP (MAX_OPACITY / HOURS_PER_SEGMENT)

Примечаниечто если вы прочитаете case s вашего оператора switch как столбцы, то каждое значение в столбце будет иметь тот же результат по модулю 6. Это ключ;каждый раз, когда вы проверяете время, выясните, какая ваша позиция в текущем сегменте:

// For purposes of opacity, it's as if 11PM is the first hour of the day
int shifted_hour = hour + 1;
if( 24 == shifted_hour) shifted_hour = 0;
int segment_pos = shifted_hour % HOURS_PER_SEGMENT;

Теперь вы получаете значение непрозрачности довольно просто:

int opacIn = segment_pos * OPACITY_STEP;
int opacOut = MAX_OPACITY - opacIn;

Вы также можете отменитьс switch:

int segment_index = shifted_hour / 6;

[self setSegment:segment_index withOpacityIn:opacIn withOpacityOut:opacOut];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...