计算机图形学考试-绘制一条任意线型和线宽的直线。

编程绘制一条任意线型和线宽的直线。(线型、线宽可由用户指定)

首先我们得了解一下线型和线宽的意思。

线型包括实线、虚线和点线等。线型的显示在扫描转换算法中可通过像素段的方法实现,即对各种虚线和点线,画线程序沿线路径输出一些实线段(划线),在每两个划线之间有一个空白段,划线和空白段的长度(像素数目)可用像素模板指定,像素模板是由数字0和1组成的串,它指出沿线路径哪些位置要置为前景色,哪些位置不变。例如模板11110000用来显示划线长度为4个像素、空白段为4个像素的虚线。

线宽选择的实现取决于输出设备的能力。常用的是线刷子和方刷子两种。线刷子的实现比较简单。假设直线斜率在【-1,1】之间,这时可以把刷子置成与x轴垂直的方向,刷子的中点对准直线一端点,然后让刷子中心往直线的另一端移动,即可刷出具有一定宽度的线。

下面是源代码

#include 
#include 
#include 
char xing[8];
void DDALine(int x0,int y0,int x1,int y1,int color,char* xing,int kuan)
{
    int dx,dy,epsl,k,i,p=0;
    float xIncre,yIncre,x,y;
    dx = x1 - x0;
    dy = y1 - y0;
    x = x0;
    y = y0;
    if(abs(dx) > abs(dy))
        epsl = abs(dx);
    else
        epsl = abs(dy);
    xIncre = (float)dx / (float)(epsl);
    yIncre = (float)dy / (float)(epsl);

    for(k = 0; k < epsl; k++)
    {
        if(xing[p] == '0')
        {
            p++;
            if(p == 8)
              p = 0;
            x += xIncre;
            y += yIncre;
            continue;
        }
            p++;
            if(p == 8)
                p = 0;
            if(y0 - y1 <= 0)
            for(i = 0; i < kuan; i++)
		{
             putpixel((int)(x + 0.5),(int)(y + 0.5 + i / 2),color);
             putpixel((int)(x + 0.5),(int)(y + 0.5 + i / 2),color);
		}
		else
			for(i = 0; i < kuan; i++)
		{
             putpixel((int)(x + 0.5 + i / 2),(int)(y + 0.5),color);
             putpixel((int)(x + 0.5 + i / 2),(int)(y + 0.5),color);
		}
        x += xIncre;
        y += yIncre;
	}
}
int main()
{
   int gdriver,gmode;
   int q,w,e,r;
   int kuan;
   printf("E31414042 殷俊\n");
   printf("请输入线宽和线型\n");
   scanf("%d %s",&kuan,xing);
   printf("请输入端点坐标\n");
   scanf("%d %d %d %d",&q,&w,&e,&r);
   gdriver = DETECT;
   initgraph(&gdriver,&gmode,"");
   DDALine(q,w,e,r,RED,xing,kuan);
   getch();
   closegraph();
   return 0;
}



你可能感兴趣的:(计算机图形学)