Вопрос Как проверить расстояние между объектами

Начинающий
Статус
Оффлайн
Регистрация
11 Авг 2021
Сообщения
22
Реакции[?]
1
Поинты[?]
0
У меня есть 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++;
            }
        }
    }
 
Пользователь
Статус
Оффлайн
Регистрация
17 Июл 2021
Сообщения
463
Реакции[?]
119
Поинты[?]
11K
Какой перебор? Здесь же простая математика.

C++:
int GetDistance(FVector Coords1, FVector Coords2)
{
    const auto Difference = (Coords1.X - Coords2.X) * (Coords1.X - Coords2.X) + (Coords1.Y - Coords2.Y) * (Coords1.Y - Coords2.Y) + (Coords1.Z - Coords2.Z) * (Coords1.Z - Coords2.Z);
    return sqrt(Difference) / 100;
}
 
Пользователь
Статус
Оффлайн
Регистрация
29 Авг 2020
Сообщения
86
Реакции[?]
109
Поинты[?]
16K
Расстояние между двумя точками это длина вектора между ними. В юнити для векторов и геометрии уже все придумано и не надо изобретать велосипеды:
Пожалуйста, авторизуйтесь для просмотра ссылки.

По поводу задачи: у тебя каждый объект появляется по очереди и надо проверить, что расстояние с другими объектами не меньше 1? Или у тебя уже все 30 объектов стоят на своих местах и надо в один заход проверить, что все они на растоянии не меньше 1 друг от друга?
 
Начинающий
Статус
Оффлайн
Регистрация
6 Ноя 2022
Сообщения
2
Реакции[?]
0
Поинты[?]
0
Что-то ты в коде значит намудрил, не переполниться стек есть ты пройдёшь циклом по 30-ти объектам и проверишь их дистанцию.
А так в целом у unity api есть метод для подобных вычислений

float dist =
Пожалуйста, авторизуйтесь для просмотра ссылки.
(other.position, transform.position);
в метод
Пожалуйста, авторизуйтесь для просмотра ссылки.
кладёшь позиции каждого объекта получаешь дистанцию
 
Сверху Снизу