Начинающий
-
Автор темы
- #1
У меня есть 30 объектов, которые появляются на рандомных координатах и мне нужно проверить чтобы расстояние между всеми этими объектами было не меньше чем 1. Если проверять это обычным перебором, то переполняется стек.
также вот метод где используется прошлый метод
C#:
private Vector3 Far(Vector3[] pastPos, Vector3 randPos)
{
float[] PastPosX = new float[pastPos.Length];
float[] PastPosY = new float[pastPos.Length];
float[] results = new float[pastPos.Length * 2];
int i = 0;
foreach (var pos in pastPos)
{
PastPosX[i] = pos.x;
PastPosY[i] = pos.y;
i++;
if (i == pastPos.Length) break;
}
i = 1;
for (int j = 0; j < pastPos.Length; j++)
{
results[j] = Math.Abs(randPos.x - PastPosX[j]);
results[i] = Math.Abs(randPos.y - PastPosY[j]);
i++;
}
foreach (var result in results)
{
if (result <= 1f)
{
randPos = GetRandomPointOnRadius(); //метод выдающий рандомное значение в нужном мне радиусе
Far(pastPos, randPos);
}
}
return randPos;
C#:
private void UpdateStarsPositions()
{
if (_starsParent == null)
return;
Vector3[] pastPos = new Vector3[0];
Vector3 playerPos = Player.transform.position;
float sqrtRadius = Radius * Radius;
int i = 0;
foreach (Transform startTr in _stars)
{
if ((playerPos - startTr.position).sqrMagnitude > sqrtRadius)
{
Array.Resize(ref pastPos, pastPos.Length + 1);
startTr.position = GetRandomPointOnRadius();
if(pastPos[0] != Vector3.zero)
startTr.position = Far(pastPos, startTr.position);
pastPos[i] = startTr.position;
i++;
}
}
}