编程绘制一条任意线型和线宽的直线。(线型、线宽可由用户指定)
首先我们得了解一下线型和线宽的意思。
线型包括实线、虚线和点线等。线型的显示在扫描转换算法中可通过像素段的方法实现,即对各种虚线和点线,画线程序沿线路径输出一些实线段(划线),在每两个划线之间有一个空白段,划线和空白段的长度(像素数目)可用像素模板指定,像素模板是由数字0和1组成的串,它指出沿线路径哪些位置要置为前景色,哪些位置不变。例如模板11110000用来显示划线长度为4个像素、空白段为4个像素的虚线。
线宽选择的实现取决于输出设备的能力。常用的是线刷子和方刷子两种。线刷子的实现比较简单。假设直线斜率在【-1,1】之间,这时可以把刷子置成与x轴垂直的方向,刷子的中点对准直线一端点,然后让刷子中心往直线的另一端移动,即可刷出具有一定宽度的线。
下面是源代码
#include <stdio.h>
#include <conio.h>
#include <graphics.h>
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;
}
版权声明:本文为Fitz1318原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。