1

影付きの三角形を描こうとしましたが、色が間違っています。赤、緑、青の色で関数を呼び出すと、次のようになります。

ここに画像の説明を入力

左上が赤、右上が緑、上が青である必要があります。しかし、ご覧のとおり、色はそうではありません。私はこのようなものを得る必要があります:

ここに画像の説明を入力

コードは次のとおりです。

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変数と同じ...

一日中探しているので、どこに問題があるのか​​ 他の人に説明してもらいたいです...

4

1 に答える 1

1

関数のRGパラメータはであり、シフトする前にそれらをキャストしていません。つまり、8ビットの数値をシフトしているということです。あなたは何が起こるか知っています...RGBunsigned charunsigned int

したがって、unsigned intシフトする前に、パラメータをに変換するか、値をキャストしてください。

PS:何をするにしても、3つのパラメーターすべてを同じタイプにするといいでしょう!

コメントのように、それはこれだったことがわかります:

したがって、(x、y)座標がそのget_dist関数で正規化されているとは思いません。これらの2つのベクトルを接続する斜辺の長さを計算しますが、正規化するための基本長を指定しません。

于 2012-10-07T21:03:46.467 に答える