找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 175|回复: 0

HSV到RGB的转换公式

[复制链接]

1

主题

0

回帖

35

积分

管理员

积分
35
发表于 2024-4-17 11:29:45 | 显示全部楼层 |阅读模式
  1. static        AcCmColor angleToAcCmColor(double angle) {
  2.         double r,  g  ,b;
  3.         angleToRGB(angle, r, g, b); // 进行转换
  4.         AcCmColor color;
  5.         color.setRGB(static采用cast<unsigned char>(r * 255), static采用cast<unsigned char>(g * 255), static采用cast<unsigned char>(b * 255));
  6.         return color;
  7. }
  8. // 将角度转换为RGB值的函数
  9. static void angleToRGB(double angle, double& r, double& g, double& b) {
  10.         // 将角度转换为HSV中的Hue值(0到1之间)
  11.         double hue = angle / 360.0;
  12.         // 计算RGB值
  13.         double f;
  14.         if (hue <= 1/6.0) {
  15.                 f = hue * 6.0;
  16.                 r = 255;
  17.                 g = (5.0 - f) * 255;
  18.                 b = 0;
  19.         } else if (hue <= 1/2.0) {
  20.                 f = (hue - 1/6.0) * 6.0 + 1.0;
  21.                 r = (f - 1.0) * 255;
  22.                 g = 255;
  23.                 b = 0;
  24.         } else if (hue <= 2/3.0) {
  25.                 f = (hue - 1/2.0) * 6.0;
  26.                 g = 255;
  27.                 b = (f - 2.0) * 255;
  28.                 r = 0;
  29.         } else {
  30.                 f = (hue - 2/3.0) * 6.0 + 3.0;
  31.                 r = 0;
  32.                 g = (4.0 - f) * 255;
  33.                 b = (f - 3.0) * 255;
  34.         }
  35.         // 由于HSV到RGB的转换公式,得到的RGB值范围是[0, 255],所以直接赋值给r, g, b即可。
  36.         // 注意:这里假设输入的角度是介于0到360度之间。如果角度不在这个范围内,需要进行适当的调整。
  37. }
  38. // 将角度转换为RGB值的函数
  39. static AcCmColor angleToRGB(int angle) {
  40.         // 将角度转换为HSV中的H值(0到1之间)
  41.         float h = angle / 360.0f;
  42.         // HSV到RGB的转换公式(这里仅作为示例,并不特定于AcCmColor)
  43.         float r, g, b;
  44.         if (h == 1.0f) h = 0.9999f; // 防止除以0的错误
  45.         float f = h * 6.0f;
  46.         int i = static采用cast<int>(f);
  47.         float v = 1.0f; // 假设V(亮度)为最大值,这里不涉及亮度调整
  48.         float p = v * (1 - h); // SV坐标计算的一部分
  49.         float q = v * (1 - (f - i) * h); // SV坐标计算的一部分
  50.         float t = v * (1 - (1 - f) * h); // SV坐标计算的一部分
  51.         switch (i % 6) { // 根据H值选择RGB分量
  52.         case 0: r = v; g = t; b = p; break; // 红区域
  53.         case 1: r = q; g = v; b = p; break; // 黄区域
  54.         case 2: r = p; g = v; b = t; break; // 绿区域
  55.         case 3: r = p; g = q; b = v; break; // 青区域
  56.         case 4: r = t; g = p; b = v; break; // 蓝区域
  57.         default: r = v; g = p; b = q; break; // 紫区域(实际上这里和第一个一样)
  58.         }
  59.         // 返回AcCmColor结构或类的实例(这里仅使用RGB值作为示例)
  60.         AcCmColor  color;
  61.         color.setRGB(static采用cast<unsigned char>(r * 255), static采用cast<unsigned char>(g * 255), static采用cast<unsigned char>(b * 255));
  62.         return color;
  63. }
  64. static AcCmColor angleToRGB1(int angle) {
  65.         // 将角度转换为HSV中的H值(0到1之间)
  66.         float h = angle / 360.0f;
  67.         // HSV到RGB的转换公式(这里仅作为示例,并不特定于AcCmColor)
  68.         float r, g, b;
  69.         if (h == 1.0f) h = 0.9999f; // 防止除以0的错误
  70.         float f = h * 6.0f;
  71.         int i = static采用cast<int>(f);
  72.         float v = 1.0f; // 假设V(亮度)为最大值,这里不涉及亮度调整
  73.         float p = v * (1 - h); // SV坐标计算的一部分
  74.         float q = v * (1 - (f - i) * h); // SV坐标计算的一部分
  75.         float t = v * (1 - (1 - f) * h); // SV坐标计算的一部分
  76.         switch (i % 6) { // 根据H值选择RGB分量
  77.         case 0: r = v; g = t; b = p; break; // 红区域
  78.         case 1: r = q; g = v; b = p; break; // 黄区域
  79.         case 2: r = p; g = v; b = t; break; // 绿区域
  80.         case 3: r = p; g = q; b = v; break; // 青区域
  81.         case 4: r = t; g = p; b = v; break; // 蓝区域
  82.         default: r = v; g = p; b = q; break; // 紫区域(实际上这里和第一个一样)
  83.         }
  84.         // 返回AcCmColor结构或类的实例(这里仅使用RGB值作为示例)
  85.         AcCmColor  color;
  86.         color.setRGB(static采用cast<unsigned char>(r * 255), static采用cast<unsigned char>(g * 255), static采用cast<unsigned char>(b * 255));
  87.         return color;
  88. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2025-1-1 17:38 , Processed in 0.124423 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表