【问题标题】:how to assign data in Byte type array如何在字节类型数组中分配数据
【发布时间】:2020-01-02 12:51:38
【问题描述】:

这是 3dcpptutorials 光线追踪的代码段。有人可以解释一下这行代码是如何工作的吗?

据我了解,如果小于0,则存储0,如果大于1,则存储255,如果介于两者之间,则存储value * 255,类似的东西。我说的对吗?

colorbuffer[2] = Color.r <= 0.0f ? 0 : Color.r >= 1.0 ? 255 : (BYTE)(Color.r * 255);
colorbuffer[1] = Color.g <= 0.0f ? 0 : Color.g >= 1.0 ? 255 : (BYTE)(Color.g * 255);
colorbuffer[0] = Color.b <= 0.0f ? 0 : Color.b >= 1.0 ? 255 : (BYTE)(Color.b * 255);

【问题讨论】:

  • 是的。此操作通常称为“夹紧”。
  • 该代码将每个颜色分量从0.01.0 范围内的浮点值转换为0255 之间的整数值。

标签: c++ conditional-operator


【解决方案1】:

正确。由于?: 运算符的right-to-left associativity,该行

colorbuffer[2] = Color.r <= 0.0f ? 
    0 : Color.r >= 1.0 ? 255 : (BYTE)(Color.r * 255);

相当于这个:

colorbuffer[2] = Color.r <= 0.0f ? 
    0 : (Color.r >= 1.0 ? 255 : (BYTE)(Color.r * 255));

这又相当于下面的if-else 块:

if (Color.r <= 0.0f) 
    colorbuffer[2] = 0;
else {
    if (Color.r >= 1.0) 
        colorbuffer[2] = 255;
    else
        colorbuffer[2] = (BYTE)(Color.r * 255);
}

标准库中有std::clamp 函数可以完成这种工作:

colorbuffer[2] = (BYTE)(std::clamp(Color.r, 0.f, 1.f) * 255);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 2019-02-24
    • 2014-11-22
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    相关资源
    最近更新 更多