使用浮点精度,计算圆上点的位置时存在舍入误差。
示例:
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/