我的代码有什么问题以获取正确的梯度

What is wrong with my code to get correct GRADIENT?

本文关键字:获取 代码 什么 问题 我的      更新时间:2023-10-16

我在舍入结果方面有问题。我有梯度矩阵,我的结果几乎与假设相同。几乎。

我尝试使用地板/圆形/天花板,但没有任何改善。

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 000C

0006 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 0002

0010 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 000C

0006 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

0007 0007 0007 0007 00066 0006 0005 0005 0004

000E 000D 000C 000B 000B 000A 0009 0009 0008 0008 0007 0006 0005 0005 0004 0004 0004 0003 0002 0002

0002

0010 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))将按以下顺序播放:

  1. rgbRight->b - rgbLeft->b:12U
  2. floor(rgbRight->b - rgbLeft->b):12.0
  3. floor(rgbRight->b - rgbLeft->b) * j:12.0
  4. count - 1:15
  5. (floor(rgbRight->b - rgbLeft->b) * j) / (count-1):0.8
  6. rgbLeft->b + (floor(rgbRight->b - rgbLeft->b) * j) / (count-1):2.8
  7. 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)),它将按以下顺序播放:

  1. (unsigned int)start.b:2U
  2. stop.b - start.b:12U
  3. (stop.b - start.b) * i:12
  4. elems - 1:15
  5. ((stop.b - start.b) * i) / (elems - 1):0
  6. (unsigned int)start.b + (((stop.b - start.b) * i) / (elems - 1)):2U

这是注释 5 在此列表中执行整数部门的关键并返回 0.8