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

Is it possible to create an SVG that is precise to 1,000,000,000% zoom?

拆分自:

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

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

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

我想从深入了解双精度浮点数的人那里知道:是否可以创建一个在 1,000,000,000% 缩放时视觉上正确的 SVG?

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

9007199254740992(根据 的双浮点数的最大值)大于 1,000,000,000,因此如果某些东西的宽度为 2 甚至 2000,那么它仍然很小似乎是合理的从 9007199254740992 开始,缩放 1,000,000,000%。

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

编辑:

根据目前的所有情况,最终答案是肯定的(对于实际查看此 SVG 有一些重要且有趣的注意事项)。

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

很可能没有。

double 的精度约为 53 位,因此在进行 1e9% 的乘法运算时,您可以获得少量,但不能保证。可能不足以保持在正确的像素中,但我想您应该创建自己的解决方案并查看 rasterisation,因为这似乎是您需要了解的更多信息。

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

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

但是,还有另一种在 SVG 中表达 "shapes far from the origin" 的方法,即使用节点转换。如果您要指定相对于原点的多边形,但将其平移 (0,1e9),并缩放到该点,您会期望看到与以原点为中心的多边形相同的精度。

然而,所有这些都假设所讨论的 SVG 渲染器旨在以最精确的方式执行此类操作(例如在将形状和视图转换应用于顶点之前组合它们,而不是在一次)。考虑到这种用例的不寻常(有些人可能会说,错误的头脑),我不确定那里是否有任何 SVG 渲染器达到这样的长度。

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

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