图形学_画线算法(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
原创粉丝点击