绘制蜂窝状六角网格

    很多研究已经证明,将网格点排列成六角网格的形式是一种最佳排列,在目前使用的四角网格显示器中,很容易出现锯齿,而六角因为在数学上和物理上的特性,理论上更适合作为座标系统。
    比如一些更加讲究策略的游戏多就使用六角网格座标系统,如英雄无敌3,辐射,大航海时代,大菠萝1似乎也是。
    这里要做的就是使用 GDI+ 绘制一个六角网格,网上关于这方面的资料很少。

    实例图 :

    o_FO2_BOSS.PNG

  
  计算采用六角网格的类直角逻辑坐标

        /// <summary>
        
///  生成指定大小的六角网格
        
/// </summary>

        
/// <param name="gridSize">六角格的大小(水平直径和垂直直径)</param>
        
/// <param name="mapSize">六角网格的大小</param>
        
/// <returns>六角网格的路径</returns>
        public  GraphicsPath BuildHexes(Size gridSize, Size mapSize)
        {
            List
<PointF> lines = null
;
            
//六角格的水平半径和垂直半径

            float wRad = (gridSize.Width / 2 );
            
float hRad = (gridSize.Height / 2
);
            
//六角格的水平垂直线,垂直线

            float wLine = (float)(Math.Sqrt(Math.Pow(wRad, 2- Math.Pow(wRad / 22 )));
            
float hLine = (float)(Math.Sqrt(Math.Pow(hRad, 2- Math.Pow(hRad / 22
)));
            
//进行蜂窝式切合所必要的位移量

            float wSpec = (wRad - wLine) * 2 ;
            
float hSpec = (hRad - hLine) * 2
;
            
//六角格的中心点

            float  cx, cy;
            GraphicsPath result 
= new
 GraphicsPath();
            
for (int y = 0; y < mapSize.Height; y++
)
            {
                
for (int x = 0; x < mapSize.Width; x++
)
                {
                    
//计算当前六角格的中心点

                    cx = (gridSize.Width * (x + 1)) -  wRad;
                    cy 
= (gridSize.Height * (y + 1)) -
 hRad;
                    cx 
= cx - (wSpec *
 x);
                    cy 
= cy - (hSpec * y) * 2
;
                    
if (y % 2 == 1
)
                    {
                        cx 
= cx +
 wLine;
                    }
                    
//保存六角格的六个角的位置

                    lines = new List<PointF>(6 );
                    
//

                    PointF start = new PointF(cx, cy -  hRad);
                    lines.Add(start);
                    
//东北

                    lines.Add(new PointF(cx + wLine, cy - hRad / 2 ));
                    
//东南

                    lines.Add(new PointF(cx + wLine, cy + hRad / 2 ));
                    
//

                    lines.Add(new PointF(cx, cy +  hRad));
                    
//西南

                    lines.Add(new PointF(cx - wLine, cy + hRad / 2 ));
                    
//西北

                    lines.Add(new PointF(cx - wLine, cy - hRad / 2 ));
                    
//回到起点:北

                    lines.Add(start);
                    result.AddLines(lines.ToArray());
                    result.CloseFigure();
                }
            }
            
return
 result;
        }




然后随便建一个 Form,覆写其 OnPaint 方法,如下:

        protected override void  OnPaint(PaintEventArgs e)
        {
            
base
.OnPaint(e);
            GraphicsPath path 
= BuildHexes(new Size(3620), new Size(1010
));
            e.Graphics.DrawPath(Pens.Blue, path);
        }



这样你就能见到一个蜂窝状的六角网格了。


参考文献 :
六角网格上的图象算法及几何量定义


PS:
blog系统居然不允许链接中有来自 goo gle pag s.com 的内容/图片

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值