天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 26|回复: 0

HSV到RGB的转换公式

[复制链接]
  • TA的每日心情
    开心
    12 小时前
  • 签到天数: 79 天

    [LV.6]常住居民II

    1543

    主题

    198

    回帖

    214748万

    积分

    管理员

    积分
    2147483647
    发表于 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. }
    复制代码

     

     

     

     

    HSV到RGB的转换公式
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|中国膜结构网_中国空间膜结构协会

    GMT+8, 2024-5-12 21:48 , Processed in 0.098985 second(s), 21 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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