我想绘制一个曲率为k的圆。
我只需要知道给定x坐标的y坐标。因此,即z = 1 / k + sqrt(1 / k ^ 2 - x ^ 2)是我通常使用的。
问题是我的k被允许变为零。这意味着我的圆圈变成了一条线。对于没有问题的数学家来说。但对于我的电脑来说。例如,当k是最小双精度值时,y将是无穷大,对于k == 0,我接收到y为nan
有没有办法完成这项工作?
答案 0 :(得分:2)
考虑到这样的边界情况,我只测试输入参数以查看其中一个是否适用并使用单独的逻辑来适当地绘制水平线或垂直线(如果边框情况适用)。
这是一种相当常见的方法,计算效率很高。
在测试边框情况时,请测试 k 以确保: - k ^ 2 不会溢出正在使用的数据类型 - k 不是很小, 1 / k ^ 2 会使正在使用的数据类型下溢
在任何一种情况下,请使用适当的边框大小写逻辑。感谢@Godeke指出这一点。
答案 1 :(得分:1)
你给出了公式
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
y1 = 2/k - y2