【问题标题】:How do I generate a visually distinct, non-random color from a single input number?如何从单个输入数字生成视觉上不同的非随机颜色?
【发布时间】:2014-05-07 00:47:22
【问题描述】:

在 Flash AS3 中,我将如何编写一个函数:

  • 采用整数(例如列表索引)
  • 根据该数字返回视觉上不同的十六进制颜色(并且在给定相同数字的情况下将始终返回相同的颜色)

目的是为不同长度的项目列表中的每个项目提供视觉上不同的颜色。我预计最多支持 200 人左右,但我认为大多数人的数量不会超过 20 人左右。

这是我的又快又脏:

    public static function GetAColor(idx:int):uint {
        var baseColors:Array = [0xff0000, 0x00ff00, 0xff0080, 0x0000ff, 0xff00ff, 0x00ffff, 0xff8000];
        return Math.round(baseColors[idx % baseColors.length] / (idx + 1) * 2);
    }

确实不错,但很高兴看到一组更独特的颜色在视觉上不太接近

【问题讨论】:

    标签: actionscript-3 colors dynamically-generated


    【解决方案1】:

    您可以使用支持种子的随机值生成器,这样您就可以返回相同的颜色。至于颜色,您可以构建它 - 通过 randomValue * 0xFFFFFF,其中 randomValue 介于 0 和 1 之间。并排除接近的值(颜色)。

    第二个选项:使用步骤 - 0xFFFFFF / 200 构建 200 种颜色的调色板,并使用预定义的逻辑随机播放调色板,因此您将拥有相同的颜色。

    第三种选择:至于真正不同的颜色,您可以在每个频道中使用big jumps。示例:0xFF * 0.2 - 每个通道 5 步。

    第四个选项:使用 HSV。很容易理解(观看图像,将色调从 0 旋转到 360,将饱和度和值从 0 更改为 100)如何操作参数以获得不同的颜色:

    //Very simple demo, where I'm only rotating Hue
    var step:uint = 15;
    var position:uint = 0;
    var colors:Array = [];
    
    for (; position < 360; position += step) {
        colors.push(HSVtoRGB(position, 100, 100));
    }
    
    //Visualisation for demo
    var i:uint, len:uint = colors.length, size:uint = 40, shape:Shape, posX:uint, posY:uint;
    
    for (i; i < len; ++i) {
        shape = new Shape();
        shape.graphics.beginFill(colors[i]);
        shape.graphics.drawRect(0, 0, size, size);
        addChild(shape);
        shape.x = posX;
        shape.y = posY;
        posX += size;
        if (posX + size >= stage.stageWidth) {
            posX = 0;
            posY += size;
        }
    }
    
    public function HSVtoRGB(h:Number, s:Number, v:Number):uint {
        var r:Number = 0;
        var g:Number = 0;
        var b:Number = 0;
    
        var tempS:Number = s / 100;
        var tempV:Number = v / 100;
    
        var hi:int = Math.floor(h / 60) % 6;
        var f:Number = h / 60 - Math.floor(h / 60);
        var p:Number = (tempV * (1 - tempS));
        var q:Number = (tempV * (1 - f * tempS));
        var t:Number = (tempV * (1 - (1 - f) * tempS));
    
        switch (hi) {
            case 0:
                r = tempV;
                g = t;
                b = p;
                break;
            case 1:
                r = q;
                g = tempV;
                b = p;
                break;
            case 2:
                r = p;
                g = tempV;
                b = t;
                break;
            case 3:
                r = p;
                g = q;
                b = tempV;
                break;
            case 4:
                r = t;
                g = p;
                b = tempV;
                break;
            case 5:
                r = tempV;
                g = p;
                b = q;
                break;
        }
    
        return (Math.round(r * 255) << 16 | Math.round(g * 255) << 8 | Math.round(b * 255));
    }
    

    最后一个,如果您想像专业人士一样完成这项任务,this wiki article 可能会对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2021-09-30
      • 2017-09-11
      • 2011-12-01
      • 2021-06-02
      • 2010-12-07
      • 2023-01-05
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      相关资源
      最近更新 更多