在圆圈中生成星云

时间:2014-04-12 21:14:14

标签: c# windows math xna monogame

我正在尝试在Vector2(点)附近的指定半径内生成星云。

目前我正在使用此代码

public static Vector2 GeneratePosition(Vector2 position, float radius)
{
    float X = GenerateScaleFloat() * (GenerateInt(2) == 1 ? 1 : -1);
    float Y = GenerateInt((int)(radius * -(1 - Math.Abs(X))),
                          (int)(radius *  (1 - Math.Abs(X)))) / radius;

    X *= radius;
    Y *= radius;

    return new Vector2(X, Y);
}

给了我这个结果:

(原产地:0;0,半径:300,粒子:5000Filled non-circle

在我看来,我的代码正在生成一个旋转的方块。如何让它在更圆形的图案中(和在其内部)生成粒子的位置?

GenerateScaleFloat:返回介于0.0和1.0之间的值

GenerateInt:标准rand.Next

修改 这篇文章现在被标记为重复,这不是我的意图。然而,我会在这里留下我的答案供其他googlers查找,因为我知道它有多大帮助:

新代码:

public static Vector2 GeneratePosition(Vector2 position, float radius)
{
    float X = GenerateScaleFloat() * (GenerateInt(2) == 1 ? 1 : -1) * radius;
    float Y = float.PositiveInfinity;

    while(Y > Math.Sqrt(Math.Pow(radius, 2) - Math.Pow(X, 2))
        || Y < -Math.Sqrt(Math.Pow(radius, 2) - Math.Pow(X, 2)))
    {
        Y = GenerateScaleFloat() * (GenerateInt(2) == 1 ? 1 : -1) * radius;
    }

    return new Vector2(X, Y) + position;
}

新输出:(原点:0; 0,半径100,粒子:5000) Circular nebula

希望它能帮助别人

1 个答案:

答案 0 :(得分:2)

圆形区域的公式是

x^2 + y^2 <= r^2

根据x,您可以像这样计算y

y <= +/-sqrt( r^2 - x^2 )

通过对轴应用不同的缩放因子,您可以创建椭圆。


另一种可能性是在矩形中生成点并查看它们是否在椭圆内:

a = width / 2
b = height / 2
(x/a)^2 + (y/b)^2 <= 1    Where the ellipse will be centered on
                          the origin of the coordinate system.

这可能会生成更均匀分布的点。


编辑:您可以改进新代码。而不是比较......

y > Sqrt(r^2 - x^2) OR y < -Sqrt(r^2 - x^2)

......你可以比较

y^2 > r^2 - x^2

y^2总是正数,因为减去时间减去加号。通常值得转换一个正确的数学正确公式,以使其对计算机更有效。计算平方根很贵,Math.Pow也是如此。

通过首先生成0到1之间的随机数,将其乘以半径的两倍并最终减去半径,可以更容易地实现-1和+1之间的Y值的生成。

float y2max = radius * radius - X * X;
do { 
    Y = 2 * radius * GenerateScaleFloat() - radius;
} while (Y * Y > y2max);