Алгоритм для преобразования любого положительного целого числа в значение RGB

Есть много способов, по которым люди рекомендуют использовать SharedPreferences. Я сделал демо-проект здесь . Ключевой момент в выборке - использовать ApplicationContext & amp; единый объект sharedpreferences. Это демонстрирует, как использовать SharedPreferences со следующими функциями: -

  • Использование класса singelton для доступа / обновления SharedPreferences
  • Не нужно передавать контекст всегда для чтения / записи SharedPreferences
  • Он использует apply () вместо commit ()
  • apply () - это asynchronus save, ничего не возвращает, он обновляет значение в памяти сначала & amp; изменения записываются на диск позже асинхронно.
  • commit () является синхронизирующим, он возвращает true / false на основе результата. Изменения записываются на диск синхронно
  • работает в версиях android 2.3+

Пример использования, как показано ниже: -

MyAppPreference.getInstance().setSampleStringKey("some_value");
String value= MyAppPreference.getInstance().getSampleStringKey();

Get исходный код здесь & amp; Подробные API можно найти здесь здесь на developer.android.com

21
задан Richard 3 March 2010 в 13:18
поделиться

6 ответов

Вам нужно сначала найти диапазон этих значений, чтобы получить минимальное и максимальное значения. Затем вам нужно создать цветовую шкалу, как в строке ниже этого изображения. Вы можете поэкспериментировать с различными функциями, чтобы отобразить целое число в RGB. Вам нужно 3 функции R (X), G (X), B (X). Глядя на изображение ниже, оно выглядит как пики B (X) в середине, пики R (X) в конце, а зеленый - где-то еще. Если вы уверены, что никогда не получите два (RGB) для некоторого значения X, то вы получите свое преобразование.

alt text
(источник: globalwarmingart.com )

РЕДАКТИРОВАТЬ Подумайте об этом, вы можете взять образец круга вокруг пространства YUV. alt text http://www.biocrawler.com/w/images/e/ec/Yuv.png

Или даже просто скачайте цветную полосу с высоким разрешением и сэмплируйте ее.

РЕДАКТИРОВАТЬ 2: Я только что столкнулся с генерацией цветных полос и вспомнил код цветовой полосы MATLAB / Octave. Я нанес их на карту и получил следующее изображение. alt text

21
ответ дан 29 November 2019 в 20:09
поделиться

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

// scale colour temp relatively

function getColourTemp(maxVal, minVal, actual) {
    var midVal = (maxVal - minVal)/2;
    var intR;
    var intG;
    var intB = Math.round(0);

    if (actual >= midVal){
         intR = 255;
         intG = Math.round(255 * ((maxVal - actual) / (maxVal - midVal)));
    }
    else{
        intG = 255;
        intR = Math.round(255 * ((actual - minVal) / (midVal - minVal)));
    }

    return to_rgb(intR, intG, intB);
}
2
ответ дан 29 November 2019 в 20:09
поделиться

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

Я думаю, что вам придется просмотреть ваши данные хотя бы один раз, чтобы получить минимальное/максимальное значение или узнать их заранее. Получив их, вы можете нормализовать их соответствующим образом и использовать любое количество цветовых схем. Простейшим решением будет указать что-то вроде "hue" и преобразовать из HSV в RGB.

2
ответ дан 29 November 2019 в 20:09
поделиться

Простой алгоритм

// given a max and min value
float red,green,blue;
float range=max-min;
float mid=(max+min)/2.0;

//foreach value
    red = (value[ii]-mid)/range;            
    if (red>0.0) {
        //above mid = red-green
        blue=0.0;
        green = 1.0-red;
    } else {
        // lower half green-blue
        blue=-red;
        green = 1.0-blue;
        red=0.0;
    }

}

Более сложный:
Если ваш диапазон составляет несколько миллионов, но большинство из них около 0, вы хотите масштабировать его так, чтобы «красный» в приведенном выше примере был журналом расстояние от середины. Код немного сложнее, если значения равны +/-

// assume equally distributed around 0 so max is the largest (or most negative number)
float range = log(fabs(max));
float mid=0.0

// foreach value
if (value[ii] > 0.0 ) {
    // above mid = red-green
    red = log(value[ii])/range;
    blue=0.0;
    green = 1.0 - red;
} else {
    // below mid = green-blue
    blue=-log(value[ii])/range;
    green = 1.0 - blue;
   red = 0.0;
}

. Примечание - я не тестировал этот код, просто вертелся идеями!

-1
ответ дан 29 November 2019 в 20:09
поделиться

человек, вы, вероятно, могли бы использовать цветовое пространство YUV и только для демонстрационных целей преобразовать его в RGB.

0
ответ дан 29 November 2019 в 20:09
поделиться

Вы хотите преобразовать значения данных в частоту света:

  • меньшая длина волны = более холодные цвета = голубоватые
  • более высокая длина волны = более теплые цвета = более красные

частоты видимого света варьируются от 350 нм (фиолетовый) до 650 нм (красный):

alt text
(источник: gamonline.com )

Следующая функция преобразует числа в указанном вами диапазоне в диапазон видимый свет, затем получает rgb:

function DataPointToColor(Value, MinValue, MaxValue: Real): TColor;
var
   r, g, b: Byte;
   WaveLength: Real;
begin
   WaveLength := GetWaveLengthFromDataPoint(Value, MinValue, MaxValue);
   WavelengthToRGB(Wavelength, r, g, b);
   Result := RGB(r, g, b);
end;

С помощью функции, которую я записал в верхней части моей головы:

function GetWaveLengthFromDataPoint(Value: Real; MinValues, MaxValues: Real): Real;
const
   MinVisibleWaveLength = 350.0;
   MaxVisibleWaveLength = 650.0;
begin
   //Convert data value in the range of MinValues..MaxValues to the 
   //range 350..650

   Result := (Value - MinValue) / (MaxValues-MinValues) *
         (MaxVisibleWavelength - MinVisibleWavelength) +
         MinVisibleWaveLength;
end;

И функцию , которую я нашел в Интернете , которая преобразует длину волны в RGB:

PROCEDURE WavelengthToRGB(CONST Wavelength:  Nanometers;
                          VAR R,G,B:  BYTE);
  CONST
    Gamma        =   0.80;
    IntensityMax = 255;
  VAR
    Blue   :  DOUBLE;
    factor :  DOUBLE;
    Green  :  DOUBLE;
    Red    :  DOUBLE;
  FUNCTION Adjust(CONST Color, Factor:  DOUBLE):  INTEGER;
  BEGIN
    IF   Color = 0.0
    THEN RESULT := 0     // Don't want 0^x = 1 for x <> 0
    ELSE RESULT := ROUND(IntensityMax * Power(Color * Factor, Gamma))
  END {Adjust};
BEGIN
  CASE TRUNC(Wavelength) OF
    380..439:
      BEGIN
        Red   := -(Wavelength - 440) / (440 - 380);
        Green := 0.0;
        Blue  := 1.0
      END;
    440..489:
      BEGIN
        Red   := 0.0;
        Green := (Wavelength - 440) / (490 - 440);
        Blue  := 1.0
      END;
    490..509:
      BEGIN
        Red   := 0.0;
        Green := 1.0;
        Blue  := -(Wavelength - 510) / (510 - 490)
      END;
    510..579:
      BEGIN
        Red   := (Wavelength - 510) / (580 - 510);
        Green := 1.0;
        Blue  := 0.0
      END;
    580..644:
      BEGIN
        Red   := 1.0;
        Green := -(Wavelength - 645) / (645 - 580);
        Blue  := 0.0
      END;
    645..780:
      BEGIN
        Red   := 1.0;
        Green := 0.0;
        Blue  := 0.0
      END;
    ELSE
      Red   := 0.0;
      Green := 0.0;
      Blue  := 0.0
  END;
  // Let the intensity fall off near the vision limits
  CASE TRUNC(Wavelength) OF
    380..419:  factor := 0.3 + 0.7*(Wavelength - 380) / (420 - 380);
    420..700:  factor := 1.0;
    701..780:  factor := 0.3 + 0.7*(780 - Wavelength) / (780 - 700)
    ELSE       factor := 0.0
  END;
  R := Adjust(Red,   Factor);
  G := Adjust(Green, Factor);
  B := Adjust(Blue,  Factor)
END {WavelengthToRGB}; 

Пример использования:

Набор данных в диапазоне 10..65000000. И эта конкретная точка данных имеет значение 638,328:

color = DataPointToColor(638328, 10, 65000000);
11
ответ дан 29 November 2019 в 20:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: