计算机图形学:用中点算法画直线

理论推理:
计算机图形学:用中点算法画直线_第1张图片
计算机图形学:用中点算法画直线_第2张图片
计算机图形学:用中点算法画直线_第3张图片
代码:

#include 
#include 
#include 
#include
 
// 使用中点算法画任意斜率的直线(包括起始点,不包括终止点)
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();                       //关闭图形窗口

}

你可能感兴趣的:(计算机图形学:用中点算法画直线)