come rasterizzare il rettangolo ruotato (in 2d per setpixel)

Ho ottenuto quattro vertici ABCD a 2d di rettangolo ruotato, ho bisogno di rasterizzarlo / disegnarlo (in modo efficiente) in pixelbufer con setpixel (x, y, colore)

come farlo?

stavo cercando con un codice come

// convertilg abcd do up down left right, // calculating some dx_left dx_right on y-- // etc (frustrating on special cases when there are 2 up_y vertices in same line etc) for(;;) { drawhorizontalline(y, xstart, xend, color); if(y==downy) break; y--; xstart+=dxstart; xend+=dxend; if(y==lefty) dxstart = dxright; if(y==righty) dxend = dxleft; } 

ma è molto frustrante (terribilmente vulnerabile ai bug e più frustrante) sono davvero stanco di eseguire il debug di questo giorno per tutto il giorno e ho bisogno di trovare forse qualche codice di lavoro piuttosto che provare a eseguire il debug di questo

Per riempire il tuo rettangolo gestirlo come poligono convesso chiuso (quasi lo stesso del riempimento triangular)

  1. ordina i tuoi punti per abbinare la regola dell’avvolgimento

    quindi ci sono linee AB BC CD DA o retromarcia

  2. creare un buffer sinistro e destro

    l’indirizzo è y coordinato, è un array di x -positions e, se necessario, anche array di color,texture coordinates,... per i principianti:

    • int buf_x0[ys],buf_x1[ys];

    dove ys è la risoluzione dello schermo

  3. implementare qualsiasi algoritmo della linea di tiro

    ma invece di disegnare per lo schermo, basta memorizzare la coordinata x del pixel nel buffer.

    • invece di: setpixel(x,y,color); do: buf_x?[y]=x; .

Quale buffer è la destinazione dipende dalla direzione della linea Y

  • se dy<0 allora riempie buff_x0
  • se dy>0 allora riempie buff_x1
  • se dy==0 allora buf_x0[y]=min(x) e buf_x1[y]=max(x)

    1. applica questo algoritmo di linea a tutte le linee di confine del poligono (AB, BC, CD, DA)

    dopo questo i buffer contengono le posizioni iniziali e finali delle vostre linee orizzontali

    1. riempire il rettangolo sullo schermo

       for (y=min(Ay,By,Cy,Dy);y<=max(Ay,By,Cy,Dy);y++) draw_horizontal_line(y,buf_x0[y],buf_x1[y],color); 

Immagine per chiarezza (tratto dalle mie lezioni su computer grafica di basso livello)

creazione di buffer di confine

descrizione dell'immagine:

  • i rettangoli verticali rappresentano i buffer del bordo buf_x0[],buf_x1[]
  • la regola di avvolgimento in senso orario assicura il buffer di destinazione. Se il suo codice è corretto rispetto a buf_x0[y] <= buf_x1[y] quindi disegnare delle linee orizzontali for ciclo singolo for ciclo

Anche qui un semplice esempio di C ++ per questo