|
#include <iostream> |
|
#include <algorithm> |
|
#include <graphics.h> |
|
#include "include/range.cpp" |
|
|
|
using namespace std; |
|
|
|
typedef int Color; |
|
typedef void (*PxFn) (int, int, Color); |
|
|
|
const Color LINE_COLOR = BLUE; |
|
|
|
int main (); |
|
void prompt (int &, int &, int &, int &); |
|
void graphmain (int, int, int, int); |
|
void begingraph (); |
|
void endgraph (); |
|
void line (int, int, int, int, Color); |
|
void _linexyp (int, int, int, int, Color, PxFn); |
|
void _pixelpp (int, int, Color); |
|
void _pixelnp (int, int, Color); |
|
void _pixelpn (int, int, Color); |
|
void _pixelnn (int, int, Color); |
|
|
|
int main () { |
|
int x1, y1, x2, y2; |
|
prompt(x1, y1, x2, y2); |
|
graphmain(x1, y1, x2, y2); |
|
return 0; |
|
} |
|
|
|
void prompt (int & x1, int & y1, int & x2, int & y2) { |
|
cout << "Enter begin point and end point coordinate: "; |
|
cin >> x1 >> y1 >> x2 >> y2; |
|
} |
|
|
|
void graphmain (int x1, int y1, int x2, int y2) { |
|
begingraph(); |
|
line(x1, y1, x2, y2, LINE_COLOR); |
|
endgraph(); |
|
} |
|
|
|
void begingraph () { |
|
int gdriver = DETECT, gmode; |
|
initgraph(&gdriver, &gmode, NULL); |
|
} |
|
|
|
void endgraph () { |
|
getch(); |
|
closegraph(); |
|
} |
|
|
|
void line (int x1, int y1, int x2, int y2, Color color) { |
|
if (x1 > x2) { |
|
swap(x1, x2); |
|
swap(y1, y2); |
|
} |
|
auto x = x1; |
|
auto y = y1; |
|
auto dx = x2 - x1; |
|
auto dy = y2 - y1; |
|
if (dx < dy) { |
|
if (dx < 0) { |
|
_linexyp(y, -x, dy, -dx, color, _pixelnn); |
|
} else { |
|
_linexyp(y, x, dy, dx, color, _pixelnp); |
|
} |
|
} else { |
|
if (dy < 0) { |
|
_linexyp(x, -y, dx, -dy, color, _pixelpn); |
|
} else { |
|
_linexyp(x, y, dx, dy, color, _pixelpp); |
|
} |
|
} |
|
} |
|
|
|
void _linexyp (int x, int y, int dx, int dy, Color color, PxFn px) { |
|
auto p = 2 * dy - dx; |
|
auto dpinc = 2 * dy; |
|
auto dpdec = 2 * (dy - dx); |
|
for (auto _x : Range(x, x + dx)) { |
|
px(_x, y, color); |
|
if (p < 0) { |
|
p += dpinc; |
|
} else { |
|
p += dpdec; |
|
++y; |
|
} |
|
} |
|
} |
|
|
|
void _pixelpp (int x, int y, Color color) { |
|
putpixel(x, y, color); |
|
} |
|
|
|
void _pixelpn (int x, int y, Color color) { |
|
putpixel(x, -y, color); |
|
} |
|
|
|
void _pixelnp (int x, int y, Color color) { |
|
putpixel(y, x, color); |
|
} |
|
|
|
void _pixelnn (int x, int y, Color color) { |
|
putpixel(y, -x, color); |
|
} |