Unity3D 正六边形,环状扩散,紧密分布,的程序
来源:互联网 发布:精彩返奖统计软件 编辑:程序博客网 时间:2024/05/18 09:14
原文链接: http://www.cnblogs.com/AdvancePikachu/p/6401758.html
Unity3D 正六边形,环状扩散,紧密分布,的程序
最近在做一个正六边形的游戏,被一开始的布局难倒了。
需求:中心有个正六边形,输入围绕中心扩散的环数,自动创建和摆放。
大概就是这样的吧,我觉得这个非常轻松的就可以搞定了。啊~~~~~啊~~~ 五环~~,你比四环多一环,啊~~~~啊~~~五环~~,你比六环少一环~~~
可是,到底每环要放多少个六边形?经过我缜密的观察发现一个规律。
如果假设第一个环编号为1,那么每个换六边形的数量就是 环数*6。啊~~~~~啊~~~ 五环~~,一环就是紫~禁~城~~~~。
可是摆放的具体位置是哪里?既然是圆形,那就需要知道 角度 和 半径 就可以依据圆形坐标公式算出来了。
二维圆上的点坐标公式:
X = Mathf.Sin(角度*Mathf.PI/180) * 半径
Y = Mathf.Cos(角度*Mathf.PI/180) * 半径
有人可能问,上面写的公式原理是啥?哈~哈~哈~~~~
啊~~~~~啊~~~ 五环~~,你比四环多一环,啊~~~~啊~~~五环~~~~~~
参见:已知圆心,半径,角度,求圆上的点坐标 - - 博客频道 - CSDN.NET
-----半径是啥?
紧密摆放的话,半径就是六边形的宽度。而每一环的半径就是环数*第一个半径。
好了这个可以大概构建一个循环体了。
=========下面搭建循环体============
1 Int RoundMax = 10;//最大环数变量 2 3 float Radius = 1f;//六边形最短宽度 4 5 for(int round = 1;round<=RoundMax;round++)//每一层环的循环体 6 7 { 8 9 for(环上每个六边形循环体)10 11 12 Vector2 = new Vector2(Mathf.Sin(角度*Mathf.PI/180) * Radius * round, Mathf.Cos(角度*Mathf.PI/180) * Radius * round);13 14 }15 16 }
===============
那么角度又是多少?
360 ÷ 每一环的总数 = 间隔的角度
间隔的角度 × 当前序号 = 当前角度
=========下面添加每一环的计算程序============
1 Int RoundMax = 10;//最大环数变量 2 3 float Radius = 1f;//六边形最短宽度 4 5 for(int round = 1;round<=RoundMax;round++)//每一层环的循环体 6 7 { 8 9 for(int id = 0; id<=round*6; id++)//当前环的总个数 = round*610 11 {12 13 Vector2 Pos= new Vector2(14 15 Mathf.Sin(360/(round*6)*id*Mathf.PI/180) * Radius * round,16 17 Mathf.Cos(360/(round*6)*id*Mathf.PI/180) * Radius * round18 19 );20 21 }22 23 }
=======下面转为三维向量========
1 Int RoundMax = 10;//最大环数变量 2 3 float Radius = 1f;//六边形最短宽度 4 5 for(int round = 1;round<=RoundMax;round++)//每一层环的循环体 6 7 { 8 9 for(int id = 0; id<=round*6; id++)//当前环的总个数 = round*610 11 {12 13 Vector3 Pos= new Vector3(14 15 Mathf.Sin(360/(round*6)*id*Mathf.PI/180) * Radius * round,16 17 0,18 19 Mathf.Cos(360/(round*6)*id*Mathf.PI/180) * Radius * round20 21 );22 23 }24 25 }
=====距离胜利还有一步 下面引入模型和创建========
1 GameObject Zero_OBJ;//六边形物体 2 3 Int RoundMax = 10;//最大环数变量 4 5 float Radius = 1f;//六边形最短宽度 6 7 for(int round = 1;round<=RoundMax;round++)//每一层环的循环体 8 9 {10 11 for(int id = 0; id<=round*6; id++)//当前环的总个数 = round*612 13 {14 15 Vector3 Pos= new Vector3(16 17 Mathf.Sin(360/(round*6)*id*Mathf.PI/180) * Radius * round + ,18 19 0,20 21 Mathf.Cos(360/(round*6)*id*Mathf.PI/180) * Radius * round22 23 );24 25 Instantiate(Zero_OBJ,26 27 Zero_OBJ.transform.position.+ Pos ,//依据物体坐标偏移28 29 Quaternion.identity);30 31 }32 33 }
=======哈哈哈 我是在佩服我的智慧========
天空飘来五个字 那都不是事
运行结果
我去~~~真圆~~~~~
接下的十几分钟...
=================然后开始奋发图强的思考=============
其实还是有几个摆放正确的六边形
也就是说除了这0 , 60,120 , 180 , 240 , 300 角度的六边形,其余六边形其实不是正圆分布,而是直线分布。
如果是直线分布,就需要依据两点的坐标计算出排列的矢量方向,然后依据半径摆放就可以了。
=====接下吧正确位置写入 Pos_6[]========
1 GameObject Zero_OBJ;//六边形物体 2 3 Int RoundMax = 10;//最大环数变量 4 5 float Radius = 1f;//六边形最短宽度 6 7 for(int round = 1;round<=RoundMax;round++)//每一层环的循环体 8 9 {10 11 int [] Pos_6 = new int[6];//记录正确6个位置的数组12 13 for(int id = 0; id<= 6; id++)//当前环的总个数 = round*614 15 {16 17 Vector3 Pos_6[i]= new Vector3(18 19 Mathf.Sin(360/(round*6)*id*Mathf.PI/180) * Radius * round + ,20 21 0,22 23 Mathf.Cos(360/(round*6)*id*Mathf.PI/180) * Radius * round24 25 );26 27 Instantiate(Zero_OBJ,28 29 Zero_OBJ.transform.position.+ Pos_6[i] ,//依据物体坐标偏移30 31 Quaternion.identity);32 33 }34 35 36 }
中间的六边形个数规律是:
每个六边形偏移距离是:
=======接下来插入之间的六边形========
1 GameObject Zero_OBJ;//六边形物体 2 3 Int RoundMax = 10;//最大环数变量 4 5 float Radius = 1f;//六边形最短宽度 6 7 for(int round = 1;round<=RoundMax;round++)//每一层环的循环体 8 9 {10 11 int [] Pos_6 = new int[6];//记录正确6个位置的数组12 13 for(int id = 0; id<= 6; id++)14 15 {16 17 Vector3 Pos_6[i]= new Vector3(18 19 Mathf.Sin(360/(round*6)*id*Mathf.PI/180) * Radius * round + ,20 21 0,22 23 Mathf.Cos(360/(round*6)*id*Mathf.PI/180) * Radius * round24 25 );26 27 Instantiate(Zero_OBJ,28 29 Zero_OBJ.transform.position+ Pos_6[i] ,//依据物体坐标偏移30 31 Quaternion.identity);32 33 }34 35 36 if(round >1)//第2圈开始执行插入37 38 {39 40 for(int id = 0; id<= 6; id++)//逐个区间插入41 42 {43 44 int NextID =( id+1)%6;//获取下一个位置ID,在0~5中循环取值45 46 47 Vector3 Orientation = Vector3.Normalize(Pos_6[id],Pos_6[NextID])//单位朝向(当前点,上一个点)48 49 50 for(int add = 0;add<round-1;add++)//循环插入51 52 {53 54 //----------插入点 = 单位方向*当前偏移距离+起点偏移55 56 Vector3 Now_Pos =57 58 Orientation59 60 *(Radius * add)61 62 +( Pos_6[id] + Zero_OBJ.transform.position);63 64 //-------------------------------------------------------------65 66 Instantiate(Zero_OBJ,Now_Pos,Quaternion.identity);67 68 69 }70 71 72 }73 74 }75 76 }
========运行结果===========
- Unity3D 正六边形,环状扩散,紧密分布,的程序
- 简单的正六边形分形程序
- [unity3d程序] 纹理扩散
- 正六边形
- 绘制一个正六边形的shader
- 实现正六边形、圆形及带倒角正六边形的头像显示
- 输出正六边形
- scss/css正六边形
- canvas画正六边形
- 一个有特点的正六边形RecyclerView---HexagonRecyclerView介绍篇
- 一个有特点的正六边形RecyclerView---HexagonRecyclerView详解篇
- 五刀均分正六边形
- iOS截取正六边形图片
- C语言打印正六边形
- 正太分布的前世今生
- 高效判断点是否在正六边形蜂窝内的方法
- 正六边形策略游戏地图算法
- javaScript——正六边形图片裁剪
- 关于spark-submit报错java.lang.NoClassDefFoundError: scala/runtime/LambdaDeserialize
- 【BY2HIT--C51系列】000-安装配置环境
- 关于一些Vue的文章。(7)
- 【自考】——最后一次组队学习
- IMweb训练作业-todoList
- Unity3D 正六边形,环状扩散,紧密分布,的程序
- OK盈行重置任意用户密码漏洞(非爆破)
- QTSS对象
- 【Unity3D Editor】导入图片自动转换成Sprite
- 一起Talk Android吧(第十七回:Java常用类之StringBuffer)
- 剑指offer 二叉树的下一个结点
- java面试题大全带答案完整版
- redis集群——增加节点
- 聚美优品任意修改用户密码(非爆破)