algorytm.org

Implementacja w C/C++



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Transformacja HSV RGB - Implementacja w C/C++
Ocena użytkownikóww: *****  / 11
SłabyŚwietny
Nadesłany przez Tomasz Lubiński, 06 września 2005 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.

Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.

hsv_rgb.cpp:
/*
  Transformacja pomiedzy modelami HSV i RGB
  www.algorytm.org
  (c)2005 Tomasz Lubinski
*/

#include <stdio.h>
#include <math.h>

#define MIN(a,b) ((a)<(b)?(a):(b))
#define MAX(a,b) ((a)>(b)?(a):(b))

float* hsv2rgb(float hue, float sat, float val) {
        float red, grn, blu;
        float i, f, p, q, t;
        float *result = new float[3];

        if(val==0) {
                red = 0;
                grn = 0;
                blu = 0;
        } else {
                hue/=60;
                i = floor(hue);
                f = hue-i;
                p = val*(1-sat);
                q = val*(1-(sat*f));
                t = val*(1-(sat*(1-f)));
                if (i==0) {red=val; grn=t; blu=p;}
                else if (i==1) {red=q; grn=val; blu=p;}
                else if (i==2) {red=p; grn=val; blu=t;}
                else if (i==3) {red=p; grn=q; blu=val;}
                else if (i==4) {red=t; grn=p; blu=val;}
                else if (i==5) {red=val; grn=p; blu=q;}
        }
        result[0] = red;
        result[1] = grn;
        result[2] = blu;
        return result;
}

float *rgb2hsv(float red, float grn, float blu){
        float hue, sat, val;
        float x, f, i;
        float *result = new float[3];

        x = MIN(MIN(red, grn), blu);
        val = MAX(MAX(red, grn), blu);
        if (x == val){
                hue = 0;
                sat = 0;
        }
        else {
                f = (red == x) ? grn-blu : ((grn == x) ? blu-red : red-grn);
                i = (red == x) ? 3 : ((grn == x) ? 5 : 1);
                hue = fmod((i-f/(val-x))*60, 360);
                sat = ((val-x)/val);
        }
        result[0] = hue;
        result[1] = sat;
        result[2] = val;
        return result;
}

void main(void) {
        int x;
        float h,s,v;
        float r,g,b;
        float *result;

        printf("1. Dla transformacji HSV -> RGB\n");
        printf("2. Dla transformacji RGB -> HSV\n");
        scanf("%d", &x);
        if (x == 1){
                printf("H=");
                scanf("%f", &h);
                printf("S=");
                scanf("%f", &s);
                printf("V=");
                scanf("%f", &v);
                result = hsv2rgb(h,s,v);
                printf("R=%f, G=%f, B=%f", result[0], result[1], result[2]);
        }
        else {
                printf("R=");
                scanf("%f", &r);
                printf("G=");
                scanf("%f", &g);
                printf("B=");
                scanf("%f", &b);
                result = rgb2hsv(r,g,b);
                printf("H=%f, S=%f, V=%f", result[0], result[1], result[2]);
        }

        scanf("%d");
}
Komentarze
photo
+10 # Krzysiek C++ 2012-08-17 07:43
Taki krótki i wydawało by się prosty kod, a tu już są wycieki pamięci. Tragedia! Kto w takich funkcjach, które pewnie będą wywoływane setki razy na sekundę, alokuje pamięć dynamicznie? Kto zwraca z funkcji gołe wskaźniki?! Przecież tu się prosi o zwrócenie trójelementowej struktury! Kto porównuje floaty do konkretnej wartości (bez epsilona)?

Jeśli to tylko kod przykładowy, który ma obrazować działanie algorytmu, to powinien być opatrzony wielkim czerwonym napisem: "Dzieci, nie róbcie tego w domu!". A i tak lepiej to wtedy opisać ładnym pseudokodem.
Odpowiedz | Odpowiedz z cytatem | Cytować
Dodaj komentarz