C# 带半径的随机点
我在算法上进退两难。我试图生成6个随机位置,它们之间有一段距离。我的算法有效,只检查当前点和上一点之间的距离。我需要的是算法验证所有点之间的距离,如果距离小于指示值,它将生成一个新位置C# 带半径的随机点,c#,unity3d,C#,Unity3d,我在算法上进退两难。我试图生成6个随机位置,它们之间有一段距离。我的算法有效,只检查当前点和上一点之间的距离。我需要的是算法验证所有点之间的距离,如果距离小于指示值,它将生成一个新位置 private void Generate() { for (int i = 0; i <= 5; i++) { Vector3 pos = PointsGenerator(); Instantiate(point, pos, Quaternion.ident
private void Generate()
{
for (int i = 0; i <= 5; i++)
{
Vector3 pos = PointsGenerator();
Instantiate(point, pos, Quaternion.identity); // just to highlight the points on the screen
}
}
private List<Vector3> Dist = new List<Vector3>();
private bool isOver = false;
private Vector3 PointsGenerator()
{
Vector3 currentPosition = Vector3.zero;
Vector3 oldPosition = Vector3.zero;
float distance = 0f;
do
{
currentPosition = new Vector3(UnityEngine.Random.Range(minX, maxX), UnityEngine.Random.Range(minY, maxY), 0f);
for (int i = 0; i < Dist.Count; i++)
{
distance = Vector2.Distance(currentPosition, Dist[i]);
if (distance <= 4f)
{
isOver = true;
break;
}
else
isOver = false;
}
} while (isOver == true);
Dist.Add(currentPosition);
return currentPosition;
}
private void Generate()
{
对于(inti=0;i问题是什么
“我需要这6个点,它们之间不仅要有距离,而且要有距离中心+半径的值”
要实现这一点,您必须生成球体上的点。为此,请生成球体的(随机的,如果需要)中心点并定义半径。
然后,您需要使用随机球坐标(半径、随机角度1、随机角度2)
x=半径*cos(随机角度1)*sin(随机角度2)
y=半径*sin(随机角度1)*sin(随机角度2)
z=半径*cos(随机角度1)
之后,您可以使用与之前相同的算法重新生成新点,直到它们彼此远离。您可以将这些点存储在数据结构中(最适合您的需要)然后比较它们。但是,你的目标是什么?我需要这6个点,不仅它们之间有一个距离,而且从中心到半径的距离也是有价值的。当前,你的算法不会检查你在屏幕上放置的点之间是否有所需的距离。你只是检查创建的点之间是否有足够的距离仅与上一个点的所需距离。建议您存储这些点,并在将它们添加到数据结构后进行检查。您将它们存储在inNow中。我修改了上面的代码,它看起来可以工作,但不可读。将所有生成的点添加到列表中,并将当前列表传递给对PointsGenerator
`V的每次调用ECOR3随机位置生成器(向量3中心,浮点半径,int a){float ang=a;向量3位置;位置x=center.x+(半径+单位发动机随机范围(2f,4f))*Mathf.Sin(ang*Mathf.Deg2Rad);位置y=center.y+(半径-0.5f)*Mathf Cos(ang*Mathf.Deg2Rad);pos.z=center.z;return pos;}`此方法非常适合此问题……感谢大家的帮助:))