【问题标题】:Wrong colors on shaded triangle阴影三角形上的颜色错误
【发布时间】:2012-10-07 20:58:32
【问题描述】:

我试图画一个阴影三角形,但我得到了错误的颜色。这是我得到的示例,如果我调用一个带有红色、绿色和蓝色的函数:

左上角应该是红色,右上角应该是绿色,下上角应该是蓝色。但正如你所看到的,颜色不是那样的。我应该得到这样的东西:

代码如下:

unsigned RGB(unsigned char R, unsigned char G, unsigned B){
    return  (R << 16) | (G << 8) | B;
}

    float get_dist(int x1, int y1, int x2, int y2){
            int xproj = x2-x1;
            int yproj = y2-y1;
            float dist = sqrt(pow(xproj, 2) + pow(yproj, 2));
            return dist;
    }
    unsigned char getR(unsigned c){
            return (c >> 16) & 0xFF;
    }
    unsigned char getG(unsigned c){
            return (c >> 8) & 0xFF;
    }
    unsigned char getB(unsigned c){
            return c & 0xFF;
    }
    void draw_ftriangle(SDL_Surface * s, int x0, int y0, unsigned c0, int x1, int y1, unsigned c1, int x2, int y2, unsigned c2){
            int x;
            signed d0, d1, d2;
            unsigned R, G, B, color;
            int ymin = min(y0, min(y1, y2));
            int xmin = min(x0, min(x1, x2));
            int ymax = max(y0, max(y1, y2));
            int xmax = max(x0, max(x1, x2));
            draw_line(s, x0, y0, x1, y1, color);
            draw_line(s, x1, y1, x2, y2, color);
            draw_line(s, x0, y0, x2, y2, color);
            for(; ymin < ymax; ymin++)
                    for(x=xmin; x < xmax; x++)
                            if(ptintr(x, ymin, x0, y0, x1, y1, x2, y2)){
                                    d0 = get_dist(x, ymin, x0, y0);
                                    d1 = get_dist(x, ymin, x1, y1);
                                    d2 = get_dist(x, ymin, x2, y2);
                                    R = d0+d1+d2 == 1 ? getR(c0)*d0 + getR(c1)*d1 + getR(c2)*d2 :
                                                                             (getR(c0)*d0 + getR(c1)*d1 + getR(c2)*d2)/(d0+d1+d2);
                                    G = d0+d1+d2 == 1 ? getG(c0)*d0 + getG(c1)*d1 + getG(c2)*d2 :
                                                                            (getG(c0)*d0 + getG(c1)*d1 + getG(c2)*d2)/(d0+d1+d2);
                                    B = d0+d1+d2 == 1 ? getB(c0)*d0 + getB(c1)*d1 + getB(c2)*d2 :
                                                                            (getB(c0)*d0 + getB(c1)*d1 + getB(c2)*d2)/(d0+d1+d2);
                                    color = RGB(R, G, B);
                                    put_pixel(s, x, ymin, color);
                            }
    }

我这样调用函数 drraw_ftriangle:

draw_ftriangle(表面, 100, 100, RGB(255, 0, 0), 235, 150, RGB(0, 255, 0), 4, 254, RGB(0, 0, 255));

我不确定,但我认为问题应该在这里:

R = (d0+d1+d2) == 1 ? getR(c0)*d0 + getR(c1)*d1 + getR(c2)*d2 :
                      (getR(c0)*d0 + getR(c1)*d1 + getR(c2)*d2)/(d0+d1+d2);

与 G 和 B 变量相同...

我希望其他人解释一下,问题出在哪里,因为我整天都在寻找它......

【问题讨论】:

    标签: c colors geometry sdl gfx


    【解决方案1】:

    RGB 函数的 RG 参数是 unsigned char,并且在转换之前您不会将它们转换为 unsigned int。这意味着,您正在移动一个 8 位数字。你知道会发生什么...

    因此,要么将参数转换为unsigned int,要么在移位之前转换值。

    PS:不管你做什么,如果你把所有三个参数都设置为相同的类型就好了!

    在 cmets 中,结果是这样的:

    所以我不认为你的 (x,y) 坐标是标准化的 get_dist 函数。您计算斜边的长度 连接这两个向量,但你没有给它任何基本长度 正常化。

    【讨论】:

    • 嗯,再想一想,我似乎正在阅读有关 char 在轮班时被隐式转换为 int 的信息。在那种情况下,我的回答是不恰当的。如果有人可以验证我错了,请告诉我,我将删除此答案。
    • 我已将 RGB 参数更改为 unsigned int,但颜色仍然相同。
    • 这至少是一个好习惯......所以我不认为你的 (x,y) 坐标在 get_dist 函数中被标准化。你计算连接这两个向量的斜边的长度,但你没有给它任何基本长度来标准化。我在这里错过了什么吗?
    • 谢谢!我改变了 d0 = get_dist(x, ymin, x0, y0);到 d0 = 1/(get_dist(x, ymin, x0, y0)); (与 d1 和 d2 相同)并且效果很好!再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    相关资源
    最近更新 更多