我正在尝试生成一组点(以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;
    }

最佳答案

我会将该函数抽象为createArm函数。

然后,您可以将每个 ARM (暂时)存储为自己的星系。

因此,如果您想要2个臂,则做2个5000星系。然后,将其中一个绕原点旋转0度(这样就不会移动),而将另一个绕原点旋转180度。

这样,您可以使用不同的旋转量来制作任意数量的 ARM 。您甚至可以通过使旋转距离更加随机来为其添加一些“自然化”,例如使用范围而不是直线(360/n)。例如,5个臂将分别是0、72、144、216、288。但是通过一些随机化,您可以将其设置为0、70、146、225、301。

编辑:

一些快速的Google-fu告诉我(source)

q = initial angle, f  = angle of rotation.

x = r cos q
y = r sin q

x' = r cos ( q + f ) = r cos q cos f - r sin q sin f
y' = r sin ( q + w ) = r sin q cos f + r cos q sin f

hence:
x' = x cos f - y sin f
y' = y cos f + x sin f

10-06 02:05