星系生成算法
我正在尝试生成一组点(由 Vector
结构表示)来粗略地模拟螺旋星系。
我一直在使用的 C# 代码如下;但我似乎只能让它生成银河系的一个“手臂”。
public Vector3[] GenerateArm(int numOfStars, int numOfArms, float rotation)
{
Vector3[] result = new Vector3[numOfStars];
Random r = new Random();
float fArmAngle = (float)((360 / numOfArms) % 360);
float fAngularSpread = 180 / (numOfArms * 2);
for (int i = 0; i < numOfStars; i++)
{
float fR = (float)r.NextDouble() * 64.0f;
float fQ = ((float)r.NextDouble() * fAngularSpread) * 1;
float fK = 1;
float fA = ((float)r.NextDouble() % numOfArms) * fArmAngle;
float fX = fR * (float)Math.Cos((MathHelper.DegreesToRadians(fA + fR * fK + fQ)));
float fY = fR * (float)Math.Sin((MathHelper.DegreesToRadians(fA + fR * fK + fQ)));
float resultX = (float)(fX * Math.Cos(rotation) - fY * Math.Sin(rotation));
float resultY = (float)(fY * Math.Cos(rotation) - fX * Math.Sin(rotation));
result[i] = new Vector3(resultX, resultY, 1.0f);
}
return result;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
检查一下。这是使用密度波理论对星系的模拟。代码可用。
http://beltoforion.de/galaxy/galaxy_en.html
Check this. It's a simulation of galaxy using density wave theory. Code is available.
http://beltoforion.de/galaxy/galaxy_en.html
我非常喜欢这个想法,我不得不自己尝试一下,这是我的结果。
请注意,我使用 PointF 而不是 Vector3,但您应该能够在一些地方搜索、替换和添加
, 0)
。示例:
结果:
I liked this idea so much i had to play around with it on my own and here is my result.
Note that i used PointF instead of Vector3, but you should be able to search and replace and add
, 0)
in a few places.Example:
Result:
我会将该函数抽象为 createArm 函数。
然后,您可以将每个手臂存储为自己的星系(暂时)。
因此,如果您想要 2 个臂,请执行 2 个 5000 的星系。然后,将其中一个绕原点旋转 0 度(因此不会移动),另一个绕原点旋转 180 度。
这样,您可以通过使用不同的旋转量来完成任意数量的手臂。您甚至可以通过使旋转距离更加随机来添加一些“自然化”,例如使用范围而不是直线(360 / n)。例如,5 个臂将是 0、72、144、216、288。但是通过一些随机化,您可以将其变为 0、70、146、225、301。
编辑:
一些快速的 google-fu 告诉我(来源)
I would abstract that function out into a
createArm
function.Then you can store each arm as its own galaxy (temporarily).
So if you want 2 arms, do 2 galaxies of 5000. Then, rotate one of them 0 degrees around the origin (so doesn't move) and the other 180 degrees around the origin.
With this you can do an arbitrary number of arms by using different rotation amounts. You could even add some "naturalization" to it by making the rotation distance more random, like with a range instead of straight (360 / n). For example, 5 arms would be 0, 72, 144, 216, 288. But with some randomization you could make it 0, 70, 146, 225, 301.
Edit:
Some quick google-fu tells me (source)