como rasterizar o retângulo girado (em 2d por setpixel)

Eu tenho um quadrângulo de quatro vértices ABCD de retângulo girado, eu preciso rasterizar / desenhar (eficientemente) em pixelbufer com setpixel (x, y, color)

como fazer isso?

Eu estava tentando com algum código como

// 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; } 

mas é mais frustrante (terrivelmente propenso a bugs e mais frustrante) eu estou realmente cansado de depurar isso o dia todo ontem e eu preciso encontrar algum código de trabalho em vez de tentar depurar isso

Para preencher o retângulo, manuseie-o como um polígono convexo fechado (quase o mesmo que o preenchimento triangular)

  1. ordene seus pontos para combinar a regra de enrolamento

    então há linhas AB BC CD DA ou reverso

  2. criar buffer esquerdo e direito

    O endereço é y coordenada, é uma matriz de x posições e, se necessário, também matriz de color,texture coordinates,... para iniciantes:

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

    onde ys é a resolução y

  3. implementar qualquer algoritmo de linha de desenho

    mas em vez de desenhar para a canvas, armazene apenas a coordenada x do pixel para o buffer.

    • em vez de: setpixel(x,y,color); fazer: buf_x?[y]=x; .

Qual buffer é o destino depende da direção da linha Y

  • se dy<0 , preencha buff_x0
  • se dy>0 , preencha buff_x1
  • se dy==0 então buf_x0[y]=min(x) e buf_x1[y]=max(x)

    1. aplica este algoritmo de linha a todas as linhas de borda do polígono (AB, BC, CD, DA)

    depois disso, os buffers contêm as posições x e x iniciais das suas linhas horizontais

    1. preencha o retângulo na canvas

       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); 

Imagem para maior clareza (tirada das minhas palestras sobre computação gráfica de baixo nível)

criação de buffer de fronteira

Descrição da imagem:

  • retângulos verticais representam os buffers de borda buf_x0[],buf_x1[]
  • regra de contorno no sentido horário garante o buffer de destino. Se o seu codificado corretamente do que buf_x0[y] <= buf_x1[y] para desenhar colapses de linha horizontal para único for loop

Também aqui simples exemplo de C ++ meu para este