Objective c 按当前时间计算两个整数值

Objective c 按当前时间计算两个整数值,objective-c,algorithm,Objective C,Algorithm,我有点受不了了。我想确定两个不透明度int值。一个应按小时增加,另一个应按小时减少 想象一天由4部分组成。夜晚,日出,白天和日落。每一部分都由 重叠的两个图像。夜晚有一个夜晚图像和一个日出图像。在午夜,图像的不透明度为255,而日出实际上是看不见的 当时间流逝到例如4点钟时,夜间图像的不透明度降低,而日出的不透明度增加。在5点钟,夜晚结束,图像不透明度为0,而日出图像的不透明度为255 所以在这四个部分中,我想计算两个不透明度值,一个增加,另一个减少。在每个部分中,不透明度从255变为0,在另一

我有点受不了了。我想确定两个不透明度int值。一个应按小时增加,另一个应按小时减少

想象一天由4部分组成。夜晚,日出,白天和日落。每一部分都由 重叠的两个图像。夜晚有一个夜晚图像和一个日出图像。在午夜,图像的不透明度为255,而日出实际上是看不见的

当时间流逝到例如4点钟时,夜间图像的不透明度降低,而日出的不透明度增加。在5点钟,夜晚结束,图像不透明度为0,而日出图像的不透明度为255

所以在这四个部分中,我想计算两个不透明度值,一个增加,另一个减少。在每个部分中,不透明度从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只有一次。但我希望每天的每一部分都是这样


有什么想法吗?如何确定每个零件的不透明度?

看起来您需要一些旧的模运算。你的一天被分成四段,每段六小时;每个小时都要更改一些值,并且每个段中相应的小时都具有相同的值

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

// Avoid magic numbers
#define MAX_OPACITY 255
#define HOURS_PER_SEGMENT 6
#define OPACITY_STEP (MAX_OPACITY / HOURS_PER_SEGMENT)
请注意,如果将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;
您还可以取消
开关

int segment_index = shifted_hour / 6;

[self setSegment:segment_index withOpacityIn:opacIn withOpacityOut:opacOut];