Генерировать цвета между красным и зеленым для измерителя мощности?

Я изменил на String на этот формат:

{"methodSet": [{"methodName": 1, "methodStatus": "1"}, {"methodName": 2, "methodStatus": "1"}]}

и для кода:

  ArrayList<String> listMethod = new ArrayList<String>();    
    JSONArray arr=(JSONArray)obj.get("methodClass"); 

    if (arr != null) {
        JSONObject objMethod;
        String MethodName, MethodStatus;
        for (Object o : arr) {
            objMethod = (JSONObject) o;
            MethodName = String.valueOf(objMethod.get("methodName"));
            MethodStatus = String.valueOf(objMethod.get("methodStatus"));

            int resultMethodName = Integer.parseInt(MethodName);    
            int resultMethodStatus = Integer.parseInt(MethodStatus);    

            logWriter("MethodStatus"+resultMethodName);
            logWriter("MethodName"+resultMethodStatus);

            listMethod.add("(" + MethodName + "," + MethodStatus + ")");

            logWriter("listMethod is :     "+listMethod);  


        }
    }
133
задан Laurel 7 July 2016 в 22:23
поделиться

4 ответа

Это должно работать - просто линейно масштабируют красные и зеленые значения. Принятие Вашего макс. красного/зеленого/синего значения 255, и n находится в диапазоне 0 .. 100

R = (255 * n) / 100
G = (255 * (100 - n)) / 100 
B = 0

(Исправленный для целочисленной математики, подсказки шляпы к Ferrucio)

Другой способ сделать состоял бы в том, чтобы использовать цветовую модель HSV и циклически повторить оттенок от 0 degrees (красный) к 120 degrees (зеленый) с любой насыщенностью и значением подошел Вам. Это должно дать более приятный градиент.

Вот демонстрация каждой техники - главный градиент использует RGB, нижняя часть использует HSV:

http://i38.tinypic.com/29o0q4k.jpg

199
ответ дан 24 November 2019 в 00:01
поделиться

Необходимо линейно интерполировать (LERP) компоненты цвета. Вот то, как это сделано в целом, дано значение запуска v0, значение конца v1 и необходимое отношение (нормализованное плавание между 0,0 и 1.0):

v = v0 + ratio * (v1 - v0)

Это дает v0, когда отношение 0.0, v1, когда отношение 1.0, и все между в других случаях.

Можно сделать это или на компонентах RGB, или использующий некоторую другую цветовую схему, как HSV или HLS. Последние два будут более визуально приятны, так как они работают над оттенком и компонентами яркости, которые отображаются лучше на наше цветное восприятие.

2
ответ дан 24 November 2019 в 00:01
поделиться

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

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

Если Вы все еще хотите сделать это из кода, то, вероятно, лучше интерполировать между зелеными и желтыми цветами в левой стороне, и между желтым и красным цветом на правой стороне. В пространстве RGB, зеленом, (R=0, G=255, B=0), желтый (R=255, G=255, B=0), красный (R=255, G=0, B=0) - это предполагает, что каждый компонент цвета идет от 0 до 255.

8
ответ дан 24 November 2019 в 00:01
поделиться

Первое, что пришло на ум вот зелено-красный переход оттенка в пространстве HSV, переведенном в RGB:

blue = 0.0
if 0<=power<0.5:        #first, green stays at 100%, red raises to 100%
    green = 1.0
    red = 2 * power
if 0.5<=power<=1:       #then red stays at 100%, green decays
    red = 1.0
    green = 1.0 - 2 * (power-0.5)

Красные, зеленые, синие значения в вышеупомянутом примере являются процентами, Вы, вероятно, хотели бы умножить их на 255 для получения наиболее используемого диапазона 0-255.

32
ответ дан 24 November 2019 в 00:01
поделиться
Другие вопросы по тегам:

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