如何计算和创建三角形的位置?

Dub*_*oni 4 c# unity-game-engine

private void FormationTriangle()
{
    newpositions = new List<Vector3>();
    for (int x = 0; x < squadMembers.Count; x++)
    {
        for (int y = x; y < 2 * (squadMembers.Count - x) - 1; y++)
        {
            Vector3 position = new Vector3(x, y);
            newpositions.Add(position);
        }
    }

    move = true;
    formation = Formation.Square;
}
Run Code Online (Sandbox Code Playgroud)

循环是错误的.它把小队成员一个放在另一个上面.甚至不接近三角形.我希望小队成员站成三角形.

这是移动部分:但问题在于计算三角形形状位置的循环.我做的其他编队工作正常.

private void MoveToNextFormation()
{
    if (randomSpeed == false)
    {
        if (step.Length > 0)
            step[0] = moveSpeed * Time.deltaTime;
    }

    for (int i = 0; i < squadMembers.Count; i++)
    {
        squadMembers[i].transform.LookAt(newpositions[i]);
        if (randomSpeed == true)
        {
            squadMembers[i].transform.position = Vector3.MoveTowards(
                squadMembers[i].transform.position, newpositions[i], step[i]);
        }
        else
        {
            squadMembers[i].transform.position = Vector3.MoveTowards(
                squadMembers[i].transform.position, newpositions[i], step[0]);
        }
        if (Vector3.Distance(squadMembers[i].transform.position, newpositions[i]) < 
            threshold)
        {
            if (squareFormation == true)
            {
                Vector3 degrees = new Vector3(0, 0, 0);
                Quaternion quaternion = Quaternion.Euler(degrees);
                squadMembers[i].transform.rotation = Quaternion.Slerp(
                    squadMembers[i].transform.rotation, quaternion, 
                    rotateSpeed * Time.deltaTime);
            }
            else
            {
                squadMembers[i].transform.rotation = Quaternion.Slerp(
                    squadMembers[i].transform.rotation, quaternions[i], 
                    rotateSpeed * Time.deltaTime);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Dra*_*18s 6

让我们看一下位置列表中包含的简单值, 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
Run Code Online (Sandbox Code Playgroud)

这是很多职位.当然超过3个单位可以占用!至少它是一个三角形:

X\Y 0  1  2  3  4  
0   #  #  #  #  #  
1      #  #  #  
2         #  
Run Code Online (Sandbox Code Playgroud)

主要的问题是,你产生办法超过需要的位置,并希望以某种方式填充它.

你需要根据三角形的面积公式计算你的宽度和高度: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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 你的问题不只要求大纲.您的原始代码不会尝试仅生成大纲.编辑您的问题以询问该问题会使答案无效(并导致您的问题被回滚).对于垂直放置而不是水平放置的单元,这是由于Vector3与Vector2的关系,并且可以通过使用`(x,n,y)`而不是`(x,y)`(其中`n`是某个值,硬编码或其他). (2认同)

Ruz*_*ihm 6

由于您无法保证三角形的数量非常完美,因此您应该高估三角形的大小,计算已放置的单位数,然后在达到极限时退出它们.

首先,找到最小三角形数字的高度大于你的单位数,以及那个三角形数字本身:

    x
   x x
  x x x
 x x x x
x x x x x 
Run Code Online (Sandbox Code Playgroud)

然后,找到第一个单元的位置.我们需要知道我们有多少行槽以及底行槽的宽度:

    x
   x x
  x x x
 x x x x
x   x   x 
Run Code Online (Sandbox Code Playgroud)

然后,添加,直到你添加足够的

int height = Mathf.CeilToInt( (Mathf.Sqrt(8*squadMembers.Count+1f)-1f)/2 ) 
int slots = (int)(height * (height+1f)/2f)
Run Code Online (Sandbox Code Playgroud)