最近在做一个正六边形的游戏,被一开始的布局难倒了。

需求:中心有个正六边形,输入围绕中心扩散的环数,自动创建和摆放。

大概就是这样的吧,我觉得这个非常轻松的就可以搞定了。啊~~~~~啊~~~ 五环~~,你比四环多一环,啊~~~~啊~~~五环~~,你比六环少一环~~~

可是,到底每环要放多少个六边形?经过我缜密的观察发现一个规律。

如果假设第一个环编号为1,那么每个换六边形的数量就是 环数*6。啊~~~~~啊~~~ 五环~~,一环就是紫~禁~城~~~~。

可是摆放的具体位置是哪里?既然是圆形,那就需要知道 角度半径 就可以依据圆形坐标公式算出来了。

二维圆上的点坐标公式:

X = Mathf.Sin(角度*Mathf.PI/180) * 半径

Y = Mathf.Cos(角度*Mathf.PI/180) * 半径

有人可能问,上面写的公式原理是啥?哈~哈~哈~~~~

啊~~~~~啊~~~ 五环~~,你比四环多一环,啊~~~~啊~~~五环~~~~~~

参见:已知圆心,半径,角度,求圆上的点坐标 - - 博客频道 - CSDN.NET

-----半径是啥?

紧密摆放的话,半径就是六边形的宽度。而每一环的半径就是环数*第一个半径。

好了这个可以大概构建一个循环体了。

=========下面搭建循环体============

 Int RoundMax = ;//最大环数变量

 float Radius = 1f;//六边形最短宽度

 for(int round = ;round<=RoundMax;round++)//每一层环的循环体

 {

 for(环上每个六边形循环体)

 Vector2 = new Vector2(Mathf.Sin(角度*Mathf.PI/) * Radius * round, Mathf.Cos(角度*Mathf.PI/) * Radius * round);

 }

 }

===============

那么角度又是多少?

360 ÷ 每一环的总数 = 间隔的角度

间隔的角度 × 当前序号 = 当前角度

=========下面添加每一环的计算程序============

 Int RoundMax = ;//最大环数变量

 float Radius = 1f;//六边形最短宽度

 for(int round = ;round<=RoundMax;round++)//每一层环的循环体

 {

 for(int id = ; id<=round*; id++)//当前环的总个数 = round*6

 {

 Vector2 Pos= new Vector2(

 Mathf.Sin(/(round*)*id*Mathf.PI/) * Radius * round,

 Mathf.Cos(/(round*)*id*Mathf.PI/) * Radius * round

 );

 }

 }

=======下面转为三维向量========

 Int RoundMax = ;//最大环数变量

 float Radius = 1f;//六边形最短宽度

 for(int round = ;round<=RoundMax;round++)//每一层环的循环体

 {

 for(int id = ; id<=round*; id++)//当前环的总个数 = round*6

 {

 Vector3 Pos= new Vector3(

 Mathf.Sin(/(round*)*id*Mathf.PI/) * Radius * round,

 ,

 Mathf.Cos(/(round*)*id*Mathf.PI/) * Radius * round

 );

 }

 }

=====距离胜利还有一步 下面引入模型和创建========

 GameObject Zero_OBJ;//六边形物体

 Int RoundMax = ;//最大环数变量

 float Radius = 1f;//六边形最短宽度

 for(int round = ;round<=RoundMax;round++)//每一层环的循环体

 {

 for(int id = ; id<=round*; id++)//当前环的总个数 = round*6

 {

 Vector3 Pos= new Vector3(

 Mathf.Sin(/(round*)*id*Mathf.PI/) * Radius * round + ,

 ,

 Mathf.Cos(/(round*)*id*Mathf.PI/) * Radius * round

 );

 Instantiate(Zero_OBJ,

 Zero_OBJ.transform.position.+ Pos ,//依据物体坐标偏移

 Quaternion.identity);

 }

 }

=======哈哈哈 我是在佩服我的智慧========

天空飘来五个字 那都不是事

运行结果

我去~~~真圆~~~~~

接下的十几分钟...

=================然后开始奋发图强的思考=============

其实还是有几个摆放正确的六边形

也就是说除了这0 , 60,120 , 180 , 240 , 300 角度的六边形,其余六边形其实不是正圆分布,而是直线分布。

如果是直线分布,就需要依据两点的坐标计算出排列的矢量方向,然后依据半径摆放就可以了。

=====接下吧正确位置写入 Pos_6[]========

 GameObject Zero_OBJ;//六边形物体

 Int RoundMax = ;//最大环数变量

 float Radius = 1f;//六边形最短宽度

 for(int round = ;round<=RoundMax;round++)//每一层环的循环体

 {

 int [] Pos_6 = new int[];//记录正确6个位置的数组

 for(int id = ; id<= ; id++)//当前环的总个数 = round*6

 {

 Vector3 Pos_6[i]= new Vector3(

 Mathf.Sin(/(round*)*id*Mathf.PI/) * Radius * round + ,

 ,

 Mathf.Cos(/(round*)*id*Mathf.PI/) * Radius * round

 );

 Instantiate(Zero_OBJ,

 Zero_OBJ.transform.position.+ Pos_6[i] ,//依据物体坐标偏移

 Quaternion.identity);

 }

 }

中间的六边形个数规律是:

每个六边形偏移距离是:

=======接下来插入之间的六边形========

 GameObject Zero_OBJ;//六边形物体

 Int RoundMax = ;//最大环数变量

 float Radius = 1f;//六边形最短宽度

 for(int round = ;round<=RoundMax;round++)//每一层环的循环体

 {

 int [] Pos_6 = new int[];//记录正确6个位置的数组

 for(int id = ; id<= ; id++)

 {

 Vector3 Pos_6[i]= new Vector3(

 Mathf.Sin(/(round*)*id*Mathf.PI/) * Radius * round + ,

 ,

 Mathf.Cos(/(round*)*id*Mathf.PI/) * Radius * round

 );

 Instantiate(Zero_OBJ,

 Zero_OBJ.transform.position+ Pos_6[i] ,//依据物体坐标偏移

 Quaternion.identity);

 }

 if(round >)//第2圈开始执行插入

 {

 for(int id = ; id<= ; id++)//逐个区间插入

 {

 int NextID =( id+)%;//获取下一个位置ID,在0~5中循环取值

 Vector3 Orientation = Vector3.Normalize(Pos_6[id],Pos_6[NextID])//单位朝向(当前点,上一个点)

 for(int add = ;add<round-;add++)//循环插入

 {

 //----------插入点 = 单位方向*当前偏移距离+起点偏移

 Vector3 Now_Pos =

 Orientation

 *(Radius * add)

 +( Pos_6[id] + Zero_OBJ.transform.position);

 //-------------------------------------------------------------

 Instantiate(Zero_OBJ,Now_Pos,Quaternion.identity);

 }

 }

 }

 }

========运行结果===========

 
作者:CRomputer-罗军
链接:https://zhuanlan.zhihu.com/p/25243438
来源:知乎

Unity3D 正六边形,环状扩散,紧密分布,的程序的更多相关文章

  1. 正六边形网格化(Hexagonal Grids)原理与实现

    在路径规划.游戏设计栅格法应用中,正六边形网格不如矩形网格直接和常见,但是正六边形具有自身的应用特点,更适用于一些特殊场景中,比如旷阔的海洋.区域或者太空.本文主要讲述如何对正六边形进行几何学分析.网 ...

  2. css3--布局正六边形

    怎样布局正六边形?-->如果不能直接布局,就只能采用图形的组合.-->既然是正六边形,则: -->AB=2分之根号3乘2倍的边长,也就是对于矩形ABCD来说,AB是BD的根号3倍(也 ...

  3. ArcGIS中实现指定面积蜂窝(正六边形)方法

    本篇博文为博主(whgiser)原创,转载请注明. 空间聚集研究中,地理尺度大多数都是基于格网构建的,只需fishnet下就行了.也常有使用社区.交通小区(TZ)作为研究单元的.直到发现蜂窝网络做出的 ...

  4. #使用Python的turtle绘制正六边形、叠边形

    1.#Python的turtle绘制正六边形 代码: len=100 #表示边长像素 import turtle as t #正六边形内角都是120度,外角60度 for i in range(6): ...

  5. 内存模型 Memory model 内存分布及程序运行中(BSS段、数据段、代码段、堆栈

    C语言中内存分布及程序运行中(BSS段.数据段.代码段.堆栈) - 秦宝艳的个人页面 - 开源中国 https://my.oschina.net/pollybl1255/blog/140323 Mem ...

  6. 估计量|估计值|置信度|置信水平|非正态的小样本|t分布|大样本抽样分布|总体方差|

    5 估计量和估计值是什么? 估计量不是估计出来的量,是用于估计的量. 估计量:用于估计总体参数的随机变量,一般为样本统计量.如样本均值.样本比例.样本方差等.例如:样本均值就是总体均值的一个估计量. ...

  7. 第五课 Css3旋转放大属性,正六边形的绘制

    ---恢复内容开始--- 一.效果 二.知识点 1.background-color: rgba(0,0,0,.4);   (红色.绿色.蓝色.透明度(0-1)) 2.position: absolu ...

  8. unity3d俄罗斯方块源码教程+源码和程序下载

    小时候,大家都应玩过或听说过<俄罗斯方块>,它是红白机,掌机等一些电子设备中最常见的一款游戏.而随着时代的发展,信息的进步,游戏画面从简单的黑白方块到彩色方块,游戏的玩法机制从最简单的消方 ...

  9. C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)

      BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段 : ...

随机推荐

  1. 团队项目中js冲突

    在我们平时的项目中,特别是模块化开发中.经常会遇到一些js冲突问题,特别是当项目复杂到一定程度的时候.比如项目中引入了相当多的类库,框架以后. 那么.我们如何去避免或者解决这类问题呢? 1.避免使用全 ...

  2. KoaHub平台基于Node.js开发的Koa的模板系统handlebars插件代码详情

    koahub-handlebars koahub-handlebars koahub handlebars templates Installation $ npm install koahub-ha ...

  3. Hibernate优缺点

    下面就Hibernate优缺点分别进行简单的阐述.1.Hibernate优点:(1)对象/关系数据库映射(Basic O/R Mapping)它使用时只需要操纵对象,使开发更对象化,抛弃了数据库中心的 ...

  4. html5常用英语单词

    Aabsolute 绝对active 激活的align 对齐alpha 半透明度animation 卡通片绘制auto 自动aside 偏栏 Bbackground 背景bgcolor 背景颜色blo ...

  5. eclipse清除运行Maven build...后积累的配置项

      1.使用eclipse运行maven命令,经常会积累很多的配置项. 2.清理配置项同样在 Run As ---> Run configurations...中.     

  6. 《Machine Learning》系列学习笔记之第三周

    第三周 第一部分 Classification and Representation Classification 为了尝试分类,一种方法是使用线性回归,并将大于0.5的所有预测映射为1,所有小于0. ...

  7. Apache无法启动原因

    Apache不能启动解决办法 作者的话:遇到这个问题的时候,从网上找了很多资料,结果都是让我这个新手摸不着头绪 还好,在我长时间的查找下,还是找到了一篇文章,解决了我的烦恼,下面是我对这个文章的一些对 ...

  8. (9)集合之Set,HashSet,TreeSet

    TreeSet子类 注意事项: 1.向TreeSet添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素自然顺序的特性进行排序存储 2.往TreeSet添加元素的时候,如果元素本身不具备自 ...

  9. 使用Nginx+CppCMS构建高效Web应用服务器(之二)

    使用Nginx+CppCMS构建高效Web应用服务器(之二) 上一篇 使用Nginx+CppCMS构建高效Web应用服务器(之一) 大致介绍了网站的整体架构,实际上通过调用REST获取数据并没有实现. ...

  10. 微信JS图片上传与下载功能--微信JS系列文章(三)

    概述 在前面的文章微信JS初始化-- 微信JS系列文章(一)中已经介绍了微信JS初始化的相关工作,接下来本文继续就微信JS的图片上传功能进行描述,供大家参考. 图片上传 $(function(){ v ...