Rik*_*iko 5 javascript algorithm math graphics geometry
这将计算椭圆上的顶点坐标:
function calculateEllipse(a, b, angle)
{
var alpha = angle * (Math.PI / 180) ;
var sinalpha = Math.sin(alpha);
var cosalpha = Math.cos(alpha);
var X = a * cosalpha - b * sinalpha;
var Y = a * cosalpha + b * sinalpha;
}
Run Code Online (Sandbox Code Playgroud)
但是如何计算“角度”以获得相等或大致相等的圆周段?
因此,从 Jozi 在 OP 评论中所说的来看,需要的不是如何将椭圆细分为相等的线段(这将需要一大堆可怕的积分),而是从大致相等长度的线段构造一个椭圆。
有很多方法可以做到这一点,但我认为最适合OP目的的是同心圆方法,在页面上列为“绘图员方法”。如果您不介意安装 Mathematica 播放器,这里有一个简洁的小应用程序,它以交互方式演示了它。
这些方法的问题在于,段长度仅在低偏心率下大致相等。如果你正在处理极端怪异的事情,事情就会变得更加复杂。我能想到的最简单的解决方案是线性近似每个象限内线段的长度,然后精确求解该象限内端点的位置。
详细来说:这是一个椭圆象限,其参数为a = 5, b = 1:

这是每个角度的角度 的无穷小变化所对的弧长的图:

x轴是角度(以弧度为单位),y轴是角度变化 1 弧度所对应的弧长。可以使用我刚刚链接的维基百科文章中的方程导出的公式是。但需要注意的重要一点是,该函数的积分(该曲线下的面积)是整个象限中弧的长度。y = Sqrt(a^2 Sin^2(x) + b^2 Cos^2(x))
现在,我们可以用一条直线来近似它:

它有梯度m = (a-b) / (Pi/2)和y截距c = b。使用简单的几何图形,我们可以推断出红色曲线下方的面积为A = (a+b)*Pi/4。
利用这些知识,以及曲线下面积是曲线总长度的知识,构造椭圆近似的问题可以简化为寻找中点法则求积(其他求积也可以,但这是最简单)的红线,使得每个矩形具有相等的面积。
将该句子转换为方程,并用矩形的左边界x和宽度表示矩形在正交中的位置w,我们得到:
(v*m)*w^2 + (m*x+c)*w - A/k == 0
Run Code Online (Sandbox Code Playgroud)
其中k是我们想要用来近似象限的块数,v是我很快就会谈到的加权函数。这可用于通过首先设置x0 = 0并求解来构建求积w0,然后使用该求积来设置x1 = w0并求解w1。然后设置x2 = w1等,直到获得所有k左侧边界点。第k+1一个边界点显然是Pi/2。
加权函数v有效地表示矩形与红线相交的位置。常数v = 0.5相当于它在中间交叉,并得到 10 分:

但你可以尝试一下,看看什么可以更好地平衡这些点。理想情况下,它应该保持在范围内[0, 1],并且您使用的值的总和应该为k/2。
如果您想要更好的近似值,而又不想弄乱权重函数,您可以尝试使用最小二乘法拟合直线,而不仅仅是将其拟合到端点,或者您可以尝试将三次多项式拟合到蓝色曲线而不是线性多项式。这需要解决四次方程,但如果你手头有数学包,那应该不是问题。