English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
与えられたRGB色範囲(整数形式);RGB色範囲をHSV色に変換するタスク
RGB色モデルは赤、緑、青の3つの色で構成されています。RGBモデルは表示技術で広く使用される色モデルです。これは累加モデルであり、異なる強度のこれらの3つの色を加算して、表示デバイス上に数百万種類の異なる色を生成します。
HSV色モデルは色相、飽和度、値を含みます。またHSB(色相、飽和度、明度)と呼ばれます。HSVはRGB色モデルの代替表示です。人間の視覚感知に基づいて調整されています。自然な配色スキーマにより、この色モデルは芸術家によってよく使用されます。HSVの3つの属性は加算および減算ができます。
ユーザーからRGBモデルの値を取得し、それを数学的に計算してHSV色モデルの出力を得なければなりません。
入力: r = 31, g = 52b = 29 出力: h s v = (114.782608, 44.230770, 20.392157) 入力: r = 129, g = 88b = 47 出力: h s v=(30.000000, 63.565895, 50.588238)
私たちが問題を解決するために使用する方法-
赤(r)、緑(g)および青(b)の3つの色で入力されます。
すべての色値を除以255。
今、cmax、cminおよび差を計算します。
確認します-
もしcmaxとcminが0に等しい場合、色相またはhは0になります。
もしcmaxがRed(r)に等しい場合、色相(h)=(60 *((g – b)/ diff)+ 360)%360。
もしcmaxがGreen(g)に等しい場合、色相(h)=(60 *((b – r)/ diff)+ 120)%360。
もしcmaxがBlue(b)に等しい場合、色相(h)=(60 *((r – g)/ diff)+ 240)%360。
飽和度を見つけるために、以下を確認します-
もしcmaxが0の場合、飽和度(s)は0です。
cmaxが0でない場合、則は饱和度(s) = (diff / cmax)* 100
値計算-
値(v) = cmax * 100
開始 ステップ 1 -> function float max(float a, float b, float c) return (a > b) ? (a > c ? a : c) : (b > c ? b : c) ステップ 2 -> function float min(float a, float b, float c) return (a < b) ? (a < c ? a : c) : (b < c ? b : c) ステップ 3 -> function int rgb_to_hsv(float r, float g, float b) 変数 float h, s, v を宣言する r = r / 255.0 g = g / 255.0 b = b / 255.0 cmax = max(r, g, b) cmin = min(r, g, b) diff = cmax-cmin cmax == cmin なら、 h = 0 if 終了 Else if cmax == r なら、 h = fmod((60 * ((g - b) / diff) + 360), 360.0) Else if 終了 Else if cmax == g なら、 h = fmod((60 * ((b - r) / diff) + 120), 360.0) Else if 終了 Else if cmax == b なら、 h = fmod((60 * ((r - g) / diff) + 240), 360.0) Else if 終了 cmax == 0 なら、 s = 0 if 終了 Else s = (diff / cmax) * 100 Else End v = cmax * 100; h, s, v を表示する ステップ 4 -> int main(int argc, char const *argv[]) 変数 r を宣言し初期化する 45, g = 215, b = 0 function rgb_to_hsv(r, g, b) を呼び出す 停止
#include <stdio.h> #include <math.h> float max(float a, float b, float c) { return ((a > b) ? (a > c ? a : c) : (b > c ? b : c)); } float min(float a, float b, float c) { return ((a < b)? (a < c ? a : c) : (b < c ? b : c)); } int rgb_to_hsv(float r, float g, float b) { //R,G,B値を除く255- //範囲を0..に変更する2550..に変更する1: float h, s, v; r /= 255.0; g /= 255.0; b /= 255.0; float cmax = max(r, g, b); // r, g, b の最大値 float cmin = min(r, g, b); // r, g, b の最小値 float diff = cmax-cmin; // cmax と cmin の差 if (cmax == cmin) h = 0; else if (cmax == r) h = fmod((60 * ((g - b) / diff) + 360), 360.0); else if (cmax == g) h = fmod((60 * ((b - r) / diff) + 120), 360.0); else if (cmax == b) h = fmod((60 * ((r - g) / diff) + 240), 360.0); //もし cmax が 0 なら if (cmax == 0) s = 0; else s = (diff / cmax) * 100; //計算v- v = cmax * 100; printf("h s v=(%f, %f, %f)\n", h, s, v ); return 0; } //主要機能 int main(int argc, char const *argv[]) { int r = 45, g = 215, b = 0; rgb_to_hsv(r, g, b); return 0; }
出力結果
h s v=(107.441864, 100.000000, 84.313728)