【问题标题】:Calculate two int values by current time按当前时间计算两个 int 值
【发布时间】:2011-06-25 08:12:10
【问题描述】:

我有点坚持这一点。我想确定两个 opacity 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 一次。但我希望一天中的每一天都这样。

对此有什么想法吗?如何确定每个部分的不透明度?

【问题讨论】:

    标签: objective-c algorithm


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      • 2020-06-30
      • 2022-01-23
      • 1970-01-01
      • 2013-07-16
      相关资源
      最近更新 更多