cómo rasterizar el rectángulo girado (en 2d por setpixel)

Tengo cuatro vértices en 2D de ABCD de rectángulo girado, necesito rasterizar / dibujar (eficientemente) en pixelbufer con setpixel (x, y, color)

¿cómo hacerlo?

Lo estaba intentando con un 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; } 

pero es muy frustrante (terriblemente propenso a errores y más frustrante) estoy realmente cansado de depurar esto todo el día de ayer y tengo que encontrar tal vez algún código de trabajo en lugar de tratar de depurar este

Para rellenar su rectángulo, manipúlelo como un polígono convexo cerrado (casi como el relleno de un triángulo)

  1. ordene sus puntos para que coincidan con la regla de liquidación

    entonces hay líneas AB BC CD DA o reverso

  2. crear el búfer izquierdo y derecho

    la dirección es coordenada y , es una matriz de xposiciones y si es necesario también una matriz de color,texture coordinates,... para principiantes:

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

    donde ys es pantalla y -resolución

  3. implementar cualquier algoritmo de línea de extracción

    pero en lugar de dibujar en la pantalla simplemente almacena la coordenada x de píxel en el búfer.

    • en lugar de: setpixel(x,y,color); do: buf_x?[y]=x; .

Qué buffer es el destino depende de la dirección de la línea Y

  • si dy<0 entonces llena buff_x0
  • si dy>0 entonces llena buff_x1
  • si dy==0 entonces buf_x0[y]=min(x) y buf_x1[y]=max(x)

    1. aplicar este algoritmo de línea a todas las líneas de borde del polígono (AB, BC, CD, DA)

    después de esto, los buffers contienen las posiciones x inicio y final de tus líneas horizontales

    1. llena el rectángulo en la pantalla

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

Imagen para mayor claridad (tomada de mis conferencias sobre gráficos de computadora de bajo nivel)

creación de buffer de frontera

descripción de la imagen:

  • rectangularjs verticales representa los búferes de borde buf_x0[],buf_x1[]
  • la regla de devanado en el sentido de las agujas del reloj asegura el buffer de destino. Si está codificado correctamente que buf_x0[y] <= buf_x1[y] así que dibuja de líneas horizontales colapsos para solo for bucle

También aquí ejemplo simple de C ++ mío para esto