Посмотрим, что содержит список позиций для простого значения, n = 3
Сначала цикл x от 0 до 2 (3 - 1
)
Затем для каждого x, цикл от x до 4-x (3*2 - x - 1 - 1
)
Помня, что a<b
совпадает с a<=b-1
Это дает нам ...
0,0
0,1
0,2
0,3
0,4
1,1
1,2
1,3
2,2
Каких позиций много. Конечно, может занять более 3 единиц! По крайней мере, это треугольник:
X\Y 0 1 2 3 4
0 # # # # #
1 # # #
2 #
Основная проблема в том, что вы генерируете способов * на 1020 * больше позиций, чем необходимо, и ожидаете как-то заполнить их.
Вам необходимо рассчитать ширину и высоту на основе формулы площади для треугольника: A = (b*h)/2
, и вы можете даже захотеть b=h
, где A = number of units
.
Итак, как-то так:
int b = Mathf.CeilToInt(Mathf.Sqrt(squadMembers.Count));
for (int x = 0; x < b; x++)
{
//the divide by 2 is accounted for with this 2*
for (int y = x; y < 2 * (b - x) - 1; y++)
{
Vector3 position = new Vector3(x, y);
newpositions.Add(position);
}
}