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%。
作为解决问题的方法的假设示例:
编辑:
基于到目前为止的所有内容,确定答案是肯定的(实际查看此SVG时有一些重要且有趣的警告)。
答案 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,因为这似乎是你需要了解的更多信息。