正六边形绘制方法

正六边形图形绘制方法
平面几何大家都学过,基本的概念就是点、线、面,三角形、矩形、圆形和椭圆形,还有就是多边形。学几何时都强调用圆规直尺三角板作图,学到角度就用到量角尺。那时我对五角星,六角星很感兴趣。后来有了PC,接触到了BASIC语言,那时就用它的内置函数来绘图了。积累了一定的知识和经验,也试编过图画类型的应用程序。

现时有一个行当叫做平面设计,那些个图画的东西都叫平面设计,如商标徽标设计,标牌标识,书籍杂志封面、电影海报、平面广告等等有图画图形图像的东西的设计作品都是平面设计。其中最主要的设计元素就是图形元素。
而说到图形元素,关键的东西就是图形和如何绘制图形。

兜兜转转说回来就是我喜欢图形的绘制,用编程语言把图形画出来。我对正六边形情有独衷,在编制艺术信息图表时用到正六边形图案,就试着用语言编制了这个通用函数。我感到干得不错就想和大家来分享。
我设计的方法很简单,就是依据圆内切多边形的方法。这个原理大家都知道,而关键的东西是如何填充颜色。填充的方法有二种,在框线内逐点填充或者逐线填充。我试过逐点填充机器耗时较多,选逐线填充比较好。

我设置了二种图样,一是起点角0度3点钟方向,另一是起点角90度12点钟方向。再加二个填色的,一共4个函数。若将它们封装成通用API函数就更实用更专业了。
下面我写了个样例来测试绘制六边形的函数。代码很简单,都是些基本的东西,加了注释,一看就明白。

faaaf2f04b7c4fbb92d3f77103711878.png

 

//源代码如下:
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 ************

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值