gpt4 book ai didi

javascript - 如何将椭圆分成相等的部分?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:18:07 25 4
gpt4 key购买 nike

计算椭圆上的顶点坐标:

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;
}

但是如何计算“Angular ”以获得相等或大致相等的圆周段?

最佳答案

因此,根据 Jozi 在 OP 的评论中所说的,需要的不是如何将椭圆分割为相等的段(这需要一大堆可怕的积分),而是从大致相等长度的线段构造一个椭圆.

There are a whole pile of ways to do that ,但我认为最适合 OP 目的的是同心圆方法,在页面上列为“绘图员方法”。如果您不介意安装 Mathematica 播放器,这里有一个简洁的 lil' 应用程序 here以交互方式说明。

这些方法的问题在于,在低偏心率下,线段长度仅大致相等。如果你处理极端的怪癖,事情就会变得复杂得多。我能想到的最简单的解决方案是线性近似每个象限内的线段长度,然后精确求解该象限内端点的位置。

详细说明:这是一个参数为 a = 5, b = 1 的椭圆象限: enter image description here

这是 length of the arc subtended by an infinitesimal change in the angle 的情节, 在每个 Angular :

enter image description here

x 轴是 Angular ,以弧度表示,y 轴是 Angular 变化 1 弧度所对应的弧长。可以使用我刚刚链接的维基百科文章中的方程导出的公式是 y = Sqrt(a^2 Sin^2(x) + b^2 Cos^2(x)) .但需要注意的重要一点是,此函数的积分 - 这条曲线下的面积 - 是整个象限中弧的长度。

现在,我们可以用一条直线来近似它:

enter image description here

具有梯度 m = (a-b)/(Pi/2)y 截距 c = b。使用简单的几何图形,我们可以推断出红色曲线下方的面积为 A = (a+b)*Pi/4

利用这些知识,以及曲线下面积是曲线总长度的知识,构造椭圆近似值的问题简化为找到一个 midpoint-rule quadrature。 (其他正交也可以,但这是最简单的)红线,使得每个矩形的面积相等。

将该句子转换为方程式,并用左边界 x 及其宽度 w 表示矩形在正交图中的位置,我们得到:

(v*m)*w^2 + (m*x+c)*w - A/k == 0

其中 k 是我们要用来近似象限的 block 数,v 是我稍后会提到的权重函数。这可用于通过首先设置 x0 = 0 并求解 w0 来构造正交,然后用于设置 x1 = w0 和求解 w1。然后设置 x2 = w1,等等,直到您获得所有 k 左侧边界点。第 k+1 个边界点显然是 Pi/2

权重函数 v 有效地表示矩形与红线的交点。常量 v = 0.5 等价于它从中间穿过,得到 10 分:

enter image description here

但您可以尝试一下,看看什么能更好地平衡这些点。理想情况下,它应保持在 [0, 1] 范围内,您使用的值的总和应为 k/2

如果您想要一个更好的近似值而不用弄乱加权函数,您可以尝试用最小二乘法拟合一条线而不是仅仅将它拟合到端点,或者您可以尝试将三次多项式拟合到蓝色曲线而不是线性多项式。这需要求解四次方程,但如果您手头有数学包,那应该不是问题。

关于javascript - 如何将椭圆分成相等的部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20197974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com