C#数学圈

Circle C# Mathematics

好的...这个问题对大多数人来说会变得很复杂...我正在尝试为两件事找出一个公式,这样我就可以用将近一行代码编写所有这些并让它继续下去只要我愿意..

  1. 注释部分的公式,因此我可以通过以某种方式使用比率来摆脱对 i > && i < 的需要。

  2. 角度 2.4f, 1f, 0.6f 0.5f 的公式(可能更精确但是...如何?!

不需要关于半径的帮助,它是 1.2f 的完美增量,这可能是以某种方式找出其他 2 个所需的公式的一部分?

这里有太多的数学运算,对我来说只是变得有点复杂,我只是想不出如何减少它超过这一点...

pointNum = (i * 1.0f) / 7;

if (i > 0 && i <= 6) //cannot divide by 0
{
    angle = pointNum * Mathf.PI * 2.4f;
    radius = 1.2f;
}
else if(i > 6 && i <= 20) //3.3333~
{
    angle = pointNum * Mathf.PI * 1f;
    radius = 2.4f;
}
else if(i > 20 && i <= 43) //2.15
{
    angle = pointNum * Mathf.PI * 0.6f;
    radius = 3.6f;
}
else if(i > 43 && i <= 79) //1.837209302325581
{
    angle = pointNum * Mathf.PI * 0.5f;
    radius = 4.8f;
}

float x = Mathf.Sin(angle) * radius;//radiusX;
float z = Mathf.Cos(angle) * radius;//radiusZ;

pos = new Vector2(x, z);

最终结果如下:

同心圆的半径就是小圆直径加上整数倍的间隔。

C1 直径 = 1 * ((2*R) + S); C2 直径 = 2 * ((2*R) + S);

要知道可以创建多少个小圆圈,您必须计算形成黄线的角度(绿色填充)。如果你拿黄色、绿色和蓝色线组成的三角形,这个角度很容易计算。

cos = 绿线长度/黄线长度;

绿线长度=C1直径;

黄线长度= sqrt(蓝线长度*蓝线长度+绿线长度*绿线长度);

用余弦你可以用acos函数计算角度。

稍后你可以将 360 除以角度,得到圆的数量。

当然不会精确,但是小数部分可以分配给各个圆圈

好吧...这两种方法我都翻译了 Blau 的答案的一部分但是...性能已经很差了,事实证明我的方法更快所以猜想手动做并创建范围将是我唯一的选择,感谢大家提供的信息。

void CreateConcentricCircles(int i)
    {
        //Method1
        pointNum = (float)i / 7;
        if (angleCache != pointNum * Mathf.PI)
            angleCache = pointNum * Mathf.PI;

        if (i > 0 && i <= 7) //cannot divide by 0
        {
            angle = angleCache * 2f;
            radius = 1.2f;
        }
        else if(i > 7 && i <= 21) //3.3333~
        {
            angle = angleCache * 1f;
            radius = 2.4f;
        }
        else if(i > 21 && i <= 44) //2.15
        {
            angle = angleCache * 0.6f;
            radius = 3.6f;
        }
        else if(i > 44 && i <= 72) //1.837209302325581
        {
            angle = angleCache * 0.5f;
            radius = 4.8f;
        }
        else if(i > 72 && i <= 103)
        {
            angle = angleCache * 0.45f;
            radius = 6f;
        }
        else if(i > 103 && i <= 138)
        {
            angle = angleCache * 0.4f;
            radius = 7.2f;
        }
        else if(i > 138 && i <= 151)
        {
            angle = angleCache * 0.37f;
            radius = 8.4f;
        }

        float x = Mathf.Sin(angle) * radius;//radiusX;
        float z = Mathf.Cos(angle) * radius;//radiusZ;
        pos = new Vector2(x, z);

        //Method2

        /*if (i > 0 && i <= 6) //cannot divide by 0
            radius = 1.2f;
        else if(i > 6 && i <= 20) //3.3333~
            radius = 2.4f;
        else if(i > 20 && i <= 43) //2.15
            radius = 3.6f;
        else if(i > 43 && i <= 71) //1.837209302325581
            radius = 4.8f;
        else if(i > 71 && i <= 102)
            radius = 6f;
        else if(i > 102 && i <= 150)
            radius = 7.2f;

        float C1 = 1 * ((2*radius) + i);
        //float C2 = 2 * ((2*radius) + i);

        //what's blue line? is it C2?
        float anglex = Mathf.Sin(C1) * radius;
        float anglez = Mathf.Cos(C1) * radius;

        pos = new Vector2(anglex, anglez);*/
    }