按当前时间计算两个int值

时间:2011-06-24 17:18:38

标签: objective-c algorithm

我对此感到有些困惑。我想确定两个不透明度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 个答案:

答案 0 :(得分:3)

看起来你需要一些旧的模块算术。你的一天被分为四个部分,每部分六个小时;您希望每小时更改一些值,并且每个段中的相应小时数具有相同的值。

首先,将目标值除以步数:

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

请注意,如果您将switch语句的case作为列读取,则列中的每个值都具有相同的结果模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];