【问题标题】:Map integer to color in rainbow spectrum将整数映射到彩虹光谱中的颜色
【发布时间】:2015-10-04 07:22:12
【问题描述】:

我想为二维网格中的 k 个点簇着色。现在我使用的是一种幼稚的方法。

我是用RGB来设置颜色的,G分量是固定的,R是逐渐倒数的,B是逐渐递增的。所以第一个集群的 R 设置为 255,最后一个集群设置为 0,B 反之亦然。

int r = 255, g = 80, b = 0;
// do stuff
int step = 255 / k;
// loop over data
int cluster = getCurrentCluster();
int currentR = r - (cluster * step);
int currentG = g;
int currentB = b + (cluster * step);

当前的解决方案是有效的。可以通过颜色来区分集群

但我不喜欢它,我更喜欢彩虹色或至少更丰富的光谱。

我怎样才能做到这一点?如何将区间 [0, k) 中的整数映射到符合我要求的颜色?

我想到的另一种方法是将整数映射到给定间隔内的波长,例如400 nm 到 800 nm(如果我没记错的话,大概应该是彩虹光谱)并将波长转换为 RGB。

【问题讨论】:

  • R、G 和 B 的 3 种不同噪声函数怎么样?
  • 我不认为代码在某个地方可供我们使用?
  • @TartanLlama 嗯,不确定。这是一个讲座的作业,也有在 GPU 上运行的组件。我会问我是否可以发布它,也许只有CPU的东西
  • @Brett Sry,您能详细说明一下吗?我不太明白这将如何导致彩虹光谱。
  • @mike 抱歉,它不会提供彩虹光谱,但它至少应该提供更丰富的光谱,因为您将为所有 3 个颜色分量生成值

标签: c++ colors


【解决方案1】:

如果您想将线性范围映射到类似彩虹的光谱,那么您最好从 HSV 等颜色空间开始,然后转换为 RGB。

Here你找到转化详情

【讨论】:

  • 这是个好主意。我试试看。
【解决方案2】:

HSV 会给出最好的结果,但需要三角函数。

相反,考虑三个函数:

  1. R:r = x < 256 ? 255 - x : x < 512 ? 0 : x - 512
  2. G:g = x < 256 ? x : x < 512 ? 512 - x : 0
  3. 乙:b = x < 256 ? 0 : x < 512 ? x - 256 : 768 - x

这些可能更容易和更快,虽然不太美观(不是很好的黄色、橙色等)

【讨论】:

  • 什么是 x?它是什么域?
  • 这从功能上应该很明显了。
  • 所以 x 等于簇 * 步数,正如我在上面使用的那样
  • 与您的代码中的不完全相同,但几乎相同。还要注意整数除法!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-02
  • 2016-02-01
  • 1970-01-01
  • 2011-07-05
相关资源
最近更新 更多