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 else
18 steps = fabs(dy);
19 xin = (double)(dx/steps);
20 yin = (double)(dy/steps); //possible loss of data
21 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 }
图形学_画线算法(DDA、Bresenham),码迷,mamicode.com
时间: 2024-12-22 22:52:28