Как растеризовать повернутый прямоугольник (в 2d от setpixel)
У меня есть четыре двумерных вершины A B C D повернутого прямоугольника, мне нужно растеризовать / нарисовать его (эффективно) в пиксельном буфере с помощью setpixel(x,y,color)
как это сделать?
я пытался с некоторым кодом, как
// convertilg a b c d 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;
}
но это очень расстраивает (ужасно подвержен ошибкам и наиболее расстраивает), я действительно устал отлаживать это весь вчерашний день, и мне нужно найти, возможно, какой-то рабочий код, а не пытаться отлаживать это
1 ответ
Чтобы заполнить прямоугольник, обработайте его как замкнутый выпуклый многоугольник (почти такой же, как заливка треугольника)
упорядочить ваши очки, чтобы соответствовать правилу намотки
так что есть линии AB BC CD DA или наоборот
создать левый и правый буфер
адрес
y
-координировать, это массивx
-позиции и при необходимости также массивcolor,texture coordinates,...
, для начинающих:int buf_x0[ys],buf_x1[ys];
где
ys
это экранy
-разрешающая способностьреализовать любой алгоритм рисования линий
но вместо рисования на экране просто хранить
x
координата пикселя в буфер.- вместо:
setpixel(x,y,color);
делать:buf_x?[y]=x;
,
- вместо:
Какой буфер является пунктом назначения, зависит от строки Y
направление
- если
dy<0
затем заполнитеbuff_x0
- если
dy>0
затем заполнитеbuff_x1
если
dy==0
затемbuf_x0[y]=min(x)
а такжеbuf_x1[y]=max(x)
- применить этот алгоритм линий ко всем границам многоугольника (AB,BC,CD,DA)
после этого буферы содержат начало и конец
x
-позиции ваших горизонтальных линийзаполнить прямоугольник на экране
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);
Изображение для наглядности (взято из моих лекций по компьютерной графике низкого уровня)
Описание изображения:
- вертикальные прямоугольники представляют граничные буферы
buf_x0[],buf_x1[]
- Правило намотки по часовой стрелке обеспечивает буфер назначения. Если это закодировано правильно, чем
buf_x0[y] <= buf_x1[y]
поэтому нарисуйте горизонтальные линии коллапс в одиночкуfor
петля
Также здесь простой пример C++ мой для этого