如何光栅化旋转的矩形(2d由setpixel)
我有四个2d顶点ABCD旋转矩形,我需要栅格化/绘制(有效地)在pixelbufer setpixel(x,y,颜色)
怎么做?
我正在尝试一些代码
// 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; }
但它是最令人沮丧的(可怕的bug和最令人沮丧的),我真的很厌倦了这一整天昨天debugging,我需要find一些工作代码,而不是试图debugging这个
要填充你的矩形句柄它作为封闭的凸多边形(几乎相同的三angular形填充)
-
为了使您的积分符合缠绕规则
所以有AB BC CD DA或倒行
-
创build左侧和右侧缓冲区
地址是
y
-coordinate,它是一个x
-positions数组,如果需要的话还有color,texture coordinates,...
数组,color,texture coordinates,...
对于初学者:-
int buf_x0[ys],buf_x1[ys];
ys
是屏幕y
分辨率 -
-
实现任何画线algorithm
而不是画到屏幕只是将像素的
x
坐标存储到缓冲区。- 而不是:
setpixel(x,y,color);
do: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)
- 将此线algorithm应用于多边形的所有边界线(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);
清晰的图像(从我的低级计算机graphics学讲座中获取)
图片说明:
- 垂直矩形表示边界缓冲区
buf_x0[],buf_x1[]
- 顺时针缠绕规则确保目标缓冲区。 如果它的编码比
buf_x0[y] <= buf_x1[y]
那么水平线的重叠绘制为单个for
循环
这里也是这个简单的C ++示例