计算机图形学:中点划线法(任意斜率)

      第一次学绘图,后来发现书上的SetPixel函数在vc6.0中不能用。就去百度查找了,找了好久才找到easyx(包含graphics.h头文件)。最后又查找了easyx帮助文档找到putpixel(x,y,color)( 在指定位置画一像素)能够代替书上的SetPixel(x,y,color)。

       由于书本上只有斜率在0~1范围内的终点划线法,又根据书本上的方法找到了在其它斜率下的情况。

0<=k<=1

-1<=k<=0

k>1

k<-1

d=2a+b

d=2a-b

d=a+2b

d=a-2b

d>0:d2=d1+2a

d<=0:d2=d1+2a+2b

d>0:d2=d1+2a-2b

d<=0:d2=d1+2a

d>0:d2=d1+2a+2b

d<=0:d2=d1+2b

d>0:d2=d1-2a

d<=0:d2=d1+2a-2b

由于在graphics.h头文件中使用initgraph(x,y)建立绘图屏幕 只能是左上角为(0,0)

坐标,x坐标向右,y坐标向下的第一象限。所以在测试数据时候只能写起始坐标(x0,y0)终点坐标(x1,y1)在第一象限内的直线(即x0>=0,x1>=0,y0>=0,y1>=0);

Easyx下载地址:http://www.easyx.cn/downloads/

编程环境:vc6.0(安装了easyx)

运行:windows7旗舰版

至于源代码,等我的作业交上去了在贴上吧,先贴上运行结果

#include <stdio.h>
#include <graphics.h>
#include <conio.h>
//中点画线法斜率为0~1斜率为0~1
void MidPointLine1(int x0,int y0,int x1,int y1)
{
	//初始一个480*480的绘图屏幕
	initgraph(480, 480); 
	int a,b,delta1,delta2,d,x,y;
	a=y0-y1;
	b=x1-x0;
	d=2*a+b;
	delta1=2*a;
	delta2=2*(a+b);
	x=x0;
	y=y0;
	//在对应的x,y像素点着色
	putpixel(x,y,GREEN);
	while(x<x1)
	{
		if(d<0)
		{
			x++;
			y++;
			d+=delta2;
		}
		else
		{
			x++;
			d+=delta1;
		}
		//在对应的x,y像素点着色
		putpixel(x,y,GREEN);
	//可以把下面这句取消注释,按回车看画线过程。
	//	system("pause");

	}
	//为了能够看到绘图效果 加了getch() 否则会直接关闭绘图屏幕
	getch();
	closegraph();
}
//斜率>1
void MidPointLine2(int x0,int y0,int x1,int y1)
{
	//初始一个480*480的绘图屏幕
	initgraph(480, 480); 
	int a,b,delta1,delta2,d,x,y;
	a=y0-y1;
	b=x1-x0;
	d=a+2*b;
	delta1=2*(a+b);
	delta2=2*b;
	x=x0;
	y=y0;
	//在对应的x,y像素点着色
	putpixel(x,y,GREEN);
	while(y<y1)
	{
		if(d<0)
		{
			y++;
			d+=delta2;
		}
		else
		{
			y++;
			x++;
			d+=delta1;
		}
		//在对应的x,y像素点着色
		putpixel(x,y,GREEN);
	//可以把下面这句取消注释,按回车看画线过程。
	//	system("pause");

	}
	//为了能够看到绘图效果 加了getch() 否则会直接关闭绘图屏幕
	getch();
	closegraph();
}
//斜率为-1~0
void MidPointLine3(int x0,int y0,int x1,int y1)
{
	//初始一个480*480的绘图屏幕
	initgraph(480, 480); 
	int a,b,delta1,delta2,d,x,y;
	a=y0-y1;
	b=x1-x0;
	d=2*a-b;
	delta1=2*a-2*b;
	delta2=2*a;
	x=x0;
	y=y0;
	//在对应的x,y像素点着色
	putpixel(x,y,GREEN);
	while(x<x1)
	{
		if(d<0)
		{
			x++;
			d+=delta2;
		}
		else
		{
			x++;
			y--;
			d+=delta1;
		}
		//在对应的x,y像素点着色
		putpixel(x,y,GREEN);
	//可以把下面这句取消注释,按回车看画线过程。
	//	system("pause");

	}
	//为了能够看到绘图效果 加了getch() 否则会直接关闭绘图屏幕
	getch();
	closegraph();
}

//斜率<-1
void MidPointLine4(int x0,int y0,int x1,int y1)
{
	//初始一个480*480的绘图屏幕
	initgraph(480, 480); 
	int a,b,delta1,delta2,d,x,y;
	a=y0-y1;
	b=x1-x0;
	d=a-2*b;
	delta1=-2*b;
	delta2=2*(a-b);
	x=x0;
	y=y0;
	//在对应的x,y像素点着色
	putpixel(x,y,GREEN);
	while(y>y1)
	{
		if(d<0)
		{
			x++;
			y--;
			d+=delta2;
		}
		else
		{
			y--;
			d+=delta1;
		}
		//在对应的x,y像素点着色
		putpixel(x,y,GREEN);
	//可以把下面这句取消注释,按回车看画线过程。
	//	system("pause");
	}
	//为了能够看到绘图效果 加了getch() 否则会直接关闭绘图屏幕
	getch();
	closegraph();
}
int main()
{
	int x1,y1,x2,y2;
	printf("请输入起始点,终点坐标(用空格隔开,回车结束):");
	scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
	//根据斜率范围判断对应函数
	float k=(float)(y2-y1)/(float)(x2-x1);
	
	if(k>=0&&k<=1)
		MidPointLine1(x1,y1,x2,y2);//斜率为0~1 测试数据0 0 320 100
	else if(k>1)
		MidPointLine2(x1,y1,x2,y2);//斜率为>1  测试数据0 0 100 320
	else if(k>=-1&&k<=0)
		MidPointLine3(x1,y1,x2,y2);//斜率为-1~0 测试数据0 100 200 0
	else
		MidPointLine4(x1,y1,x2,y2);//斜率为<-1 测试数据0 200 100 0

}


运行结果:

1.测试数据:0 0 320 100

 

运行结果:

计算机图形学:中点划线法(任意斜率)_第1张图片

 

2.测试数据:0 0 100 320

 

运行结果:

 计算机图形学:中点划线法(任意斜率)_第2张图片

3.测试数据:0 100 200 0

 

运行结果:

 计算机图形学:中点划线法(任意斜率)_第3张图片

4.测试数据:0 200 100 0

 

运行结果:

 计算机图形学:中点划线法(任意斜率)_第4张图片


你可能感兴趣的:(计算机图形学,中点划线法,任意斜率)