计算机图形学实验六——线型和线宽

【实验名称】 线型和线宽
【实验目的】
通过实验,进一步理解和掌握线型和线宽的处理。

【实验原理】
线型包括实线、虚线和点线。线型的显示在扫描转换算法中可通过像素段方法实现,即对各种虚线和点线,画线程序沿线路径输出一些实线段(划线),在每两个划线之间有一个空白段,划线和空白段的长度(像素数目)可用像素模板指定。像素模板是由数字0和1组成的串,它指出沿线路径哪些位置要置前景色,哪些位置不置。
线刷子处理线宽。假设直线斜率在[-1,1]之间,这时可以把刷子置成与x轴垂直的方向,刷子的中点对准直线的一端点,然后让刷子中心往直线的另一端移动,即可“刷出”具有一定宽度的线。当直线斜率不在[-1,1]之间时,把刷子置成与x轴平行的方向。线刷子可通过交替地在单线宽像素点的上/下(竖直刷子)和左/右(水平刷子)画像素来显示有宽度的线。如三个像素宽的直线除了画(x,y)像素点以外,还需要画出(x,y+1)和(x,y-1)的像素点(竖直刷子),或(x+1,y)和(x-1,y)的像素点(水平刷子)。
【实验内容】
编程生成一条任意线型任意线宽的直线(该直线的线形、宽度、起始点可由用户指定)
源代码:

#include<stdio.h>
#include<math.h>
#include<graphics.h>

char LineType[7];//线型

//DDA画线算法
void DDALine(int x0,int y0,int x1,int y1,int LineWidth)
{
	int dx,dy,espl,k,i,j=0;
	float x,y,xIncre,yIncre;
	dx=x1-x0;dy=y1-y0;
	x=x0;y=y0;
	if(abs(dx)>abs(dy))
		espl=abs(dx);
	else 
		espl=abs(dy);
	xIncre=(float)dx/(float)espl;
	yIncre=(float)dy/(float)espl;
	for(k=0;k<=espl;k++)
	{
		if(LineType[j]=='1')
		{
			j++;
			if(j==7)//线型循环条件
				j=0;
			if(dy<=dx)//斜率<1,刷子与X轴垂直,X+-(i/2)
			{
				for(i=0;i<LineWidth;i++)
				{
					putpixel(int(x+0.5+i/2),int(y+0.5),YELLOW);
					putpixel(int(x+0.5-i/2),int(y+0.5),YELLOW);	
				}
			}
			else//斜率>1,刷子与X轴平行,Y+-(i/2)
			{
				for(i=0;i<LineWidth;i++)
				{
					putpixel(int(x+0.5),int(y+0.5+i/2),YELLOW);
					putpixel(int(x+0.5),int(y+0.5-i/2),YELLOW);
				}
			}
			x+=xIncre;
			y+=yIncre;
		}
			
		else
		{
			j++;
			if(j==7)
				j=0;
			x+=xIncre;
			y+=yIncre;
			continue;//跳到for循环,继续执行
		}
	}
}

int main()
{
	int x0,y0,x1,y1,LineWidth;
	int gd=DETECT,gm;
	printf("\n请输入线宽: ");
	scanf("%d",&LineWidth);
	printf("\n请输入线型: ");
	scanf("%s",&LineType);
	printf("\n请输入直线的起点和终点坐标:");
	scanf("%d %d %d %d",&x0,&y0,&x1,&y1);
	initgraph(&gd,&gm,""); 
	DDALine(x0,y0,x1,y1,LineWidth);
	getchar();getchar();// 按任意键继续
    closegraph();  
	return 0;// 关闭图形界面
}

实验结果截图:
在这里插入图片描述在这里插入图片描述

【小结或讨论】
本次实验是线型和线宽。在此次实验中,我以DDA算法为基础,然后进行线宽的处理。具体操作为:
首先定义了一个字符串类型的线型像素模板,设定像素数目为7,然后使用DDA算法进行画线,同时还在DDA算法中加入线宽的变量。接着对像素进行判断,若像素为1,则判断直线的斜率(根据dx和dy的大小来判别),如果斜率在(-1,1)之间,用与x轴垂直的线刷子,此时x的值要加/减线宽的一半;如果斜率不在(-1,1)之间,用与x轴平行的线刷子,此时y的值加/减线宽的一半。
在本次实验中,犯了两个错误,一是没有注意坐标起始点的输入格式,二是没有注意LineType是字符型,我在判断像素点的时候,把判断条件写成int型。这两个错误都导致了实验结果不能出现。

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值