我正在尝试在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
,粒子:5000
)
在我看来,我的代码正在生成一个旋转的方块。如何让它在更圆形的图案中(和在其内部)生成粒子的位置?
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)
希望它能帮助别人
答案 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);