HSV modele barw

0

mam funkcjektora prezentuje modele barw hsv
Czy ktoś mogły mi wytlumaczyć skąd te wzorki się wzięły? i dlaczego w petlach są takie warunki ? np

  for(double S = 0; S < 1; S+= 0.001666)
void MainWindow::on_HSlider_valueChanged(int value)
{
    double R, G, B;
    double H = (double)value;
    double C;
    double X;
    double m;

    ui->SSlider->setValue(0);
    ui->VSlider->setValue(0);

    for(double S = 0; S < 1; S+= 0.001666){
        for(double V = 0; V < 1; V+=0.001666){
            C = V * S;
            X = C * (1.0 - fabs((double)moduloDouble(H/60.0, 2)-1.0));
            m = V - C;
            if(H < 60 && H >= 0){
                R = C;
                G = X;
                B = 0;
            }else if(H >= 60 && H < 120){
                R = X;
                G = C;
                B = 0;
            }else if(H >= 120 && H < 180){
                R = 0;
                G = C;
                B = X;
            }else if(H >= 180 && H < 240){
                R = 0;
                G = X;
                B = C;
            }else if(H >= 240 && H < 300){
                R = X;
                G = 0;
                B = C;
            }else if(H >= 300 && H <= 360){
                R = C;
                G = 0;
                B = X;
            }
            red = (double)(R + m) * 255.0;
            green = (double)(G + m) * 255.0;
            blue = (double)(B + m) * 255.0;
            zapalPiksel(S*600,V * 600);

        }
    }
    update();

}

void MainWindow::on_SSlider_valueChanged(int value)
{
    double R, G, B;
    double S = (double)value / 100;
    double C;
    double X;
    double m;

    ui->HSlider->setValue(0);
    ui->VSlider->setValue(0);

    for(double H = 0; H < 360; H+=0.16){
        for(double V = 0; V < 1; V+=0.001666){
            C = S * V;
            X = C * (1 - fabs(moduloDouble(H/60.0, 2)-1));
            m = V - C;
            if(H < 60 && H >= 0){
                R = C;
                G = X;
                B = 0;
            }else if(H >= 60 && H < 120){
                R = X;
                G = C;
                B = 0;
            }else if(H >= 120 && H < 180){
                R = 0;
                G = C;
                B = X;
            }else if(H >= 180 && H < 240){
                R = 0;
                G = X;
                B = C;
            }else if(H >= 240 && H < 300){
                R = X;
                G = 0;
                B = C;
            }else if(H >= 300 && H < 360){
                R = C;
                G = 0;
                B = X;
            }
            red = (R + m) * 255;
            green = (G + m) * 255;
            blue = (B + m) * 255;
            zapalPiksel(1.6667*H,V * 600);

        }
    }
    update();
}

void MainWindow::on_VSlider_valueChanged(int value)
{
    double R, G, B;
    double V = (double)value/100.0;
    double C;
    double X;
    double m;

    ui->HSlider->setValue(0);
    ui->SSlider->setValue(0);

    for(double H = 0; H < 360; H+=0.6){
        for(double S = 0; S < 1; S+=0.001666){
            C = S * V;
            X = C * (1 - fabs(moduloDouble(H/60.0, 2)-1));
            m = V - C;
            if(H < 60 && H >= 0){
                R = C;
                G = X;
                B = 0;
            }else if(H >= 60 && H < 120){
                R = X;
                G = C;
                B = 0;
            }else if(H >= 120 && H < 180){
                R = 0;
                G = C;
                B = X;
            }else if(H >= 180 && H < 240){
                R = 0;
                G = X;
                B = C;
            }else if(H >= 240 && H < 300){
                R = X;
                G = 0;
                B = C;
            }else if(H >= 300 && H < 360){
                R = C;
                G = 0;
                B = X;
            }
            red = (R + m) * 255;
            green = (G + m) * 255;
            blue = (B + m) * 255;
            zapalPiksel(1.6667*H,S * 600);
        }
    }
    update();
}

i dodatkowo jak działa funkcja i po co ona jest ?

double moduloDouble(double value, int mod){
    while(value - (double)mod > 0){
        value -= (double)mod;
    }
    return value;
}
1

Zapewne ze wzorów na konwersję formatów RGB <=> HSV
Ale Bracie dcielak na Peruna ci takie wzory skoro używasz Qt gdzie tam masz ładną klasę QColor, a w niej konwersje w te i nazad do każdego formatu jaki dusza zapragnie?

0

Dostaliśmy taki kod na wykładzie i chciałbym go przeanalizować ale coś nie bardzo :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1