Назначение цвета эллипсу на основе его скорости - PullRequest
0 голосов
/ 21 января 2019

У меня есть n объектов шара (каждый из которых начинается со случайной скорости (0,4)) на экране (в 2D), которые движутся друг о друга, сталкиваясь друг с другом. Я хочу назначить каждому шару цвет в зависимости от его скорости, чтобы у шаров с наивысшей скоростью (скажем, v) был синий цвет, а цвет становился все более красным по мере снижения скорости (промежуточные скорости принимают диапазон цветов радуги). Я понимаю, что это проблема преобразования диапазона.

Как мне это сделать?

Я попытался определить величину скорости мяча и изменить ее масштаб до диапазона (0,255). Затем я использую метод заливки, чтобы придать цвет шарам.

public void display(){

    float v = sqrt(pow(this.getDX(),2)+pow(this.getDY(),2));
    int scale = (int)(v * 255)/8;
    stroke(0);

    fill(scale,0,scale);   
    ellipse(this.xpos, this.ypos, this.size ,this.size);
  }
}

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

1 Ответ

0 голосов
/ 21 января 2019

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

Прочитайте о цветовой гамме HSL и HSV и напишите метод, который преобразует значение hue в диапазон [0.0, 1.0] вцвет RGB и устанавливает цвет fill():

public void SetFillFromHUE(float hue) {

    float R = Math.abs(hue * 6.0 - 3.0) - 1.0;
    float G = 2.0 - Math.abs(hue * 6.0 - 2.0);
    float B = 2.0 - Math.abs(hue * 6.0 - 4.0);
    fill(R*255.0, G*255.0, B*255.0); 
}

Я исследовал, что значение v всегда находится в диапазоне [0, 10,0] (из вашего предыдущего вопроса Багги прыгающие шарики .

Итак,

float v = sqrt(pow(this.getDX(),2)+pow(this.getDY(),2)) / 10.0;

даст значение, зависящее от скорости v в диапазоне [0,0, 1,0].

Расследованиецветовой диапазон оттенок показывает, что 0,0 - красный, а 0,66 - синий.

SetFillFromHUE(v * 2.0/3.0);

устанавливает цвет от красного до желтого, от зеленого до синего.

Окончательный метод display выглядит следующим образом:

public void display(){

    float v = sqrt(pow(this.getDX(),2)+pow(this.getDY(),2)) / 10.0;

    stroke(0);
    SetFillFromHUE( v * 4.0/6.0 ); 
    ellipse(this.xpos, this.ypos, this.size ,this.size);
}

...