第一次学绘图,后来发现书上的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
运行结果:
2.测试数据:0 0 100 320
运行结果:
3.测试数据:0 100 200 0
运行结果:
4.测试数据:0 200 100 0
运行结果: