我的代码有什么问题以获取正确的梯度
What is wrong with my code to get correct GRADIENT?
我在舍入结果方面有问题。我有梯度矩阵,我的结果几乎与假设相同。几乎。
我尝试使用地板/圆形/天花板,但没有任何改善。
uint16_t t1=0,t2=0,t3=0;
float a,b,c;
uint16_t value=0;
for (int j = 0; j < count; j++) {
t1 = ceil(rgbLeft->r +(floor((rgbRight->r - rgbLeft->r) * j) / (count-1)));
t2 = ceil(rgbLeft->g +(floor((rgbRight->g - rgbLeft->g) * j) / (count-1)));
t3 = ceil(rgbLeft->b + (floor(rgbRight->b - rgbLeft->b) * j) / (count-1));
value = (t1 << 11) | (t2 << 5) | (t3);
vec.push_back(value);
}
输入
计数始终是16。这是尺寸矩阵16x8。我把结构放在类似的地方:
typedef struct{
unsigned int r:5;
unsigned int g:6;
unsigned int b:5;
}RGB;
rgbleft和rgbright是RGB结构。例如,输入是1和16。我得到了行:
在此示例的输入是1 16 16 1.(启动顶部,端顶,启动底部,末端底部(。
首先,我从输入(1,16,16,1((val是启动顶部(rgbleft(,end stop(rgbright(
rgb->r = (val >> 11);
rgb->g = (val >> 5);
rgb->b = (val);
之后我使用
uint16_t t1=0,t2=0,t3=0;
float a,b,c;
uint16_t value=0;
for (int j = 0; j < count; j++) {
t1 = ceil(rgbLeft->r +(floor((rgbRight->r - rgbLeft->r) * j) / (count-1)));
t2 = ceil(rgbLeft->g +(floor((rgbRight->g - rgbLeft->g) * j) / (count-1)));
t3 = ceil(rgbLeft->b + (floor(rgbRight->b - rgbLeft->b) * j) / (count-1));
value = (t1 << 11) | (t2 << 5) | (t3);
vec.push_back(value);
}
最后我得到了:
在0002 0002 0003 0004 0005 0006 0006 0006 0007 0008 0008 0009 000A 000A 000B 000B 000C 000D 000d
strong> 0009 000A 000A 000B 000C0006 0006 0006 0006 0007 0007 0007 0007 0008 0008 0008 0008 0008 0009 0009 0009 0009 0009 0009 000A p> 0008 0008 0008 0008 0008 0008 0008 0008 0008 0008 0008 0008 0008 0008 0008 0008 0008 0008 0008
>000C 000B 000A 000A 0009 0009 0008 0008 0007 0007 0007 0007 0006 0006 <0006 <0006 <0006 0005 0005 0004 0004
000E 000D 000C 000B 000A 000A 0009 0009 0008 0007 0006 0006 0005 0004 0004 0003 0002 0002 0002 0002
0002 00020010 000F 000E 000D 000C 000B 000A 0009 0009 0008 0007 0006 0005 0005 0004 0003 0002 0002 0001
但是我认为(??(我必须有这样的东西:
在0002 0003 0004 0005 0005 0006 0007 0007 0008 0008 0008 0009 000A 000B 000B 000B 000C 000D 000D 000D
strong> 000A 000A 000B 000B 000C0006 0006 0007 0007 0007 0007 0008 0008 0008 0008 0009 0009 0009 0009 0009 0009 0009 000A 000A> 000A p> 0008 0008 0008 0008 0008 0008 0008 0008 0008 0008 0008 0008 0008 0008 0008 0008 0008 0008 0008
000A 000A 0009 0009 0009 0008 0008 0008 0008 0007 0007 0007 > 000C 000B 000B 000A 000A 0009 0009 0008 0008 0008
000E 000D 000C 000B 000B 000A 0009 0009 0008 0008 0007 0006 0005 0005 0004 0004 0004 0003 0002 0002
00020010 000F 000E 000D 000C 000B 000A 0009 0009 0008 0007 0006 0005 0005 0004 0003 0002 0002 0001
例如输入0 0 3200 1800是可以的...
这是测试每行的示例代码:
https://wandbox.org/permlink/bdkxrjxytq6lhhmg
编辑。
我更改了一点代码:
uint8_t t1=0,t2=0,t3=0;
int a=0,b=0,c=0;
uint16_t value=0;
for (int j = 0; j < count; j++) {
t1 =round(rgbLeft->r + (((floor(rgbRight->r - rgbLeft->r) * j) / (count-1))));
t2 =round(rgbLeft->g + (((floor(rgbRight->g - rgbLeft->g) * j) / (count-1))));
t3 =round(rgbLeft->b + (((floor(rgbRight->b - rgbLeft->b) * j) / (count-1))));
value = (t1 << 11) | (t2 << 5) | (t3);
vec.push_back(value);
}
我得到
在0002 0003 0004 0004 0005 0006 0007 0007 0008 0008 0008 0009 000a在在
0008 0008 0008 0008 0008 0008 0008 0008 0008 0008 0008 0008 0008 0008 0008 0008 0008 0008 0008
000A 000A 0009 0009 0009 0009 0008 0008 0008 0008 0008 0007 0007 0007 0007 0007 0007 0006 0006
000C 000B 000B 000A 000A 0009 0009 0008 0008 0007 0007 0007 0006 0006 0006 0005 0005 0004
000E 000D 000C 000C 000B 000A 0009 0008 0008 0008 0007 0006 0006 0005 0004 0004 0003 0003 0002
0010 000F 000E 000D 000C 000B 000A 0009 0009 0008 0007 0006 0005 0005 0004 0003 0002 0002 0001
假设只有4点差异!
编辑:
tl:1
TR 16
bl 16
br 1
RGB RGBtl, RGBtr, RGBbl, RGBbr;
std::vector<uint16_t> firstColumn,lastColumn;
valueToColorRGB(&RGBtl,tl);
valueToColorRGB(&RGBtr,tr);
valueToColorRGB(&RGBbl,bl);
valueToColorRGB(&RGBbr,br);
colorRGBtoVector(firstColumn,&RGBtl,&RGBbl,size.height);
colorRGBtoVector(lastColumn,&RGBtr,&RGBbr,size.height);
for (int j = 0; j < size.height; j++) {
tl = firstColumn[j];
tr = lastColumn[j];
valueToColorRGB(&RGBtl,tl);
valueToColorRGB(&RGBtr,tr);
colorRGBtoVector2(vec3,&RGBtl,&RGBtr,size.width);
}
valueToColorRGB(RGB *rgb, const uint16_t &val){
rgb->r = (val >> 11);
rgb->g = (val >> 5);
rgb->b = (val);
}
colorRGBtoVector2(std::vector<uint16_t> &vec, RGB *rgbLeft, RGB *rgbRight, const uint16_t &count){
uint8_t t1=0,t2=0,t3=0;
int a=0,b=0,c=0;
uint16_t value=0;
for (int j = 0; j < count; j++) {
t1 =(rgbLeft->r + ((floor(rgbRight->r - rgbLeft->r) * j) / (count-1)));
t2 =(rgbLeft->g + ((floor(rgbRight->g - rgbLeft->g) * j) / (count-1)));
t3 =(rgbLeft->b + ((floor(rgbRight->b - rgbLeft->b) * j) / (count-1)));
value = (t1 << 11) | (t2 << 5) | (t3);
vec.push_back(value);
}
}
您的实际问题似乎归结为:
idk为什么(14-2( * 1/15 2 = 2
这是从从中得出的值中获取的:
-
rgbRight
:14U -
rgbLeft
:2U -
count
:16 -
j
:1
问题中的方程式: t3 = ceil(rgbLeft->b + (floor(rgbRight->b - rgbLeft->b) * j) / (count-1))
将按以下顺序播放:
-
rgbRight->b - rgbLeft->b
:12U -
floor(rgbRight->b - rgbLeft->b)
:12.0 -
floor(rgbRight->b - rgbLeft->b) * j
:12.0 -
count - 1
:15 -
(floor(rgbRight->b - rgbLeft->b) * j) / (count-1)
:0.8 -
rgbLeft->b + (floor(rgbRight->b - rgbLeft->b) * j) / (count-1)
:2.8 -
ceil(rgbLeft->b + (floor(rgbRight->b - rgbLeft->b) * j) / (count-1))
:3.0
最后,分配 back t3
会被忽略的警告,返回 3U not 2U 2U。
我相信您的链接测试仪不使用double
S :(unsigned int)start.b + (((stop.b - start.b) * i) / (elems - 1))
,它将按以下顺序播放:
-
(unsigned int)start.b
:2U -
stop.b - start.b
:12U -
(stop.b - start.b) * i
:12 -
elems - 1
:15 -
((stop.b - start.b) * i) / (elems - 1)
:0 -
(unsigned int)start.b + (((stop.b - start.b) * i) / (elems - 1))
:2U
这是注释 5 在此列表中执行整数部门的关键并返回 0.8 。
- visual c++,如何获取解决方案目录中的代码
- 我无法获取以下代码的输出
- 有没有办法通过使用十进制 ASCII 代码自动类型扣除来获取字符?
- 获取 clang++:错误:在编译文件系统库的代码时
- 如何在 WSL 上获取 VS 代码以调试我的C++代码?
- 如何在使用 LLVM 编译时获取部分源代码的二进制代码
- 代码在执行之前终止,并且没有从用户那里获取输入
- 有没有办法在c ++中清除空数组,请检查下面的代码以获取说明
- 如何在C++中执行命令并获取命令的返回代码标准输出和标准
- 如何获取代码::块以在代码::块重新启动后保持库的配置?
- 有什么方法可以从Visual Studio 2017中的Catch C++测试中获取代码覆盖率指标?
- C++初学者.获取代码中的错误
- 如何在C++中获取代码片段的位置
- *&在这里做什么?如何更改它以获取代码作为 void binaryTree::insert(binaryNode *root,string value)?可能吗?
- 如何获取md5sum命令并获取代码中的字符串输出
- HLSL 获取代码中的线程组和线程数
- gdb 从哪里获取代码行
- 我可以从语言偏好中获取代码页吗
- 使用XMM寄存器和内存获取(c++代码)比只使用XMM寄存器的ASM快两倍——为什么?
- 从*nix系统获取C++代码中的特定文件