【发布时间】:2018-11-27 15:27:10
【问题描述】:
这是我的 C++ 代码。它工作得很好,但我很好奇在优化和代码清晰度方面我做错了什么。您还可以帮助我理解为什么“警告:将浮点与 == 或 != 进行比较是不安全的”吗?
感谢您的宝贵时间:)
这是 RGB 到 HSV:
struct hsv_struct {
float h=0,s=0,v=0;
};
struct rgb_struct {
float r=0,g=0,b=0;
};
hsv_struct rgb_to_hsv(hsv_struct hsv,rgb_struct rgb){
rgb.r = rgb.r/255.0f;
rgb.g = rgb.g/255.0f;
rgb.b = rgb.b/255.0f;
float max=0,min=0;
if(rgb.r>rgb.g && rgb.r>rgb.b){ max=rgb.r;
if(rgb.g<rgb.b) min=rgb.g;
else min=rgb.b;
}
else if(rgb.g>rgb.b){ max=rgb.g;
if(rgb.b<rgb.r) min=rgb.b;
else min=rgb.r;
}
else{ max=rgb.b;
if(rgb.r<rgb.g) min=rgb.r;
else min=rgb.g;
}
if (rgb.r==max) hsv.h=(rgb.g-rgb.b)/(max-min);
else if(rgb.g==max) hsv.h=(2.0f+(rgb.b-rgb.r)/(max-min));
else if(rgb.b==max) hsv.h=(4.0f+(rgb.r-rgb.g)/(max-min));
hsv.h = hsv.h * 60;
if(hsv.h<0) hsv.h = hsv.h+360;
hsv.s = (max-min) / max;
if (max==0) hsv.s=0;
hsv.v=max;
return hsv;
}
这里是 HSV 到 RGB:
rgb_struct hsv_to_rgb(hsv_struct hsv,rgb_struct rgb){
float p, q, t, ff;
long i;
if(hsv.v==0.00000f) {
rgb.r = 0;
rgb.g = 0;
rgb.b = 0;
}
else {
if(hsv.h >= 360.0) hsv.h = 0.0;
hsv.h /= 60.0;
i = floor(hsv.h);
ff = hsv.h - i;
p = hsv.v * (1.0f - hsv.s);
q = hsv.v * (1.0f - (hsv.s * ff));
t = hsv.v * (1.0f - (hsv.s * (1.0f - ff)));
switch(i){
case 0:
rgb.r = hsv.v;
rgb.g = t;
rgb.b = p;
break;
case 1:
rgb.r = q;
rgb.g = hsv.v;
rgb.b = p;
break;
case 2:
rgb.r = p;
rgb.g = hsv.v;
rgb.b = t;
break;
case 3:
rgb.r = p;
rgb.g = q;
rgb.b = hsv.v;
break;
case 4:
rgb.r = t;
rgb.g = p;
rgb.b = hsv.v;
break;
case 5:
default:
rgb.r = hsv.v;
rgb.g = p;
rgb.b = q;
break;
}
}
rgb.r*=255;
rgb.g*=255;
rgb.b*=255;
return rgb;
}
别介意我来这里是为了愚弄“主要是代码”的错误!..我工作吗?
【问题讨论】:
-
如果代码真的“工作得非常好”,并且您只想查看此工作代码(以改进它),那么我建议您改为在CodeReview 上发帖。别忘了先检查what you can ask about there。
-
编译器不相信你在 0.00000f 上的测试是洁净的。这很可疑,添加更多零并不能使其更准确。 if (hsv.v
-
感谢您的建议,我也将在那里发布我的代码。
-
谢谢汉斯!固定并记住:)
标签: c++ image-processing optimization coding-style code-cleanup