RGB কালার রেঞ্জ ইন্টিজার রূপে দেওয়া থাকলে; টাস্ক হলো RGB কালার রেঞ্জকে কনভার্ট করে উপযুক্ত HSV কালার বের করা।
RGB কালার মডেল কী?
RGB কালার মডেল তিনটি রঙে গঠিত: লাল (Red), সবুজ (Green) এবং নীল (Blue)। RGB মডেল একটি কালার মডেল যা ডিসপ্লে টেকনোলজিতে ব্যাপকভাবে ব্যবহৃত হয়; এটি একটি অ্যাডিটিভ মডেল যেখানে এই তিনটি রঙকে ভিন্ন ইন্টেনসিটিতে যোগ করে ডিসপ্লে ডিভাইসে মিলিয়ন মিলিয়ন রঙ তৈরি করা হয়।
HSV কালার মডেল কী?
HSV কালার মডেল تشکیل হয় হিউ (Hue), স্যাচুরেশন (Saturation), ভ্যালু (Value) — যাকে HSB (Hue, Saturation, Brightness) ও বলা হয়। HSV হলো RGB কালার মডেলের একটি বিকল্প রিপ্রেজেন্টেশন। এটি মানব দৃষ্টি কীভাবে রঙ অনুভব করে সেটির সাথে সন্নিবেশ করা হয়েছে। এই কালার মডেল আর্টিস্টরা অধিক ব্যবহার করেন কারণ এর প্রাকৃতিক রঙ স্কিম। HSV-এর তিনটি অ্যাট্রিবিউট অ্যাডিটিভ এবং সাবট্র্যাক্টিভ দুটি হতে পারে।
প্রোগ্রামে আমাদের কী করতে হবে
ইউজার থেকে RGB মডেলের মান ইনপুট নিয়ে তারপর গাণিতিকভাবে HSV কালার মডেলে আউটপুট ক্যালকুলেট করতে হবে।
উদাহরণ
ইনপুট: r = 31, g = 52, b = 29 আউটপুট: h s v = (114.782608, 44.230770, 20.392157) ইনপুট: r = 129, g = 88, b = 47 আউটপুট: h s v=(30.000000, 63.565895, 50.588238)
দেওয়া সমস্যা সমাধানের জন্য আমরা যে পদ্ধতি ব্যবহার করব −
- ৩টি রঙ Red(r), Green(g) এবং Blue(b)-এ ইনপুট নেওয়া।
- সব কালার ভ্যালুকে ২৫৫ দিয়ে ভাগ করা।
- এখন cmax, cmin এবং ডিফারেন্স ক্যালকুলেট করা।
- চেক করুন −
- যদি cmax এবং cmin ০-এর সমান হয়, তবে Hue বা h হবে ০।
- যদি cmax Red(r)-এর সমান হয় তবে Hue(h) = (60 * ((g – b) / diff) + 360) % 360।
- যদি cmax Green(g)-এর সমান হয় তবে Hue(h) = (60 * ((b – r) / diff) + 120) % 360।
- যদি cmax Blue(b)-এর সমান হয় তবে Hue(h) = (60 * ((r – g) / diff) + 240) % 360।
- স্যাচুরেশন বের করতে চেক করুন −
- যদি cmax = 0 হয় তবে Saturation (s) = 0।
- যদি cmax শূন্য নয় তবে Saturation (s) = (diff/cmax)*100
- Value কম্পিউটেশন −
- Value (v) = cmax * 100
অ্যালগরিদম
Start
ধাপ ১ → function float max(float a, float b, float c) এ
Return (a > b)? (a > c ? a : c) : (b > c ? b : c)
ধাপ ২ → function float min(float a, float b, float c) এ
Return (a < b)? (a < c ? a : c) : (b < c ? b : c)
ধাপ ৩ → 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 সেট
If cmax == cmin then,
h = 0 সেট
End if
Else if cmax == r then,
h = fmod((60 * ((g - b) / diff) + 360), 360.0) সেট
End Else if
Else if cmax == g then,
h = fmod((60 * ((b - r) / diff) + 120), 360.0) সেট
End Else if
Else if cmax == b then,
h = fmod((60 * ((r - g) / diff) + 240), 360.0) সেট
End Else if
If cmax == 0 then,
s = 0 সেট
End if
Else
s = (diff / cmax) * 100 সেট
End Else
v = cmax * 100;
Print h, s, v
ধাপ ৪ → int main(int argc, char const *argv[]) এ
r = 45, g = 215, b = 0 ডিক্লেয়ার ও ইনিশিয়ালাইজ
rgb_to_hsv(r, g, b) ফাংশন কল
Stop
উদাহরণ
#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 ভ্যালু ২৫৫ দিয়ে ভাগ করে
// রেঞ্জ 0..255 থেকে 0..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 শূন্য হয়
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;
}
// main ফাংশন
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)