- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
计算椭圆上的顶点坐标:
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
的椭圆象限:
这是 length of the arc subtended by an infinitesimal change in the angle 的情节, 在每个 Angular :
x 轴是 Angular ,以弧度表示,y 轴是 Angular 变化 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
。
利用这些知识,以及曲线下面积是曲线总长度的知识,构造椭圆近似值的问题简化为找到一个 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 分:
但您可以尝试一下,看看什么能更好地平衡这些点。理想情况下,它应保持在 [0, 1]
范围内,您使用的值的总和应为 k/2
。
如果您想要一个更好的近似值而不用弄乱加权函数,您可以尝试用最小二乘法拟合一条线而不是仅仅将它拟合到端点,或者您可以尝试将三次多项式拟合到蓝色曲线而不是线性多项式。这需要求解四次方程,但如果您手头有数学包,那应该不是问题。
关于javascript - 如何将椭圆分成相等的部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20197974/
我是一名优秀的程序员,十分优秀!