阴影三角形上的颜色错误

时间:2012-10-07 20:58:32

标签: c colors geometry sdl gfx

我试图绘制阴影三角形,但颜色错误。以下是我得到的例子,如果我调用红色,绿色和蓝色的函数:

enter image description here

左上角应为红色,右上角为绿色,顶部应为蓝色。但是你可以看到颜色不是那样的。我应该得到这样的东西:

enter image description here

以下是代码:

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(surface,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变量相同......

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

1 个答案:

答案 0 :(得分:1)

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

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

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

正如评论中所说的那样:

  

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