正六边形图形绘制方法
平面几何大家都学过,基本的概念就是点、线、面,三角形、矩形、圆形和椭圆形,还有就是多边形。学几何时都强调用圆规直尺三角板作图,学到角度就用到量角尺。那时我对五角星,六角星很感兴趣。后来有了PC,接触到了BASIC语言,那时就用它的内置函数来绘图了。积累了一定的知识和经验,也试编过图画类型的应用程序。
现时有一个行当叫做平面设计,那些个图画的东西都叫平面设计,如商标徽标设计,标牌标识,书籍杂志封面、电影海报、平面广告等等有图画图形图像的东西的设计作品都是平面设计。其中最主要的设计元素就是图形元素。
而说到图形元素,关键的东西就是图形和如何绘制图形。
兜兜转转说回来就是我喜欢图形的绘制,用编程语言把图形画出来。我对正六边形情有独衷,在编制艺术信息图表时用到正六边形图案,就试着用语言编制了这个通用函数。我感到干得不错就想和大家来分享。
我设计的方法很简单,就是依据圆内切多边形的方法。这个原理大家都知道,而关键的东西是如何填充颜色。填充的方法有二种,在框线内逐点填充或者逐线填充。我试过逐点填充机器耗时较多,选逐线填充比较好。
我设置了二种图样,一是起点角0度3点钟方向,另一是起点角90度12点钟方向。再加二个填色的,一共4个函数。若将它们封装成通用API函数就更实用更专业了。
下面我写了个样例来测试绘制六边形的函数。代码很简单,都是些基本的东西,加了注释,一看就明白。
//源代码如下:
test (){ //试绘制正六边形样例
cs.ClearDraw (0,src); //清屏
clearOutput();
cs.SetFillMode (1);//0不填色,1填色
cs.SetColor (255,230,250,250);
cs.DrawRect (0,2,720,740); //back board
cs.SetColor (255,140,140,140);
cs.DrawRect (24,24,706,706); //back
cs.SetColor (255,250,250,250);
cs.DrawRect (20,20,700,700); //back
cs.SetFillMode (0);//0不填色,1填色
cs.SetColor (255,0,0,250);
cs.DrawRect (20,20,700,700); //back
cs.DrawRect (26,25,694,695); //back
// 正六边形绘制
//第1类:顶点左右向,(3,9点钟方向)
cs.SetFillMode (1);//0不填色,1填色
cs.SetStrokeWidth(2); //线
cs.SetColor(255,230,230,230);
// cs.DrawCircle (360,315,272) ; //底色
cs.SetColor(255,0,150,250);
x=140 ; y=170 ; L=100 ; //以3参数绘六边形
hexagon10 () ;
x=360 ; y=170 ; L=100 ; //以3参数绘六边形
hexagon11 () ;
x=580 ; y=170 ; L=100 ; //以3参数绘六边形
cs.SetColor(255,0,250,150);
hexagon11 () ;
cs.SetColor(255,250,0,0);
hexagon10 () ;
cs.SetColor(255,0,0,250);
cs.DrawText ("绘线不填色", 85,300) ;
cs.DrawText ("填色 ", 340,300) ;
cs.DrawText ("套线填色 ", 540,300) ;
//第2类:顶点上下向 (12,6点钟方向)'
cs.SetColor(255,0,150,250);
x=140 ; y=440 ; L=100 ; //以3参数绘六边形
hexagon0 () ;
x=360 ; y=440 ; L=100 ; //以3参数绘六边形
hexagon1 () ;
x=580 ; y=440 ; L=100 ; //以3参数绘六边形
cs.SetColor(255,0,250,150);
hexagon1 () ;
cs.SetColor(255,250,0,0);
hexagon0 () ;
cs.SetColor(255,0,0,250);
cs.DrawText ("绘线不填色", 85,580) ;
cs.DrawText ("填色 ", 340,580) ;
cs.DrawText ("套线填色 ", 540,580) ;
//题标: 艺术立体字制作
cs.SetFillMode (1);//0不填色,1填色
cs.SetTextStyle (1);
cs.SetStrokeWidth(1);
cs.SetTextSize (44);
ss="正六边形绘制方法 " ;
cs.SetColor(255,50,120,20); //立体字
cs.DrawText (ss,200,654); //阴影
cs.SetColor(255,0,250,0);
cs.DrawText (ss,200,650); //本字
cs.SetFillMode (0);//0不填色,1填色
cs.SetColor(255,250,150,0);
cs.DrawText (ss,200,650); //框线
cs.Update ();
}//test () //test draw hexagon
//*下面是四个绘制正六边形的函数。传入的值是坐标点x,y,以及边长L,其实边长就是外接圆的半径。如要证明就交给数学老师吧。
//*线颜色和填色颜色是使用时的当前颜色。使用时设置颜色。
//*如封装一下就是标准的正六边形的绘制函数了。
//注:我用a=pi/360习惯了,若改为a=pi/180 则i*60度
hexagon0 (){ // line mode 竖式 0位 12点钟方向,不填色
//flaot x, y, L
a=pi/360-100 ;
x3=(float)(L*cos(a))+x ; //起始0点
y3=(float)(-L*sin(a))+y ;
x5=x3 ; y5=y3 ;
for (i=1; i<=5; i++){ //六角点
a=pi/360*i*120-100 ;
x4=(float)(L*cos(a))+x ;
y4=(float)(-L*sin(a))+y ; //逆时针
cs.DrawCircle(x4,y4,1);
cs.DrawLine (x5,y5,x4,y4); //连线
x5=x4; y5=y4 ; }
cs.DrawLine (x5,y5,x3,y3); //连线0点
}//hexagon0 ()
hexagon1 (){ //绘制六边形 Fillmode,填色
//flaot x, y, L
//先从顶点12点钟方向,向下填充
a=pi/360*1*120-100 ;
x4=(float)(L*cos(a))+x ;
y4=(float)(-L*sin(a))+y ; //逆时针
// cs.DrawCircle (x4,y4, 5);
a=pi/360-100; //2点钟
x3=(float)(L*cos(a))+x ; //起始0点
y3=(float)(-L*sin(a))+y ;
// cs.DrawCircle (x3,y3, 5); //标点
a=pi/360*2*120-100 ;
x5=(float)(L*cos(a))+x ;
y5=(float)(-L*sin(a))+y ; //逆时针
// cs.DrawCircle (x5,y5, 5);
for (n=1; n<=L; n++){ //六角点
cs.DrawLine (x4,y4+n,x5,y5+n); //连线
cs.DrawLine (x4,y4+n,x3,y3+n);
} //连线
//再从6点钟方向,向上填充
a=pi/360-100 ; //5点钟
x4=(float)(L*cos(a))+x ;
y4=(float)(L*sin(a))+y ; //顺时针
//cs.DrawCircle (x4,y4, 5);
a=pi/360*1*120-100; //6点钟
x3=(float)(L*cos(a))+x ; //起始0点
y3=(float)(L*sin(a))+y ;
// cs.DrawCircle (x3,y3, 5);
a=pi/360*2*120-100 ; //7点钟
x5=(float)(L*cos(a))+x ;
y5=(float)(L*sin(a))+y ; //顺时针
// cs.DrawCircle (x5,y5, 5);
for (n=1; n<=L; n++){ //六角点
cs.DrawLine (x5,y5-n,x3,y3-n); //连线
cs.DrawLine (x4,y4-n,x3,y3-n);
} //连线
}//hexagon1 ()
hexagon10 (){ //line mode 横式 0位 3点钟方向,不填色
//flaot x, y, L
a=pi/360+m;
x3=(float)(L*cos(a))+x ; //起始0点
y3=(float)(-L*sin(a))+y ;
x5=x3 ; y5=y3 ;
for (i=1; i<=5; i++){ //六角点
a=pi/360*i*120 ;
x4=(float)(L*cos(a))+x ;
y4=(float)(-L*sin(a))+y ; //逆时针
cs.DrawCircle(x4,y4,1);
cs.DrawLine (x5,y5,x4,y4); //连线
x5=x4; y5=y4 ; }
cs.DrawLine (x5,y5,x3,y3); //连线0点
}//hexagon10 ()
hexagon11 (){ //Fillmode 横式,填色
//flaot x, y, L
//横式六边形,右起始点3点钟方向,向左填充
a=pi/360*1*120 ;
x4=(float)(L*cos(a))+x ;
y4=(float)(-L*sin(a))+y ; //逆时针
// cs.DrawCircle (x4,y4, 5);
a=pi/360;
x3=(float)(L*cos(a))+x ; //起始点,3点钟方向
y3=(float)(-L*sin(a))+y ;
// cs.DrawCircle (x3,y3, 5); //标点
a=pi/360*5*120 ;
x5=(float)(L*cos(a))+x ;
y5=(float)(-L*sin(a))+y ; //逆时针
// cs.DrawCircle (x5,y5, 5);
for (n=1; n<=L; n++){ //六角点
cs.DrawLine (x4-n,y4,x3-n,y3); //连线
cs.DrawLine (x5-n,y5,x3-n,y3);
} //连线
//再从左起,始点9点钟方向,向右填充
a=pi/360*2*120 ;
x4=(float)(L*cos(a))+x ;
y4=(float)(-L*sin(a))+y ; //逆时针
// cs.DrawCircle (x4,y4, 5);
a=pi/360*3*120 ;
x3=(float)(L*cos(a))+x ; //左起点,9点钟方向
y3=(float)(-L*sin(a))+y ;
//cs.DrawCircle (x3,y3, 5);
a=pi/360*4*120 ;
x5=(float)(L*cos(a))+x ;
y5=(float)(-L*sin(a))+y ; //逆时针
// cs.DrawCircle (x5,y5, 5);
for (n=1; n<=L; n++){ //六角点
cs.DrawLine (x4+n,y4,x3+n,y3); //连线
cs.DrawLine (x5+n,y5,x3+n,y3);
} //连线
}//hexagon11 ()
//**** END ************