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

      第一次学绘图,后来发现书上的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

 

运行结果:

 

 

 

 

  • 15
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
中点画圆算法计算机图形学用于绘制圆形的一种算法。该算法通过计算圆上的像素点来绘制圆形。以下是使用中点画圆算法绘制圆形的步骤: 1. 定义圆的半径r和圆心坐标(xc, yc)。 2. 初始化变量x和y,使它们分别等于0和r。 3. 计算决策参数d,d的初始值为1-r。 4. 在每个步骤,绘制8个对称的像素点。这些像素点的坐标分别为(x+xc, y+yc),(-x+xc, y+yc),(x+xc, -y+yc),(-x+xc, -y+yc),(y+xc, x+yc),(-y+xc, x+yc),(y+xc, -x+yc)和(-y+xc, -x+yc)。 5. 如果d小于0,则选择(x+1, y)作为下一个像素点,并将d更新为d+2x+3。 6. 如果d大于等于0,则选择(x+1, y-1)作为下一个像素点,并将d更新为d+2x-2y+5。 下面是使用中点画圆算法绘制圆形的Python代码: ```python import pygame def draw_circle_midpoint(screen, xc, yc, r, color): x, y = 0, r d = 1 - r while x <= y: pygame.draw.circle(screen, color, (x+xc, y+yc), 1) pygame.draw.circle(screen, color, (-x+xc, y+yc), 1) pygame.draw.circle(screen, color, (x+xc, -y+yc), 1) pygame.draw.circle(screen, color, (-x+xc, -y+yc), 1) pygame.draw.circle(screen, color, (y+xc, x+yc), 1) pygame.draw.circle(screen, color, (-y+xc, x+yc), 1) pygame.draw.circle(screen, color, (y+xc, -x+yc), 1) pygame.draw.circle(screen, color, (-y+xc, -x+yc), 1) if d < 0: d = d + 2 * x + 3 else: d = d + 2 * (x - y) + 5 y = y - 1 x = x + 1 # 示例代码 pygame.init() screen = pygame.display.set_mode((640, 480)) draw_circle_midpoint(screen, 320, 240, 100, (255, 255, 255)) pygame.display.update() while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值