javascript - 如何使用 Javascript 来平均划分一个圆,使其正确到 1,000,000,000% 缩放?

标签 javascript math precision arbitrary-precision

分离自: https://stackoverflow.com/questions/31076846/is-it-possible-to-use-javascript-to-draw-an-svg-that-is-precise-to-1-000-000-000

使用浮点精度,计算圆上点的位置时存在舍入误差。

示例:

function pointsOnACircle (whichpoint, numberOfPoints, cx, cy, radius) {
    //Returns a point along the outside of a circle, starting at (whichpoint=1) = 0 degrees

    eachpoint = whichpoint * 2 * Math.PI /numberOfPoints;
    var thiscx = cx + (radius * Math.sin(eachpoint));
    var thiscy = cy - (radius * Math.cos(eachpoint));

    thisPoint = [ thiscx, thiscy ];

    return thisPoint;
}

如果函数运行为 fourthPointofSix = pointsOnACircle (4, 6, 126, 126, 63); 则返回的点为

0:71.44039956158039 1:157.50000000000003

使用 http://www.ttmath.org/online_calculator 处的计算器计算它们,数字应该是:

0:71.440399561580365.. 1:157.5

类似地,如果我们运行 fifthPointofSix = pointsOnACircle (5, 6, 126, 126, 63); 那么返回的点是:

0:71.44039956158034 1:94.50000000000004

它们应该是:

0: 71.440399561580365... 1:94.5

注意:点 4 和 5 的 x 应该相同,但它们返回不同

是否有标准解决方案来解决此类基于圆的精确计算?

最佳答案

很可能需要非常大的变焦。其中一个例子是交互式分形图。对于此类应用程序,您不想缩放静态对象,而是需要一个动态解决方案,其中重新计算对象,以便精度适合比例因子。例如在这个程序中 Scalable circle您可以缩放到任何您想要的级别。此解法使用圆方程 (x-1)^2 + y^2 = 1 的隐式版本。

如果我们看一下数字的精度IEEE floating point double为我们提供 15-16 位小数的浮点精度。对于 1e7 = 1,000,000,000% 缩放来说这应该没问题。 Math.sin() 和 Math.cos() 精确到最后一位二进制数字。

取问题中的值并减去实际值 71.44039956158039 - 71.440399561580365 = 2.842170943040401e-14 现在将其乘以比例因子 1e7 得到 2.842170943040401e-7 误差小于百万分之一像素。 (我使用 chromes javascript 控制台来进行计算)。

如果比例因子是 1e14,我们可能会开始遇到问题,这里的误差是 2.8421709430404007 几个像素。对于该级别的缩放,您需要不同的算法。好消息是,在这种缩放级别下,圆与直线将无法区分。所以我们可以只使用 y=m x+c。更难的一点是确定圆上的点是否位于我们的观察区域内。我们开始遇到指定圆半径的准确性问题。

关于javascript - 如何使用 Javascript 来平均划分一个圆,使其正确到 1,000,000,000% 缩放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31079577/

相关文章:

javascript - Jquery/Ajax 有时会失败

python - 在 python 中,我如何遍历一个字符串并将它拆分到不同的位置?

language-agnostic - 对于任何有限浮点值,是否保证 x - x == 0?

javascript - 如何使变量成为可调用函数?

javascript - 在 jQuery 中查找下一个元素

javascript - 生成两个数字之间的任意随机数的 Javascript 设备如何在数学上工作?

binary - 十进制 float 与二进制的相互转换

c++ - Coverity 发现 : Not restoring ostream format (STREAM_FORMAT_STATE)

javascript - 在 PHP 中,使用 Header 还是 Javascript 更适合重定向?

math - 将表示时间的十进制转换为小时、分钟、秒