最近想做一个在球面上分配n个点的功能,但是找了好多c#的写法都没有。
于是网上参考了关于Python的算法 ,换成了C#的写法。
相信运行一遍的小伙伴们都会懂得如何使用,就不再一一解释了。
void Start () {
//在半径为15的球体上平均生成500个点。
CreatPointOnSphere(500,15);
}
public void CreatPointOnSphere(int _wBornPointSum,float _dwDectRadius)
{
int tempIndex = 0;
//生成
float inc = Mathf.PI * (3.0f - Mathf.Sqrt(5.0f));
float off = 2.0f / _wBornPointSum; //注意保持数值精度 m_wBornPointSum:生成的点数
float y;
float r;
float phi;
for (int i = 0; i < _wBornPointSum; i++)
{
y = (float)i * off + (off / 2.0f) - 1.0f;
r = Mathf.Sqrt(1.0f - y * y);
phi = i * inc;
Vector3 pos = new Vector3(Mathf.Cos(phi) * r * _dwDectRadius, y * _dwDectRadius, Mathf.Sin(phi) * r * _dwDectRadius); //m_dwDectRadius 距离球心的距离
tempIndex++;
BornPoint(pos, tempIndex);
}
}
RaycastHit m_hitInfo;
void BornPoint(Vector3 pos, int tempIndex)
{
GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
obj.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);
obj.transform.localPosition = pos;
obj.name = string.Concat("Cube", tempIndex);
}