计算机图形学实验六——线型和线宽
Posted 大灬白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机图形学实验六——线型和线宽相关的知识,希望对你有一定的参考价值。
【实验名称】 线型和线宽
【实验目的】
通过实验,进一步理解和掌握线型和线宽的处理。
【实验原理】
线型包括实线、虚线和点线。线型的显示在扫描转换算法中可通过像素段方法实现,即对各种虚线和点线,画线程序沿线路径输出一些实线段(划线),在每两个划线之间有一个空白段,划线和空白段的长度(像素数目)可用像素模板指定。像素模板是由数字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型。这两个错误都导致了实验结果不能出现。
以上是关于计算机图形学实验六——线型和线宽的主要内容,如果未能解决你的问题,请参考以下文章