图形学_画线算法(DDA、Bresenham)
来源:互联网 发布:英语听力口语软件 编辑:程序博客网 时间:2024/05/16 11:40
1. DDA算法实现直线绘制(需先安装easyx,百度下载即可)
1 #include "easyx.h" 2 #include "math.h" 3 #include "windows.h" 4 #include "stdio.h" 5 #include "stdlib.h" 6 #include "conio.h" 7 #include "graphics.h" 8 9 void dda(int x1,int y1,int x2,int y2,int color)10 {11 int steps;12 double xin,yin,dx,dy,x,y;13 dx = x2 - x1;14 dy = y2 - y1;15 if(fabs(dx) > fabs(dy))16 steps = fabs(dx);17 else18 steps = fabs(dy);19 xin = (double)(dx/steps);20 yin = (double)(dy/steps); //possible loss of data21 x = x1;22 y = y1;23 putpixel(x,y,color);24 for(int i = 0;i <= steps;i ++)25 {26 x = x + xin;27 y = y + yin;28 putpixel(x,y,color);29 }30 31 }32 33 int main()34 { 35 //硬件测试,将gd装入图形驱动器,gm置入最大图形模式。 36 int gd=DETECT,gm,x1,y1,x2,y2,color;37 printf("input x1,y1,x2,y2,color is:");38 //输入直线参数。39 scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&color);40 //图形初始化41 initgraph(&gd,&gm,"c:\\tc");42 //设置兰背景。43 setbkcolor(BLUE);44 cleardevice();45 dda(x1,y1,x2,y2,color);46 getch(); 47 closegraph(); 48 49 return 0;50 }
2.Bresenham算法绘制直线
1 #include "easyx.h" 2 #include "math.h" 3 #include "windows.h" 4 #include "stdio.h" 5 #include "stdlib.h" 6 #include "conio.h" 7 #include "graphics.h" 8 9 void Bresenham(int x1,int y1,int x2,int y2,int color)10 {11 int x,y,d,dx,dy;12 dx = x2 - x1;13 dy = y2 - y1;14 d = -dx; //误差15 x = x1;16 y = y1;17 18 while(x <= x2)19 {20 putpixel(x,y,color);21 x = x + 1;22 if(d >= 0)23 {24 y = y + 1;25 d = d - 2 * dx;26 }27 d = d + 2 * dy;28 }29 }30 31 int main()32 { 33 //硬件测试,将gd装入图形驱动器,gm置入最大图形模式。 34 int gd=DETECT,gm,x1,y1,x2,y2,color;35 printf("input x1,y1,x2,y2,color is:");36 //输入直线参数。37 scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&color);38 //图形初始化39 initgraph(&gd,&gm,"c:\\tc");40 //设置兰背景。41 setbkcolor(BLUE);42 cleardevice();43 Bresenham(x1,y1,x2,y2,color);44 getch(); 45 closegraph(); 46 47 return 0;48 }
3.改进的Bresenham画线算法
改进后的算法可用于绘制任意斜率,任意方向的直线
1 #include "easyx.h" 2 #include "math.h" 3 #include "windows.h" 4 #include "stdio.h" 5 #include "stdlib.h" 6 #include "conio.h" 7 #include "graphics.h" 8 9 int Bresenham(int x1,int y1,int x2,int y2,int color) 10 { 11 int tempx,tempy; 12 if(x1 > x2) 13 { 14 tempx = x1; 15 x1 = x2; 16 x2 = tempx; 17 tempy = y1; 18 y1 = y2; 19 y2 = tempy; 20 } 21 22 int x,y,dx,dy; 23 double e,k; 24 dx = x2 - x1; 25 dy = y2 - y1; 26 27 if(dx == 0) 28 { 29 if(y1 > y2) 30 { 31 tempy = y1; 32 y1 = y2; 33 y2 = tempy; 34 } 35 for(int p = 0;p <= fabs(dy);p++) 36 { 37 putpixel(x1,y1,color); 38 y1 = y1+1; 39 } 40 return 1; 41 } 42 43 if(dy == 0) 44 { 45 for(int q = 0;q <= fabs(dx);q++) 46 { 47 putpixel(x1,y1,color); 48 x1 = x1 + 1; 49 } 50 return 1; 51 } 52 53 k = (double)dy/dx; 54 e = 0; 55 x = x1; 56 y = y1; 57 58 59 for(int i = 0;i <= dx;i++) 60 { 61 if(k > 0) 62 { 63 putpixel(x,y,color); 64 x++; 65 e = e + k; 66 if(e - int(e) >= 0.5) 67 { 68 y = y + int(e) + 1; 69 e = e - int(e) - 1; 70 } 71 else 72 { 73 y = y + int(e); 74 e = e - int(e); 75 } 76 } 77 78 else 79 { 80 putpixel(x,y,color); 81 x++; 82 e = e + k; 83 if(e - int(e) <= -0.5) 84 { 85 y = y + int(e) - 1; 86 e = e - int(e) + 1; 87 } 88 else 89 { 90 y = y + int(e); 91 e = e - int(e); 92 } 93 94 } 95 96 97 } 98 return 1; 99 }100 101 int main()102 { 103 //硬件测试,将gd装入图形驱动器,gm置入最大图形模式。 104 int gd=DETECT,gm,x1,y1,x2,y2,color;105 printf("input x1,y1,x2,y2,color is:");106 //输入直线参数。107 scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&color);108 //图形初始化109 initgraph(&gd,&gm,"c:\\tc");110 //设置兰背景。111 setbkcolor(BLUE);112 cleardevice();113 int tempx,tempy;114 if(x1 > x2)115 {116 tempx = x1;117 x1 = x2;118 x2 = tempx;119 tempy = y1;120 y1 = y2;121 y2 = tempy;122 }123 Bresenham(x1,y1,x2,y2,color);124 getch(); 125 closegraph(); 126 127 return 0;128 }
4.Bresenham画线算法绘制任意多边形
1 #include "easyx.h" 2 #include "math.h" 3 #include "windows.h" 4 #include "stdio.h" 5 #include "stdlib.h" 6 #include "conio.h" 7 #include "graphics.h" 8 9 int Bresenham(int x1,int y1,int x2,int y2,int color) 10 { 11 int tempx,tempy; 12 if(x1 > x2) 13 { 14 tempx = x1; 15 x1 = x2; 16 x2 = tempx; 17 tempy = y1; 18 y1 = y2; 19 y2 = tempy; 20 } 21 22 int x,y,dx,dy; 23 double e,k; 24 dx = x2 - x1; 25 dy = y2 - y1; 26 27 if(dx == 0) 28 { 29 if(y1 > y2) 30 { 31 tempy = y1; 32 y1 = y2; 33 y2 = tempy; 34 } 35 for(int p = 0;p <= fabs(dy);p++) 36 { 37 putpixel(x1,y1,color); 38 y1 = y1+1; 39 } 40 return 1; 41 } 42 43 if(dy == 0) 44 { 45 for(int q = 0;q <= fabs(dx);q++) 46 { 47 putpixel(x1,y1,color); 48 x1 = x1 + 1; 49 } 50 return 1; 51 } 52 53 k = (double)dy/dx; 54 e = 0; 55 x = x1; 56 y = y1; 57 58 59 for(int i = 0;i <= dx;i++) 60 { 61 if(k > 0) 62 { 63 putpixel(x,y,color); 64 x++; 65 e = e + k; 66 if(e - int(e) >= 0.5) 67 { 68 y = y + int(e) + 1; 69 e = e - int(e) - 1; 70 } 71 else 72 { 73 y = y + int(e); 74 e = e - int(e); 75 } 76 } 77 78 else 79 { 80 putpixel(x,y,color); 81 x++; 82 e = e + k; 83 if(e - int(e) <= -0.5) 84 { 85 y = y + int(e) - 1; 86 e = e - int(e) + 1; 87 } 88 else 89 { 90 y = y + int(e); 91 e = e - int(e); 92 } 93 94 } 95 96 97 } 98 return 1; 99 }100 101 int main()102 { 103 //硬件测试,将gd装入图形驱动器,gm置入最大图形模式。 104 int gd=DETECT,gm;105 int x[100],y[100],color;106 int n; //代表边的个数107 printf("请输入多边形边的个数: ");108 scanf("%d",&n);109 printf("\n请依次输入多边形每一个点的坐标:\n");110 for(int i = 0;i < n;i ++)111 scanf("%d%d",&x[i],&y[i]);112 scanf("%d",&color);113 114 //图形初始化115 initgraph(&gd,&gm,"c:\\tc");116 //设置兰背景。117 setbkcolor(BLUE);118 cleardevice();119 120 for(int j = 1;j < n;j ++)121 Bresenham(x[j - 1],y[j - 1],x[j],y[j],color);122 123 Bresenham(x[0],y[0],x[n-1],y[n-1],color);124 125 getch(); 126 closegraph(); 127 128 return 0;129 }
0 0
- 图形学_画线算法(DDA、Bresenham)
- 计算机图形学 -- 画线算法 [DDA] [中点画线] [Bresenham]
- 计算机图形学之DDA画线算法Bresenham算法程序
- 计算机图形学 学习笔记(一):光栅图形学算法:直线扫描算法(DDA,中点画线算法,Bresenham算法)
- 画线算法 中点画线 Bresenham DDA
- Bresenham画线算法(计算机图形学)
- 【计算机图形学】DDA算法和Bresenham算法
- 基于Bresenham和DDA算法画线段
- 计算机图形学----DDA、Bresenham直线算法
- 计算机图形学-实验2-Bresenham画线算法
- 计算机图形学DDA算法中点Bresenham算法改进的Bresenham算法
- Bresenham画线算法(原创)
- 直线生成(DDA、中点、Bresenham)算法
- 图形学实验一:bresenham算法 画线和画圆
- 计算机图形学04一一OpenGL Bresenham画线算法
- 直线扫描转换(DDA画线算法)
- DDA画线算法
- dda画线算法实现
- HDOJ 2063 二分图匹配
- android应用完全退出的多种方式
- hibernate 的cache管理
- HDOJ 1020 一次AC代码
- error: 'for' loop initial declarations are only allowed in C99 mode 的原因及解决办法
- 图形学_画线算法(DDA、Bresenham)
- 图形学_圆的扫描转换
- 图形学_椭圆扫描转换_中点椭圆算法
- iOS动画特效
- 图形学_多边形扫描转换_边界标志算法
- 图形学_二维图形的剪裁_Sutherland-Hodgeman_Cohen—Sutherland
- HDOJ1009
- javascript 字符串判断是否为空
- HDOJ 1017