理论推理:
代码:
#include <graphics.h>
#include <conio.h>
#include <iostream.h>
#include<stdio.h>
// 使用中点算法画任意斜率的直线(包括起始点,不包括终止点)
void Line_Midpoint(int x1, int y1, int x2, int y2, int color)
{
int x = x1, y = y1; //赋初始点
int dy = y1 - y2, dx = x2 - x1;
int delta_x = (dx >= 0 ? 1 : (dx = -dx, -1)); //若dx>0则步长为1,否则为-1,同时dx变正
int delta_y = (dy <= 0 ? 1 : (dy = -dy, -1)); //注意这里dy<0,才是画布中y的增长方向
putpixel(x, y, color); //画起始点
int d, incrE, incrNE;
if (-dy <= dx) // 斜率绝对值 <= 1
//这里-dy即画布中的dy
{
d = 2 * dy + dx; //初始化判断式d
incrE = 2 * dy; //取像素E时判别式增量
incrNE = 2 * (dy + dx);//NE
while(x != x2)
{
if (d < 0)
y += delta_y, d += incrNE;
else
d += incrE;
x += delta_x;
putpixel(x, y, color);
}
}
else // 斜率绝对值 > 1
// x和y情况互换
{
d = 2 * dx + dy;
incrE = 2 * dx;
incrNE= 2 * (dy + dx);
while(y != y2)
{
if(d < 0) //注意d变化情况
d += incrE;
else
x += delta_x, d += incrNE;
y += delta_y;
putpixel(x, y, color);
}
}
}
// 主函数
void main()
{
// 输入起点和终点
int x1,y1,x2,y2;
printf("请输入两点的坐标:\n");
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
int x0 = 400, y0 = 300; //原点坐标
x1=x1+x0; //因为画布坐标原点为左上角,向右x轴增加,向下y轴增加
y1=y0-y1; //所以这里要用-号
x2=x2+x0;
y2=y0-y2;
initgraph(800, 600); //初始化图形窗口大小
setbkcolor(WHITE); //设置背景色为白色
cleardevice();
setcolor(BLACK); //设置坐标颜色为黑色
line(0, y0, x0 * 2, y0); //坐标轴X
line(x0, 0, x0, y0 * 2); //坐标轴Y
Line_Midpoint(x1, y1, x2, y2, BLUE);
_getch(); //等待一个任意输入结束
closegraph(); //关闭图形窗口
}