图形学_画线算法(DDA、Bresenham)

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

图形学_画线算法(DDA、Bresenham)的相关文章

两种画线算法(DDA&amp;Bersenham)

DDA(digital differential analyzer) 由直线的斜截式方程引入 对于正斜率的线段,如果斜率<=1,则以单位x间隔(δx=1)取样,并逐个计算每一个y值 Yk+1 = Yk + m   (m为由初始点确定的斜率) 对于斜率>1的线段 Xk+1 = Xk + 1/m   (m为由初始点确定的斜率) 起始端点在于右侧时 "+" -> "-" #include "stdlib.h" #include &qu

图形学--(中点画线法+Bresenham画线算法)

编程环境:codeblocks+EGE库 用到的函数:putpixel(int x1,int y1,int color)  用某种颜色打亮一个坐标点. 这俩种算法都是用来在计算机上画一条直线的,那么我们为什么不直接用直线方程分别带点再打亮呢,这是因为,计算机中每个坐标点都是整数,而直线是由一个个像素点组合而成的,那么,直接将坐标点再进行四舍五入整数化就好了啊,的确,这是一种方法,但计算机中进行浮点数的四舍五入会使运算效率变差,因此真正画直线时是用到上边这俩种方法的. 1.中点画线法 只考虑当直线

Bresenham画线算法

[Bresenham画线算法] Bresenham是一种光栅化算法.不仅可以用于画线,也可以用用画圆及其它曲线. 参考:<计算机图形学>3.5.3 Bresenham画线算法 Bresenham画线算法

计算机图形学(二)输出图元_4_并行画线算法

并行画线算法 本来在word中是有右下数的,一编辑在csdn中编辑就没有了.                            上面讨论过的线段生成算法顺序地确定像素位置.而利用并行计算机,则可通过将计算分割到可用的多个处理器中来得到线段的像素位置.分割问题的一种解决方法是将现有的顺序算法放到多个处理器上.我们也可以寻找其他处理办法,从而使像素位置能以并行方式有效地计算.在设计并行算法中,重要的是要考虑平衡可用处理器间的处理负载. 给定np个处理器,我们可以通过把线段分割成np个子段,并在每

计算机图形学(二)输出图元_3_画线算法_3_Bresenham画线算法

Bresenham画线算法 本来在word中是有右下数的,一编辑在csdn中编辑就没有了.                         Bresenham画线算法是由Bresenham提出的一种精确而有效的光栅线生成算法,该算法仅仅使用增量整数计算.另外Bresenham算法还可用于显示圆和其他曲线.图3.8和图3.9给出了绘制线段的屏幕局部.垂直轴表示扫描线位置,水平轴标识像素列.在这个例子中,我们以单位x间隔取样,并且需要确定每次取样时两个可能的像素位置中的哪一个更接近于线路径.从图3.

Bresenham画线算法详解及其OpenGL编程实现

http://blog.csdn.net/xiajun07061225/article/details/7018719 Bresenham是由Bresenham提出的一种精确而有效地光栅线生成算法,该算法仅使用增量整数计算.另外,它还可以用于显示其它曲线. 我们以斜率大于0小于1的线段来进行考虑.以单位x间隔进行取样.每次绘制了当前像素点(xk,yk)之后,需要确定下一个要绘制的点是(xk+1,yk)还是(xk+1,yk+1),需要判断哪一个点像素点更接近线路径. 在取样位置,我们使用d1和d2

计算机图形学(二)输出图元_3_画线算法_1_直线方程

画线算法 场景中的直线段由其两端点的坐标位置来定义.要在光栅监视器上显示一线段,图形系统必须先将两端点投影到整数屏幕坐标,并确定离两端点间的直线路径最近的像素位置.接下来将颜色值装人帧缓存相应的像素坐标处.视频控制器从帧缓存读出写入的颜色值并绘制屏幕像素.这一过程将一线段数字化为一组离散的整数位置.一般而言,这些位置是实际线路径的近似.例如,计算出的线位置(10.48, 20.51)转换为像素位置(10, 21).坐标值舍入到整数,引起除水平和垂直以外所有线段的阶梯效应("锯齿形"),

图形学中的画线算法之 &quot;DDA&quot;算法

DDA算法画直线,其理论依据:如 m 表示直线斜率, 那么有斜率 m  =  (y2 - y1) / (x2 - x1), ∴ m = Δy / Δx ,   从而有对于沿直线给定的 x 任何增量Δx,计算出对应的y的增量  Δy = m • Δx :  同理: Δx = Δy / m: 假设斜率  |m| <= 1:即 x 的长度大于  y的长度.现以 x 单位间距为增量,逐个计算  y 值, 有: yk+1 = yk + m; 同理,对于|m| > 1; 我们有: xK+1 = yK +

中点Brehensam画线算法

#include<stdio.h> #include<stdlib.h> #include"graphics.h" //函数声明 void MidBrehansem(int x0, int y0, int x1, int y1);  //中点MidBrehansem算法 void swap(int &x, int &y);  //利用引用传递交换值 int main() { int gdriver = DETECT, gmode; int x0,