#include <graphics.h> //包含EGE的头文件
void DDAline(int x1, int y1, int x2, int y2, int color) {
int x;
float dx, dy, y, k;
dx = x2 - x1, dy = y2 - y1;
if (dx == 0) {
for (y = min(y1,y2); y <max(y1, y2); y++) {
putpixel(x1, y, color);
}
return;
}
k = dy / dx;
if (x1 < x2)y = y1;
else y = y2;
for (x = min(x1,x2); x <= max(x1,x2); x++) {
putpixel(x, int(y + 0.5), color);
y = y + k;
}
}
void Bresenhamline(int x1, int y1, int x2, int y2, int color) {
int x;
float dx, dy, y, e;
dx = x2 - x1, dy = y2 - y1;
if (dx == 0) {
for (y = min(y1, y2); y < max(y1, y2); y++) {
putpixel(x1, y, color);
}
return;
}
if (dy == 0) {
for (x = min(x1, x2); x < max(x1, x2); x++) {
putpixel(x, y1, color);
}
return;
}
x = x1, y = y1;
if (x1 < x2) {
if (y1 < y2) {
if (dy <=dx) {
e = -dx;
for (int i = 0; i <= dx; i++)
{
putpixel(x, y, color);
x++, e = e + 2 * dy;
if (e >= 0) {
y++; e = e - 2 * dx;
}
}
}
else {
e = -dy;
for (int i = 0; i <= dy; i++)
{
putpixel(x, y, color);
y++, e = e + 2 * dx;
if (e >= 0) {
x++; e = e - 2 * dy;
}
}
}
}
else{
if (-dy <= dx) {
e = -dx;
for (int i = 0; i <= dx; i++)
{
putpixel(x, y, color);
x++, e = e + 2 * dy;
if (e <= 0) {
y--; e = e + 2 * dx;
}
}
}
else {
e = -dy;
for (int i = 0; i <= -dy; i++)
{
putpixel(x, y, color);
y--, e = e + 2 * dx;
if (e >= 0) {
x++; e = e + 2 * dy;
}
}
}
}
}
else { //x = x2, y = y2;
if (y1<y2) {
if (dy <= -dx) {
e = -dx;
for (int i = 0; i <= -dx; i++)
{
putpixel(x, y, color);
x--, e = e + 2 * dy;
if (e >= 0) {
y++; e = e + 2 * dx;
}
}
}
else {
e = -dy;
for (int i = 0; i <= dy; i++)
{
putpixel(x, y, color);
y++, e = e - 2 * dx;
if (e >= 0) {
x--; e = e - 2 * dy;
}
}
}
}
else {
if (-dy <= -dx) {
e = -dx;
for (int i = 0; i <= -dx; i++)
{
putpixel(x, y, color);
x--, e = e + 2 * dy;
if (e <= 0) {
y--; e = e - 2 * dx;
}
}
}
else {
e = -dy;
for (int i = 0; i <= -dy; i++)
{
putpixel(x, y, color);
y--, e = e + 2 * dx;
if (e <= 0) {
x--; e = e - 2 * dy;
}
}
}
}
}
}
void MidpointLine(int x0, int y0, int x1, int y1, int color)
{
int a, b, d1, d2, d, x, y; float m;
if (x1 < x0)
{ d = x0, x0 = x1, x1 = d; d = y0, y0 = y1, y1 = d; }
a = y0 - y1, b = x1 - x0;
if (b == 0) {
for (y = min(y1, y0); y < max(y1, y0); y++) {
putpixel(x1, y, color);
}
return;
}
m = (float)a / (x0 - x1);
x = x0, y = y0;
putpixel(x, y, color);
if (m >= 0 && m <= 1)
{
d = 2 * a + b; d1 = 2 * a, d2 = 2 * (a + b);
while (x < x1)
{
if (d <= 0) { x++, y++, d += d2; }
else { x++, d += d1; }
putpixel(x, y, color);
}
}
else if (m <= 0 && m >= -1)
{
d = 2 * a - b; d1 = 2 * a - 2 * b, d2 = 2 * a;
while (x < x1)
{
if (d > 0) { x++, y--, d += d1; }
else { x++, d += d2; }
putpixel(x, y, color);
}
}
else if (m > 1)
{
d = a + 2 * b; d1 = 2 * (a + b), d2 = 2 * b;
while (y < y1)
{
if (d > 0) { x++, y++, d += d1; }
else { y++, d += d2; }
putpixel(x, y, color);
}
}
else
{
d = a - 2 * b; d1 = -2 * b, d2 = 2 * (a - b);
while (y > y1)
{
if (d <= 0) { x++, y--, d += d2; }
else { y--, d += d1; }
putpixel(x, y, color);
}
}
}
int main()
{
int x1, y1, x2, y2;
x1 = 200, y1 = 100, x2 = 150; y2 = 400;
initgraph(640, 480); //初始化图形界面
setcolor(EGERGB(0xFF, 0x0, 0x0)); //设置绘画颜色为红色
setbkcolor(WHITE); //设置背景颜色为白色
DDAline(x1, y1, x2, y2, RED);
Bresenhamline(x1+50, y1, x2+50, y2, RED);
MidpointLine(x1+100, y1, x2+100, y2, RED);
getch(); //暂停,等待键盘按键
closegraph(); //关闭图形界面
return 0;
}
c++三种直线绘制算法
最新推荐文章于 2024-05-17 11:25:46 发布