Неправильно окрашенные треугольники с растеризатором на основе SDL2? - PullRequest
0 голосов
/ 11 октября 2019

Я недавно работал над созданием чайника с C, используя готовую модель чайника и просто масштабируя, переводя и заполняя цвета треугольников, а также создавая ограничивающие рамки, и это продвигалось довольно хорошо. Однако я дошел до этого:

enter image description here

Как вы видите, это не совсем правильно, и мне было интересно, что я сделал неправильно? он должен выглядеть как на картинке ниже. Просматривал это часами, и я не вижу, что я сделал неправильно. какие-либо предложения?

enter image description here

Вот мой код

Треугольник. C

  // Fill triangle with a color
    void FillTriangle(SDL_Surface *screen, triangle_t *triangle)
    {
        // TODO: Insert code that fills the triangle with the color specified in triangle->fillcolor.
        // Hint: Draw the triangle with color TRIANGLE_PENCOLOR (this color can not
        // occur in e.g. the teapot or the example triangles).  Thus, if your 
        // approach to filling the triangle relies on looking for the edges of
        // the triangle on the screen (via the GetPixel function), you will find those
        // edges even if the triangle overlaps with a triangle that has already
        // been drawn on the screen.
        int maxx,minx,maxy,miny;
        int max(int a, int b){
            if(a>b) return a;
            return b;
        }
        int min(int a, int b){
            if (a<b) return a;
            return b;
        }
        maxx = max(triangle->sx1,max(triangle->sx2,triangle->sx3));
        minx = min(triangle->sx1,min(triangle->sx2,triangle->sx3));
        maxy = max(triangle->sy1,max(triangle->sy2,triangle->sy3));
        miny = min(triangle->sy1,min(triangle->sy2,triangle->sy3));
        int x,y;

           for(y = miny;y < maxy; y++){
            for(x = minx; x < maxx; x++){
                if((triangle->sx1 - triangle->sx2) * (y - triangle->sy1) - (triangle->sy1 - triangle->sy2) * (x - triangle->sx1) > 0 &&
                 (triangle->sx2 - triangle->sx3) * (y - triangle->sy2) - (triangle->sy2 - triangle->sy3) * (x - triangle->sx2) > 0 &&
                 (triangle->sx3 - triangle->sx1) * (y - triangle->sy3) -  (triangle->sy3 - triangle->sy1) * (x - triangle->sx3) > 0)
                {
                    SetPixel(screen,x,y,triangle->fillcolor);
                }
            }
        }



}

Triangle.h

#ifndef TRIANGLE_H_
#define TRIANGLE_H_

typedef struct triangle triangle_t;

struct triangle {
    // Model coordinates
    int x1, y1;
    int x2, y2;
    int x3, y3;

    // Fill color
    unsigned int fillcolor;

    // Scale factor
    float scale;

    // Translate to these coordinates before drawing on screen
    int tx, ty;

    // Bounding box of on-screen coordinates
    int bx, by;         // upper left corner of box
    int bw, bh;         // Width and height of box

    // On-screen coordinates
    int sx1, sy1;
    int sx2, sy2;
    int sx3, sy3;
};

// Draw triangle on screen.
void DrawTriangle(SDL_Surface *screen, triangle_t *triangle);


#endif /*TRIANGLE_H_*/

Изображение каркаса (без цвета)

enter image description here

...