3 1 1 DDA l DDA Digital Differential

  • Slides: 110
Download presentation

3. 1. 1 DDA画线算法 l 数字微分(DDA)画线算法 (Digital Differential Analyzer) 6

3. 1. 1 DDA画线算法 l 数字微分(DDA)画线算法 (Digital Differential Analyzer) 6

3. 1. 1 DDA画线算法 l DDA增量算法 xi+1=x 1+∆x*ti+1=xi+∆x*dt=xi+xinc yi+1=y 1+∆y*ti+1=yi+∆y*dt=yi+yinc 复杂度:加法+取整 8

3. 1. 1 DDA画线算法 l DDA增量算法 xi+1=x 1+∆x*ti+1=xi+∆x*dt=xi+xinc yi+1=y 1+∆y*ti+1=yi+∆y*dt=yi+yinc 复杂度:加法+取整 8

3. 1. 2 Bresenham画线算法 l Bresenham画线算法思想 Ø (xk, yk)是直线段上的点 Ø H:(xk+1, yk+1) Ø L:(xk+1,

3. 1. 2 Bresenham画线算法 l Bresenham画线算法思想 Ø (xk, yk)是直线段上的点 Ø H:(xk+1, yk+1) Ø L:(xk+1, yk) Ø A: (xk+1, y)=(xk+1, m(xk+1)+b) Ø dlower>dupper, 取H点 Ø dlower<dupper, 取L点 Ø dlower=dupper, 选择H或L均可 l 令p= dlower-dupper, p> 0取上像素 (xk+1, yk+1) , p< 0 采用下像素(xk+1, yk)。 12

3. 1. 2 Bresenham画线算法 l y=m(xk+1)+b l dlower=y-yk=m(xk+1)+b-yk dupper=yk+1 -y=yk+1 -m(xk+1)-b l dlower-dupper=2 m(xk+1)-2

3. 1. 2 Bresenham画线算法 l y=m(xk+1)+b l dlower=y-yk=m(xk+1)+b-yk dupper=yk+1 -y=yk+1 -m(xk+1)-b l dlower-dupper=2 m(xk+1)-2 yk+2 b-1 l m= 2Δy /Δx pk=Δx(dlower-dupper)=2Δy. xk-2Δx. yk+c pk+1= 2Δy. xk+1 - 2Δx. yk+1+c l pk+1 -pk=2Δy(xk+1 -xk)-2Δx(yk+1 -yk) pk+1=pk +2Δy(xk+1 -xk)-2Δx(yk+1 -yk) xk+1 -xk=1 pk+1=pk +2Δy-2Δx(yk+1 -yk) l pk+1> 0取上像素,pk+1< 0 取下像素。 l yk+1 -yk=0或 1,取绝于参数pk的符号。 13

3. 2 帧缓冲器的装载 addr(x, y)=addr(0, 0)+y*xmax+x addr(x+1, y)=addr(x, y)+1 addr(x+1, y+1)=addr(x, y)+xmax+1 24

3. 2 帧缓冲器的装载 addr(x, y)=addr(0, 0)+y*xmax+x addr(x+1, y)=addr(x, y)+1 addr(x+1, y+1)=addr(x, y)+xmax+1 24

3. 4 其他曲线 l 3. 4. 1 画锥曲线 Ax 2+By 2+Cxy+Dx+Ey+F=0 l 3. 4.

3. 4 其他曲线 l 3. 4. 1 画锥曲线 Ax 2+By 2+Cxy+Dx+Ey+F=0 l 3. 4. 2 多项式曲线 y=a 0+a 1 x+a 2 x 2+……an-1 xn-1+anxn 36

3. 9 多边形填充区 #define MAX 100 Typedef struct { int Polygon. Num; // 多边形顶点个数

3. 9 多边形填充区 #define MAX 100 Typedef struct { int Polygon. Num; // 多边形顶点个数 Point vertexces[MAX] //多边形顶点数组 } Polygon // 多边形结构 void Fill. Polygon. Pby. P(Polygon *P, int polygon. Color) { int x, y; 计算 ymin,ymax, xmin, xmax; for(y = ymin; y <= ymax; y++) for(x = xmin; x <= xmax; x++) if(Is. Inside(P, x, y)) Put. Pixel(x, y, polygon. Color); else Put. Pixel(x, y, background. Color); }/*end of Fill. Polygon. Pby. P() */ 49

3. 9 多边形填充区 V={V 1, V 2, V 3, V 4}={(x 1, y 1,

3. 9 多边形填充区 V={V 1, V 2, V 3, V 4}={(x 1, y 1, z 1), …, (x 4, y 4, z 4)} P 1={V 1, V 2, V 4} P 2={V 4, V 2, V 3} 56

3. 9 多边形填充区 例1 #Vertex //点数据 #skinhead //特征名称 0. 0000 -31. 9007 487. 6600

3. 9 多边形填充区 例1 #Vertex //点数据 #skinhead //特征名称 0. 0000 -31. 9007 487. 6600 //点的坐标 31. 0000 -28. 3430 470. 4640 63. 0000 -29. 9017 455. 9880 …… #facet //面数据 #skinhead //特征名称 0 1 16 //点的索引值 1 15 16 16 15 13 59

3. 9 多边形填充区 例2 点 31 0 0. 300023574785431 26. 846787517318 15. 5 0.

3. 9 多边形填充区 例2 点 31 0 0. 300023574785431 26. 846787517318 15. 5 0. 300023574796009 15. 5 26. 846787517318 0. 300023574796009 1. 8982025386784 e-01531 0. 300023574785431 -15. 5 26. 846787517318 0. 300023574796009 -26. 846787517318 15. 5 0. 300023574796009 …… 网格 624 223 258 257 204 223 257 223 204 192 258 223 259 236 261 226 235 221 226 …… 60

3. 9 多边形填充区 l多边形表示例子 V 1 E 6 E 3 S 1 E 2

3. 9 多边形填充区 l多边形表示例子 V 1 E 6 E 3 S 1 E 2 V 5 S 2 V 3 E 5 E 4 V 4 边表 E 1: V 1, V 2 E 2: V 3, V 4 E 3: V 1, V 3 E 4: V 3, V 4 E 5: V 5, V 4 E 6: V 1, V 5 面片表 S 1: E 1, E 2, E 3 S 2: E 3, E 4, E 5, E 6 顶点表 V 1: x 1, y 1, z 1 V 2: x 1, y 1, z 1 V 3: x 1, y 1, z 1 V 4: x 1, y 1, z 1 V 5: x 1, y 1, z 1 在边表中扩充了 指向面片表的指针 E 1: V 1, V 2, S 1 E 2: V 2, V 3, S 1 E 3: V 3, V 1, S 2 E 4: V 3, V 4, S 2 E 5: V 4, V 5, S 2 E 6: V 5, V 1, S 2 61

3. 10 Open. GL学习 gl. Vertex() gl. Rect*() gl. Recti(200, 100, 50, 250 )

3. 10 Open. GL学习 gl. Vertex() gl. Rect*() gl. Recti(200, 100, 50, 250 ) int vertext 1[]={200, 100} int vertex 2[]={50, 250} gl. Rectv(vertex 1, vertex 2 ) gl. Begin(GL_POLYGON) gl. Vertex 2 iv(p 1) ; gl. Vertex 2 iv(p 2) ; gl. Vertex 2 iv(p 3) ; gl. Vertex 2 iv(p 4) ; gl. Vertex 2 iv(p 5) ; 68

3. 10 Open. GL学习 l 顶点数组 typedef Glint vertex 3[3]; vertex 3 pt[8]={ {0,

3. 10 Open. GL学习 l 顶点数组 typedef Glint vertex 3[3]; vertex 3 pt[8]={ {0, 0, 0}, {0, 1, 0}, {1, 0, 0}, {1, 1, 0}, {0, 0, 1}, {0, 1, 1}, {1, 0, 1}, {1, 1, 1}}; void quad(Glint n 1, Glint n 2, Glint n 3, Glint n 4) { gl. Begin(GL_QUADS); gl. Vertex 3 iv(pt[n 1]); gl. Vertex 3 iv(pt[n 2]); gl. Vertex 3 iv(pt[n 3]); gl. Vertex 3 iv(pt[n 4]); gl. End } 69

3. 10 Open. GL学习 l BMP图像格式:Windows采用的图形文件格式 l 位图文件头 (bitmap-fileheader) BITMAPFILEHEADER bmfh l 位图信息头 (bitmap-information

3. 10 Open. GL学习 l BMP图像格式:Windows采用的图形文件格式 l 位图文件头 (bitmap-fileheader) BITMAPFILEHEADER bmfh l 位图信息头 (bitmap-information header) BITMAPINFOHEADER bmih l 彩色表 (color table) RGBQUAD a. Colors[] l 图象数据阵列字节 BYTE a. Bitmap. Bits[] 78

3. 10 Open. GL学习 l 位图文件头包含有关于文件类型、文件大小、存放 位置等信息,在Windows 3. 0以上版本的位图文件中用 BITMAPFILEHEADER结构来定义: typedef struct tag. BITMAPFILEHEADER

3. 10 Open. GL学习 l 位图文件头包含有关于文件类型、文件大小、存放 位置等信息,在Windows 3. 0以上版本的位图文件中用 BITMAPFILEHEADER结构来定义: typedef struct tag. BITMAPFILEHEADER { /*bmfh*/ UINTbf. Type; DWORDbf. Size; UINTbf. Reserved 1; UINTbf. Reserved 2; DWORD bf. Off. Bits; } BITMAPFILEHEADER; 79

3. 10 Open. GL学习 l 位图信息头位图信息用BITMAPINFO结构来定义,它由 位图信息头(bitmap-information header)和彩色表 (color table)组成,前者用BITMAPINFOHEADER结构定 义,后者用RGBQUAD结构定义。 BITMAPINFO结构具有如下形式: typedef struct

3. 10 Open. GL学习 l 位图信息头位图信息用BITMAPINFO结构来定义,它由 位图信息头(bitmap-information header)和彩色表 (color table)组成,前者用BITMAPINFOHEADER结构定 义,后者用RGBQUAD结构定义。 BITMAPINFO结构具有如下形式: typedef struct tag. BITMAPINFO { /* bmi */ BITMAPINFOHEADER bmi. Header; RGBQUAD bmi. Colors[1]; } BITMAPINFO; 80

3. 10 Open. GL学习 l BITMAPINFOHEADER结构包含有位图文件的大小、压缩类型和 颜 色 格 式 , 其 结 构

3. 10 Open. GL学习 l BITMAPINFOHEADER结构包含有位图文件的大小、压缩类型和 颜 色 格 式 , 其 结 构 定 义 为 : typedef struct tag. BITMAPINFOHEADER { /* bmih */ DWORD bi. Size; LONG bi. Width; LONG bi. Height; WORD bi. Planes; WORD bi. Bit. Count; DWORD bi. Compression; DWORD bi. Size. Image; LONG bi. XPels. Per. Meter; LONG bi. YPels. Per. Meter; DWORD bi. Clr. Used; DWORD bi. Clr. Important; } BITMAPINFOHEADER; 81

3. 10 Open. GL学习 l 例子:棋盘 GLubyte wb[2] = {0 x 00, 0 xff};

3. 10 Open. GL学习 l 例子:棋盘 GLubyte wb[2] = {0 x 00, 0 xff}; GLubyte check[512]; int i, j; for(i=0; i<64; i++) for (j=0; j<64, j++) check[i*8+j] = wb[(i/8+j)%2]; gl. Bitmap( 64, 0. 0, check); 91

3. 10 Open. GL学习 l 帧缓存->处理器内存 l gl. Read. Pixels(x, y, width, height, format,

3. 10 Open. GL学习 l 帧缓存->处理器内存 l gl. Read. Pixels(x, y, width, height, format, type, myimage) x, y:帧缓存中的开始像素位置 width, height:大小 format:图像格式 type:像素类型 myimage:指向处理器内存的指针 GLubyte myimage[512][3]; gl. Read. Pixels(0, 0, 512, GL_RGB, GL_UNSIGNED_BYTE, myimage); 94

3. 10 Open. GL学习 l 帧缓存->帧缓存 l 将一块像素数据从Open. GL缓存的一个位置复制到另一 个位置。 l gl. Copy. Pixels(xmin,

3. 10 Open. GL学习 l 帧缓存->帧缓存 l 将一块像素数据从Open. GL缓存的一个位置复制到另一 个位置。 l gl. Copy. Pixels(xmin, ymin, width, height, pixel. Value) xmin, ymin:块的左下角屏幕坐标位置 width, height:要复制的列数和行数 pixel. Value:要复制的数据种类,可以取GL_COLOR、 GL_DEPTH和GL_STENCIL。 l gl. Copy. Pixels (0, 0, 100, GL_COLOR); 95

3. 10 Open. GL学习 l glut. Bitmap. Character(font, character) l 显示字符串 gl. Raster. Position

3. 10 Open. GL学习 l glut. Bitmap. Character(font, character) l 显示字符串 gl. Raster. Position 2 i(x, y) for(k=0; k<36; k++) glut. Bitmap. Character(GLUT_BITMAP_9_BY_15, text[k]); l 显示轮廓字符 glut. Stroke. Character(font, character) 97

3. 10 Open. GL学习 l 将对象描述成一个命名的语句序列并存储起来, 称为 显示列表。 l使用gl. New. List/gl. End. List函数包围一组Open. GL命令

3. 10 Open. GL学习 l 将对象描述成一个命名的语句序列并存储起来, 称为 显示列表。 l使用gl. New. List/gl. End. List函数包围一组Open. GL命令 就可形成显示列表。 gl. New. List(list. ID, list. Mode). . . gl. End. List(); l让Open. GL生成一个标志 list. ID=gl. Gen. Lists(1); l查询 gl. Is. List(list. ID); l删除 gl. Delete. Lists(start. ID, n. Lists); 99

3. 10 Open. GL学习 l 例: reg. Hex=gl. Gen. Lists(1); gl. New. List(reg. Hex,

3. 10 Open. GL学习 l 例: reg. Hex=gl. Gen. Lists(1); gl. New. List(reg. Hex, GL_COMPILE); gl. Begin(GL_POLYGON); for(k=0; k<6; k++){ theta=TWO_PI*k/6. 0; x=200+150*cos(theta); y=200+150*sin(theta); } gl. End(); gl. End. List(); gl. Call. List(reg. Hex); 100

3. 10 Open. GL学习 l 窗口重定形函数 glut. Reshape. Func(win. Reshape. Fcn) 103

3. 10 Open. GL学习 l 窗口重定形函数 glut. Reshape. Func(win. Reshape. Fcn) 103

3. 10 Open. GL学习 #include <GL/glut. h> #include <math. h> #include <stdlib. h> const

3. 10 Open. GL学习 #include <GL/glut. h> #include <math. h> #include <stdlib. h> const double TWO_PI = 6. 2831853; /* Initial display-window size. */ GLsizei win. Width = 400, win. Height = 400; GLuint reg. Hex; class screen. Pt { public: GLint x, y; }; 104

3. 10 Open. GL学习 static void init (void) { screen. Pt hex. Vertex, circ.

3. 10 Open. GL学习 static void init (void) { screen. Pt hex. Vertex, circ. Ctr; GLdouble theta; GLint k; /* Set circle center coordinates. */ circ. Ctr. x = win. Width / 2; circ. Ctr. y = win. Height / 2; gl. Clear. Color (1. 0, 0. 0); // Display-window color = white. /* Set up a display list for a red regular hexagon. * Vertices for the hexagon are six equally spaced * points around the circumference of a circle. */ 105

3. 10 Open. GL学习 例子 reg. Hex = gl. Gen. Lists (1); // Get

3. 10 Open. GL学习 例子 reg. Hex = gl. Gen. Lists (1); // Get an identifier for the display list. gl. New. List (reg. Hex, GL_COMPILE); gl. Color 3 f (1. 0, 0. 0); // Set fill color for hexagon to red. gl. Begin (GL_POLYGON); for (k = 0; k < 6; k++) { theta = TWO_PI * k / 6. 0; hex. Vertex. x = circ. Ctr. x + 150 * cos (theta); hex. Vertex. y = circ. Ctr. y + 150 * sin (theta); gl. Vertex 2 i (hex. Vertex. x, hex. Vertex. y); } gl. End ( ); gl. End. List ( ); } void reg. Hexagon (void) { gl. Clear (GL_COLOR_BUFFER_BIT); gl. Call. List (reg. Hex); gl. Flush ( ); } 106

3. 10 Open. GL学习 void win. Reshape. Fcn (int new. Width, int new. Height)

3. 10 Open. GL学习 void win. Reshape. Fcn (int new. Width, int new. Height) { gl. Matrix. Mode (GL_PROJECTION); gl. Load. Identity ( ); glu. Ortho 2 D (0. 0, (GLdouble) new. Width, 0. 0, (GLdouble) new. Height); gl. Clear (GL_COLOR_BUFFER_BIT); } void main (int argc, char** argv) { glut. Init (&argc, argv); glut. Init. Display. Mode (GLUT_SINGLE | GLUT_RGB); glut. Init. Window. Position (100, 100); glut. Init. Window. Size (win. Width, win. Height); glut. Create. Window ("Reshape-Function & Display-List Example"); init ( ); glut. Display. Func (reg. Hexagon); glut. Reshape. Func (win. Reshape. Fcn); glut. Main. Loop ( ); } 107

3. 10 Open. GL学习 108

3. 10 Open. GL学习 108

计算机图形学 欢迎交流! 更多信息请参见 http: //staff. ustc. edu. cn/~lfdong/research. html 110

计算机图形学 欢迎交流! 更多信息请参见 http: //staff. ustc. edu. cn/~lfdong/research. html 110