是否可以创建精确到1,000,000,000%缩放的SVG?

时间:2015-06-30 17:43:44

标签: math svg 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

分开

SVG规范声明SVG对所有值都使用双精度浮点数。

通过测试,很容易验证这一点。

Affinity designer是一个矢量图形程序,允许缩放高达1,000,000,000%,它也使用双精度浮点数进行所有计算。

我想知道一个深刻理解双精度浮点数的人:是否有可能创建一个视觉上在1,000,000,000%变焦时正确的SVG?

老实说,我正在努力掌握这方面的数学:

9007199254740992(根据https://stackoverflow.com/a/1848953/2328064的双浮点数的最大值)大于1,000,000,000因此,如果某事物是2或甚至2000宽,那么在开始时它仍然很小似乎是合理的9007199254740992和缩放1,000,000,000%。

作为解决问题的方法的假设示例:

  • 如果我们创建了一个整个可见宇宙的2D切片的SVG,我们可以在浮点舍入开始移动1个像素之前放大多远?
  • 如果我们从一个1024x1024的SVG开始,我们是否可以创建一个“微观”网格,在1,000,000,000%缩放时可见且视觉上正确? (比方说,我们可以看到20多个等距的正方形)

编辑:

基于到目前为止的所有内容,确定答案是肯定的(实际查看此SVG时有一些重要且有趣的警告)。

  1. 为了在高变焦时获得最高精度,请从中心开始。
  2. SVG规范并非专为此级别的精度而设计。对于SVG查看器的规范尤其如此。
  3. (以下未提及)通常曲线在软件中表示为Bézier曲线,标准Bézier曲线实现不会绘制数学上完美的圆。

3 个答案:

答案 0 :(得分:2)

当然是。浮点数学处理相对而非绝对的精度。如果在原点创建了一个正多边形,半径为1e-7,然后将其缩放到1e7X大小,您可能会看到一个正多边形,其大小和精度与半径为1的未定义圆相同。

如果要创建相同的正多边形,其顶点居中于(0,1e9)左右,则您可能会看到一些严重错误。大的双倍没有足够的绝对精度来准确地表示小的形状。

然而,还有另一种方式表达远离原点的形状"在SVG中,使用节点转换。如果要指定相对于原点的多边形,但是给它一个(0,1e9)的平移,并缩放到该点,则期望看到与原点居中的多边形相同的精度。

但是,所有这些都假定所讨论的SVG渲染器是为了以最精确的方式进行这样的操作(例如在将形状和视图转换应用到顶点之前组成形状和视图变换,而不是一次应用一个)。鉴于这种用例的不寻常(有些人可能会说是错误的头脑),我不确定那里的任何SVG渲染器是否会达到这样的长度。

答案 1 :(得分:0)

TL; DR:可以创建这样的SVG文件,但是不可能知道仅仅遵循规范的渲染器或其他工具是否会正确渲染/处理它。

这是SVG标准过于模糊的情况。由于渲染器,画布等只需遵循规范,因此现实的答案是:您可以创建它,但它不适用于您打算使用它的目的。

答案 2 :(得分:-1)

很可能没有。

double具有大约53位精度,所以当进行1e9%的乘法时,你可以获得少量,但是没有保证。可能还不够,不能保持正确的像素,但我想你应该创建自己的解决方案,并查看rasterisation,因为这似乎是你需要了解的更多信息。