Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将椭圆分割为相等的线段?_Javascript_Algorithm_Math_Graphics_Geometry - Fatal编程技术网

Javascript 如何将椭圆分割为相等的线段?

Javascript 如何将椭圆分割为相等的线段?,javascript,algorithm,math,graphics,geometry,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 * sinalph

这将计算椭圆上的顶点坐标:

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

但是我如何计算“角度”来获得相等或大致相等的圆周段呢?

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

,但我认为最适合OP的方法是同心圆法,在页面上被列为“绘图员法”。如果你不介意安装Mathematica播放器,有一个简洁的lil应用程序可以交互地演示它

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

详细说明:这是一个椭圆象限,参数
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

利用这一知识,以及曲线下面积是曲线总长度的知识,构造椭圆近似值的问题简化为找到红线的a(其他求积也可以,但这是最简单的),这样每个矩形的面积相等

将这句话转换成一个方程,用矩形的左边界
x
及其宽度
w
表示矩形在正交中的位置,我们得到:

(v*m)*w^2 + (m*x+c)*w - A/k == 0
其中,
k
是我们想要用来近似象限的块数,
v
是一个权重函数,我将很快介绍。这可用于通过首先设置
x0=0
并求解
w0
,然后用于设置
x1=w0
并求解
w1
来构造正交。然后设置
x2=w1
,等等,直到获得所有
k
左侧边界点。
k+1
th边界点显然是
Pi/2

权重函数
v
有效地表示矩形穿过红线的位置。常数<代码> V=0.5 相当于在中间交叉,得到10点:

但你可以玩转它,看看有什么更好的平衡点。理想情况下,它应该保持在
[0,1]
范围内,并且您使用的值的总和应该是
k/2


如果您希望获得更好的近似值,而不必混淆权重函数,则可以尝试最小二乘法拟合直线,而不仅仅是将其拟合到端点,或者可以尝试将三次多项式拟合到蓝色曲线,而不是线性多项式。这需要解决四次方程,但如果你手头有一个数学软件包,那就不应该是个问题。

评论太长了,所以我想这应该是一个答案

这里有一个数学上简单的方法来形成一阶近似。选择一个象限。可以通过X轴和Y轴上的反射为其他象限生成数据。计算角度=0度,1度。。。90度。现在,您希望小长度连接连续点。如果(x_n,y_n)是角度=n的坐标,那么毕达哥拉斯告诉我们点(x_n,y_n)和(x_n+1,y_n+1)之间的距离D=sqrt((x_n+1-x_n)^2+(y_n+1-y_n)^2)。使用此公式可以为0度到90度的角度生成围绕椭圆的累积距离表。这是你所寻求的函数的倒数。当然,你不必选择1度的步长;你可以使用任何角度,精确地划分90度

如果要查找与周长步长x相对应的角度,请在表格中查找产生小于或等于x的部分周长的最大角度n。角度n+1的部分周长将大于x。使用线性插值查找对应于x的分数角度

我们所做的就是用直线段近似椭圆,并用它们代替原始曲线;这是一阶近似。使用辛普森规则或类似规则而不是线性插值可以做得更好


是的,你必须提前计算表格。但是一旦你有了表格,计算就很容易了。如果您不需要太高的精度,这在数学和编码方面都非常简单。

要做到这一点,您必须求解椭圆积分。不太好。看。有没有其他方法可以把椭圆分成相等的段呢?最后两条线(X和Y)错了。如果你能做的话,我会很感激的so@Jozi刚刚更新了近似值,使其具有大致相等的比例。意识到前一个问题使近似值看起来比实际情况糟糕得多。最长片段的长度与最短片段的长度之比为1.33。出于兴趣,你最终想出了更好的方法吗?你好,安迪,刚刚读了你有趣的帖子。你有excel或mathca吗