-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path1. Line Drawing (DDA & Bressenham).cpp
115 lines (103 loc) · 1.88 KB
/
1. Line Drawing (DDA & Bressenham).cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include<bits/stdc++.h>
#include<graphics.h>
#include<windows.h>
using namespace std;
typedef pair<int,int> pii;
const int WINDOW_W = 800, WINDOW_H = 600;
pii convertPixel(int x,int y)
{
x += WINDOW_W/2;
y = -y;
y += WINDOW_H/2;
return {x,y};
}
void drawAxis()
{
for(int i=0;i<WINDOW_H;i++)
{
putpixel(400,i,WHITE);
}
for(int i=0;i<WINDOW_W;i++)
{
putpixel(i,300,WHITE);
}
}
void drawPixel(int x,int y,int col)
{
pii p = convertPixel(x,y);
putpixel(p.first,p.second,col);
}
void DDA(int x1,int y1,int x2,int y2)
{
int dx = x2-x1;
int dy = y2-y1;
double m = double(dy)/dx;
double xin,yin;
int tot;
if(dx==0)
{
if(y1>y2) swap(y1,y2);
for(int i=y1;i<=y2;i++) drawPixel(x1,i,YELLOW);
return ;
}
else if(dy==0)
{
if(x1>x2) swap(x1,x2);
for(int i=x1;i<=x2;i++) drawPixel(i,y1,YELLOW);
return ;
}
if(abs(dx)>=abs(dy))
{
if(x1>x2)
{
swap(x1,x2);
swap(y1,y2);
}
xin = 1;
yin = m;
tot = x2-x1+1;
}
else
{
if(y1>y2)
{
swap(x1,x2);
swap(y1,y2);
}
yin = 1;
xin = 1.0/m;
tot = y2-y1 + 1;
}
double x = x1;
double y = y1;
for(int i=1;i<=tot;i++)
{
drawPixel(round(x),round(y),YELLOW);
x += xin;
y += yin;
}
}
void Bressenham(int x1,int y1,int x2,int y2)
{
int dx = x2-x1;
int dy = y2-y1;
int c1 = 2*(dy-dx);
int c2 = 2*dy;
int d = 2*dy-dx;
for(int i=x1;i<=x2;i++)
{
drawPixel(i,y1,GREEN);
if(d>=0) d += c1;
else d += c2;
if(d>=0) y1 += 1;
}
}
int main()
{
initwindow(WINDOW_W,WINDOW_H);
drawAxis();
DDA(20, 30, 150, 100);
Bressenham(40, 50, 170, 120);
getchar();
return 0;
}