admin 发表于 2024-4-17 11:29:45

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]
查看完整版本: HSV到RGB的转换公式