1

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

4

2 回答 2

2

鉴于这种边界情况,我将只测试输入参数以查看其中一个是否适用,并使用单独的逻辑在适用边界情况时根据需要绘制一条水平线或垂直线。

这是一种相当普遍的方法,并且在计算上非常有效。

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

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

于 2012-12-13T16:16:01.297 回答
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
于 2012-12-13T18:39:53.037 回答