如何使用正交距离拟合生成超紧凑矢量图形

通过使用 ODF 算法拟合贝塞尔曲线来生成高质量、最小的 SVG 图。如何使用正交距离拟合生成超紧凑矢量图形图一文首先出现在 Towards Data Science 上。

来源:走向数据科学

1. 简介

是可视化数学函数的自然媒介。对于矢量图形,函数由连接的三次贝塞尔曲线段来近似,这些曲线在显示时被光栅化(即转换为像素)[1]。由于光栅化被延迟,矢量图形图像自然比基于像素的图像更便携,因为渲染可以根据其显示环境进行定制。无论您将矢量图形放大多少,您总是会看到清晰的线段;而如果您将光栅化图像放大得足够大,您最终会看到代表像素的颗粒状块。

虽然矢量图形是一种出色的绘图格式,但生成良好的矢量图形可能具有挑战性。例如,考虑一下我们如何采用 matplotlib [2] 中函数 f(t) = exp(−t)cos(−2πt), 0 ≤ t ≤ 5 的示例图来生成 SVG 图像:

将 matplotlib.pyplot 导入为 plt

将 numpy 导入为 np

定义 f(t):

返回 np.exp(-t) * np.cos(2*np.pi*t)

t = np.arange(0.0, 5.0, 0.02)

plt.plot(t, f(t))

plt.savefig('fig.svg')

Matplotlib 使用 250 条分段连接的线段(以交替颜色显示)来近似平滑图。虽然情节看起来不错,但它比需要的要大得多。相反,如果我们生成像 PNG 这样的光栅化图像,则如何构造曲线的细节并不重要;但对于矢量图形,各个线段会穿过并保留在输出图像中。不过,通过一些调整,我们可以在不牺牲图像质量的情况下大幅改善尺寸。算法 F(将贝塞尔路径拟合到函数)。给定一个参数函数 f(t) = (f_x(t), f_y(t)), a≤t≤b,将贝塞尔路径 g 拟合到 f,使得F2.使用信赖域优化器 [8] 和 Penner 算法 [3],拟合贝塞尔曲线 g 以最小化§3 中提供了此步骤的更多详细信息。F3.计算如果M小于目标阈值,则终止;否则,设置2. 功能概览