HSV到RGB的转换公式
static AcCmColor angleToAcCmColor(double angle) {double r,g,b;
angleToRGB(angle, r, g, b); // 进行转换
AcCmColor color;
color.setRGB(static采用cast<unsigned char>(r * 255), static采用cast<unsigned char>(g * 255), static采用cast<unsigned char>(b * 255));
return color;
}
// 将角度转换为RGB值的函数
static void angleToRGB(double angle, double& r, double& g, double& b) {
// 将角度转换为HSV中的Hue值(0到1之间)
double hue = angle / 360.0;
// 计算RGB值
double f;
if (hue <= 1/6.0) {
f = hue * 6.0;
r = 255;
g = (5.0 - f) * 255;
b = 0;
} else if (hue <= 1/2.0) {
f = (hue - 1/6.0) * 6.0 + 1.0;
r = (f - 1.0) * 255;
g = 255;
b = 0;
} else if (hue <= 2/3.0) {
f = (hue - 1/2.0) * 6.0;
g = 255;
b = (f - 2.0) * 255;
r = 0;
} else {
f = (hue - 2/3.0) * 6.0 + 3.0;
r = 0;
g = (4.0 - f) * 255;
b = (f - 3.0) * 255;
}
// 由于HSV到RGB的转换公式,得到的RGB值范围是,所以直接赋值给r, g, b即可。
// 注意:这里假设输入的角度是介于0到360度之间。如果角度不在这个范围内,需要进行适当的调整。
}
// 将角度转换为RGB值的函数
static AcCmColor angleToRGB(int angle) {
// 将角度转换为HSV中的H值(0到1之间)
float h = angle / 360.0f;
// HSV到RGB的转换公式(这里仅作为示例,并不特定于AcCmColor)
float r, g, b;
if (h == 1.0f) h = 0.9999f; // 防止除以0的错误
float f = h * 6.0f;
int i = static采用cast<int>(f);
float v = 1.0f; // 假设V(亮度)为最大值,这里不涉及亮度调整
float p = v * (1 - h); // SV坐标计算的一部分
float q = v * (1 - (f - i) * h); // SV坐标计算的一部分
float t = v * (1 - (1 - f) * h); // SV坐标计算的一部分
switch (i % 6) { // 根据H值选择RGB分量
case 0: r = v; g = t; b = p; break; // 红区域
case 1: r = q; g = v; b = p; break; // 黄区域
case 2: r = p; g = v; b = t; break; // 绿区域
case 3: r = p; g = q; b = v; break; // 青区域
case 4: r = t; g = p; b = v; break; // 蓝区域
default: r = v; g = p; b = q; break; // 紫区域(实际上这里和第一个一样)
}
// 返回AcCmColor结构或类的实例(这里仅使用RGB值作为示例)
AcCmColorcolor;
color.setRGB(static采用cast<unsigned char>(r * 255), static采用cast<unsigned char>(g * 255), static采用cast<unsigned char>(b * 255));
return color;
}
static AcCmColor angleToRGB1(int angle) {
// 将角度转换为HSV中的H值(0到1之间)
float h = angle / 360.0f;
// HSV到RGB的转换公式(这里仅作为示例,并不特定于AcCmColor)
float r, g, b;
if (h == 1.0f) h = 0.9999f; // 防止除以0的错误
float f = h * 6.0f;
int i = static采用cast<int>(f);
float v = 1.0f; // 假设V(亮度)为最大值,这里不涉及亮度调整
float p = v * (1 - h); // SV坐标计算的一部分
float q = v * (1 - (f - i) * h); // SV坐标计算的一部分
float t = v * (1 - (1 - f) * h); // SV坐标计算的一部分
switch (i % 6) { // 根据H值选择RGB分量
case 0: r = v; g = t; b = p; break; // 红区域
case 1: r = q; g = v; b = p; break; // 黄区域
case 2: r = p; g = v; b = t; break; // 绿区域
case 3: r = p; g = q; b = v; break; // 青区域
case 4: r = t; g = p; b = v; break; // 蓝区域
default: r = v; g = p; b = q; break; // 紫区域(实际上这里和第一个一样)
}
// 返回AcCmColor结构或类的实例(这里仅使用RGB值作为示例)
AcCmColorcolor;
color.setRGB(static采用cast<unsigned char>(r * 255), static采用cast<unsigned char>(g * 255), static采用cast<unsigned char>(b * 255));
return color;
}
页:
[1]