Как избежать O(n^2) C#
нужно замерить расстояние между всеми точками массива и найти все соседние для каждой из них, как можно это сделать не используя вложенный цикл?
foreach (var joint in joints)
{
foreach (var jointNext in joints)
{
if (joint == jointNext) continue;
if((jointNext.Position - joint.Position).magnitude <= _jointsConnectDistance)
{
TwoWayConnetion(joint, jointNext);
}
}
}
Ответы (2 шт):
Предлагаю оптимизацию, которая хорошо работает для хороших наборов точек.
Разбейте всю плоскость или пространство где живут ваши точки квадратной или кубической решёткой. Шаг решётки _jointsConnectDistance. Каждая точка помещается в корзину соответствующую квадрату или кубу куда она попадает. Координаты квадрата или куба - это кортеж целых чисел. По ним удобно размещать точки в HashMap.
Когда HashMap готов, пробегаете по его корзинам. Точки из корзины надо сравнивать только с точками из той же корзины и её восемью или двадцатью шестью соседками.
Если расстояние заранее не известно или вы хотите использовать разные расстояние для разных точек, используйте K-d дерево.
Если под найти соседние вы имеете ввиду это:
То это называется триангуляция.
Есть разные фигуры: convex, concave с дырками.
Алгоритмы триангуляции не просты.
Поищите готовые фреймворки триангуляции для C#.

