javascript 如何生成一个有N条边的多边形,偶数边为L1,奇数边为L2,并且底部总是完全水平的?

piah890a  于 2023-05-21  发布在  Java
关注(0)|答案(1)|浏览(96)

我想创建一个函数,它生成一个多边形,边为N,偶数边为L1,奇数边为L2
这是我目前为止的代码:

function generatePolygon(n, L1, L2) {
    let longerEdges = Math.ceil(n / 2);
    let shorterEdges = n - longerEdges;
    let Lavg = (L1 * longerEdges + L2 * shorterEdges) / n;
    const r = Lavg / (2 * Math.sin(Math.PI / n)); 
    let startAngleRad = Math.PI * (90 - (2 - 1) * 360 / (2 * n)) / 180; 
    let angle = 0; 

    let vertices = [];

    for (let i = 0; i < n; i++) {
        let x = Math.round((r * Math.cos(angle + startAngleRad)) * 10) / 10;
        let y = Math.round((r * Math.sin(angle + startAngleRad)) * 10) / 10;
        
        vertices.push([x, y]);
        
        if ((i + 1) % 2 === 0) {
            angle += 2 * Math.PI * L1 / (Lavg * n);
        } else {
            angle += 2 * Math.PI * L2 / (Lavg * n);
        }
    }

    return vertices;
}

它工作正常,但我现在想有基地(底部边缘)的多边形总是完全水平。
这是我用N = 10L1 = 180L2 = 144运行函数的结果:

你可以看到的问题是,基地不是完全水平。
我还应该提到,我希望第一个或最后一个边缘是基础,我还需要这个函数与任何N一起工作。

h43kikqp

h43kikqp1#

为了得到长度为L的圆弦,对应的Angular 应该是2*arcsin(L/2 R)。因此,为了得到弦长的任何序列(例如L1,L2,L1,...)我们可以沿着圆在相应的Angular 上走。
走N步后,我们将沿着圆走一个Angular 。它可以大于360度,也可以小于360度,这取决于半径。我们会得到一个半径,总共是360度。
现在我没有看到一个简单的公式来计算所需的半径,但如果近似值是可以的,它可以通过二分搜索找到:如果我们走了超过360度,我们需要一个更小的半径,如果我们走得更少-一个更大的。
如果需要第一条边是水平的,可以从与angle=-arcsin(L1/2 R)对应的点开始。

相关问题