【发布时间】:2020-06-04 10:24:06
【问题描述】:
我有一个函数可以计算给定 rgb 值的色调。对于某些值,acos 返回 NaN,因为该参数略大于 1。这段代码遵循我在网上找到的大多数公式,但我不知道为什么会弹出 NaN。
例子是
40 28 28
40 28 28
40 28 28
49 25 25
46 34 34
40 28 28
42 24 24
42 24 24
40 22 22
40 22 22
#include <math.h>
double hue(unsigned char r, unsigned char g, unsigned char b) {
double rn = (double) r / (r + g + b);
double gn = (double) g / (r + g + b);
double bn = (double) b / (r + g + b);
if (rn == gn && gn == bn) {
return 0;
}
double h = acos((rn - gn + rn - bn) / (2.0 * sqrt((rn - gn) * (rn - gn) + (rn - bn) * (gn - bn))));
// issue with the argument of acos being just slightly bigger than 1. Approximate to 0
if (isnan(h)) {
h = 0;
}
if (b > g) {
return (2 * M_PI - h) * (180.0 / M_PI);
} else {
return h * (180.0 / M_PI);
}
}
【问题讨论】: