Как генерировать цвета из чисел, где близкие числа имеют контрастные цвета

У меня есть такая группа чисел:

11341
11341
11342
11342
11343
11344
11344
...
50001
50001
50002
...

Я хочу иметь возможность генерировать цвет на основе каждого уникального числа, чтобы числа, расположенные близко друг к другу, имели контрастные цвета.

Концепция: каждое из этих чисел соответствует идентификатору сеанса, я хочу, чтобы каждый сеанс был закодирован цветом, но сеансы, которые расположены близко друг к другу, не должны иметь одинаковые цвета.

Я пробовал концепцию, написанную о здесь и это работает, за исключением того, что близкие числа обычно имеют похожие цвета.

Мысли?


person Jason    schedule 11.09.2015    source источник


Ответы (2)


Мне нравится ответ Антуана Лефевра, однако у вас все еще есть проблема с двумя неконтрастными цветами, находящимися рядом друг с другом (скажем, из-за продолжительного сеанса, который переживает все свои соседние сеансы).

-- Это не то, что я рассматривал, когда писал этот вопрос, но я считаю, что это реальная проблема, которую необходимо рассмотреть.

Решение, к которому я пришел, состоит в том, чтобы создать максимально контрастную цветовую палитру, а затем использовать session_id для доступа к этой палитре.

Я взглянул на эту палитру: 22 цвета максимальной контрастности Келли [Примечание редактора : URL изменен.]

Мне это очень понравилось, потому что оно учитывает дальтонизм. Но лимита в 22 цвета мне было мало.

В итоге я использовал эту палитру: цветовой словарь из 269 цветов, максимально отличающихся от всех предыдущих цветов.

Вот мое решение (написано с использованием CPP и QT):

QColor colorForIndex(int index)
{
    static QStringList colorList = QStringList()
        << "#000000" << "#FFFF00" << "#1CE6FF" << "#FF34FF" << "#FF4A46" << "#008941" << "#006FA6" << "#A30059" << "#FFDBE5" << "#7A4900"
        << "#0000A6" << "#63FFAC" << "#B79762" << "#004D43" << "#8FB0FF" << "#997D87" << "#5A0007" << "#809693" << "#FEFFE6" << "#1B4400"
        << "#4FC601" << "#3B5DFF" << "#4A3B53" << "#FF2F80" << "#61615A" << "#BA0900" << "#6B7900" << "#00C2A0" << "#FFAA92" << "#FF90C9"
        << "#B903AA" << "#D16100" << "#DDEFFF" << "#000035" << "#7B4F4B" << "#A1C299" << "#300018" << "#0AA6D8" << "#013349" << "#00846F"
        << "#372101" << "#FFB500" << "#C2FFED" << "#A079BF" << "#CC0744" << "#C0B9B2" << "#C2FF99" << "#001E09" << "#00489C" << "#6F0062"
        << "#0CBD66" << "#EEC3FF" << "#456D75" << "#B77B68" << "#7A87A1" << "#788D66" << "#885578" << "#FAD09F" << "#FF8A9A" << "#D157A0"
        << "#BEC459" << "#456648" << "#0086ED" << "#886F4C" << "#34362D" << "#B4A8BD" << "#00A6AA" << "#452C2C" << "#636375" << "#A3C8C9"
        << "#FF913F" << "#938A81" << "#575329" << "#00FECF" << "#B05B6F" << "#8CD0FF" << "#3B9700" << "#04F757" << "#C8A1A1" << "#1E6E00"
        << "#7900D7" << "#A77500" << "#6367A9" << "#A05837" << "#6B002C" << "#772600" << "#D790FF" << "#9B9700" << "#549E79" << "#FFF69F"
        << "#201625" << "#72418F" << "#BC23FF" << "#99ADC0" << "#3A2465" << "#922329" << "#5B4534" << "#FDE8DC" << "#404E55" << "#0089A3"
        << "#CB7E98" << "#A4E804" << "#324E72" << "#6A3A4C" << "#83AB58" << "#001C1E" << "#D1F7CE" << "#004B28" << "#C8D0F6" << "#A3A489"
        << "#806C66" << "#222800" << "#BF5650" << "#E83000" << "#66796D" << "#DA007C" << "#FF1A59" << "#8ADBB4" << "#1E0200" << "#5B4E51"
        << "#C895C5" << "#320033" << "#FF6832" << "#66E1D3" << "#CFCDAC" << "#D0AC94" << "#7ED379" << "#012C58" << "#7A7BFF" << "#D68E01"
        << "#353339" << "#78AFA1" << "#FEB2C6" << "#75797C" << "#837393" << "#943A4D" << "#B5F4FF" << "#D2DCD5" << "#9556BD" << "#6A714A"
        << "#001325" << "#02525F" << "#0AA3F7" << "#E98176" << "#DBD5DD" << "#5EBCD1" << "#3D4F44" << "#7E6405" << "#02684E" << "#962B75"
        << "#8D8546" << "#9695C5" << "#E773CE" << "#D86A78" << "#3E89BE" << "#CA834E" << "#518A87" << "#5B113C" << "#55813B" << "#E704C4"
        << "#00005F" << "#A97399" << "#4B8160" << "#59738A" << "#FF5DA7" << "#F7C9BF" << "#643127" << "#513A01" << "#6B94AA" << "#51A058"
        << "#A45B02" << "#1D1702" << "#E20027" << "#E7AB63" << "#4C6001" << "#9C6966" << "#64547B" << "#97979E" << "#006A66" << "#391406"
        << "#F4D749" << "#0045D2" << "#006C31" << "#DDB6D0" << "#7C6571" << "#9FB2A4" << "#00D891" << "#15A08A" << "#BC65E9" << "#FFFFFE"
        << "#C6DC99" << "#203B3C" << "#671190" << "#6B3A64" << "#F5E1FF" << "#FFA0F2" << "#CCAA35" << "#374527" << "#8BB400" << "#797868"
        << "#C6005A" << "#3B000A" << "#C86240" << "#29607C" << "#402334" << "#7D5A44" << "#CCB87C" << "#B88183" << "#AA5199" << "#B5D6C3"
        << "#A38469" << "#9F94F0" << "#A74571" << "#B894A6" << "#71BB8C" << "#00B433" << "#789EC9" << "#6D80BA" << "#953F00" << "#5EFF03"
        << "#E4FFFC" << "#1BE177" << "#BCB1E5" << "#76912F" << "#003109" << "#0060CD" << "#D20096" << "#895563" << "#29201D" << "#5B3213"
        << "#A76F42" << "#89412E" << "#1A3A2A" << "#494B5A" << "#A88C85" << "#F4ABAA" << "#A3F3AB" << "#00C6C8" << "#EA8B66" << "#958A9F"
        << "#BDC9D2" << "#9FA064" << "#BE4700" << "#658188" << "#83A485" << "#453C23" << "#47675D" << "#3A3F00" << "#061203" << "#DFFB71"
        << "#868E7E" << "#98D058" << "#6C8F7D" << "#D7BFC2" << "#3C3E6E" << "#D83D66" << "#2F5D9B" << "#6C5E46" << "#D25B88" << "#5B656C"
        << "#00B57F" << "#545C46" << "#866097" << "#365D25" << "#252F99" << "#00CCFF" << "#674E60" << "#FC009C" << "#92896B";

    int colorIndex = index % colorList.size();
    return QColor(colorList.value(colorIndex, "white"));
}
person Jason    schedule 15.09.2015

Вы можете вычислить цветовой код RGB на основе идентификатора сеанса. Чтобы иметь контрастные цвета, просто вычислите идентификатор сеанса mod 3 и на основе этого значения (0, 1 или 2) измените логику, чтобы назначить значения R, G, B.

Пример:

switch(session_id mod 3){
case 0: R = session_id mod 256; G = (session_id / 256) mod 256;B = (session_id / 65536) mod 256;
case 1: G = session_id mod 256; B = (session_id / 256) mod 256;R = (session_id / 65536) mod 256;
case 2: B = session_id mod 256; R = (session_id / 256) mod 256;G = (session_id / 65536) mod 256;

конечно, вы можете адаптировать формулу для расчета значений RGB.

person Antoine Lefebvre    schedule 14.09.2015