Math 画一个给定曲率的圆

Math 画一个给定曲率的圆,math,drawing,Math,Drawing,我想画一个给定曲率k的圆。 我只需要知道给定x坐标的y坐标。因此,即z=1/k+sqrt(1/k^2-x^2)是我通常使用的。 问题是我的k被允许变为零。这意味着我的圆变成了一条线。对于一个数学家来说,这不是问题。但对我的电脑来说是。例如,当k是最小双倍值时,y将是无穷大,对于k==0,我接收到y的nan。 有什么方法可以做到这一点吗?考虑到这样的边界情况,我只需测试输入参数,看看其中一个是否适用,如果边界情况适用,使用单独的逻辑仅绘制一条水平线或垂直线 这是一种相当常见的方法,计算效率也相当高

我想画一个给定曲率k的圆。
我只需要知道给定x坐标的y坐标。因此,即z=1/k+sqrt(1/k^2-x^2)是我通常使用的。 问题是我的k被允许变为零。这意味着我的圆变成了一条线。对于一个数学家来说,这不是问题。但对我的电脑来说是。例如,当k是最小双倍值时,y将是无穷大,对于k==0,我接收到y的nan。

有什么方法可以做到这一点吗?

考虑到这样的边界情况,我只需测试输入参数,看看其中一个是否适用,如果边界情况适用,使用单独的逻辑仅绘制一条水平线或垂直线

这是一种相当常见的方法,计算效率也相当高

在测试边界情况时,测试k以确保: -k^2不会溢出正在使用的数据类型 -k不太小,以至于1/k^2会使正在使用的数据类型下溢

在任何一种情况下,使用适当的边界大小写逻辑。谢谢@Godeke指出这一点。

你给出了公式

y1 = 1/k + sqrt(1/k^2 - x^2)    // (1)
它用半径
1/k
和中心
(0,1/k)
描述圆的上半部分。现在对于较小的
k
来说,这些值变得非常大,最终将超出您的图形范围

圆的下半部分由

y2 = 1/k - sqrt(1/k^2 - x^2)    // (2)
对于接近零的k,这些值“接近”行
y=0
。但对于较小的
k
,(2)计算两个大数字的差值。这会导致精度损失和可能的溢出

但是你可以把公式(2)改写成等价的形式

y2 = k * x^2 / (1 + sqrt(1 - k^2 * x^2))    // (2a)
现在,您可以计算圆的下半部分,以获得
k
的小值,甚至可以计算
k=0
的小值,而不会出现任何溢出或精度损失

对于上半部分,您始终具有
y1>=1/k
。因此,如果
1/k
大于绘图区域的边界,则可以忽略上限值。否则,您可以通过

y1 = 2/k - y2

在进行计算之前,您是否尝试过检查k=0?一个重要的澄清是,您的边界案例测试不应采用
k==0
的形式,而应采用
k
的形式,其中
minimum
是一个计算不会低于所用精度的值。@Godeke:这是一个错误重要的一点。我会更新答案的正文来反映这个。太好了,这正是我想要的!我忘了在我的问题中有一个减号(z=-1/k…)使线位于x轴上。因为我只需要上半部分,所以我用你的(2a)表示:
y=-k*x^2/(1+sqrt(1-k^2*x^2))/(2b)