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吗