【发布时间】:2015-08-25 05:33:39
【问题描述】:
我正在尝试使用 SVG 路径创建高性能、美观的铅笔工具。
我正在记录鼠标坐标以绘制路径。为了获得高保真路径(精确到用户的移动),我需要为每个像素移动记录一个点。
保留路径中的每个点会创建大量点,这对于以后的协作功能不是理想(来回发送大量点效率不高),加上解析每次我需要操纵它们的巨大路径是一个瓶颈
在路径的线性区域,冗余点被移除,只保留代表路段所需的点 - 我使用Ramer-Douglas-Peucker 算法来做到这一点。
但简化路径会将其变成低保真多边形
此时路径实际上只是连接的线 - 因此路径看起来是锯齿状的。
一种可能的解决方案是将路径点与 Cubic Bezier's 连接 - 但是这在简化路径上效果不佳。每个点之间的距离对于三次贝塞尔曲线来说太大而无法“坐”好,因此平滑的路径不再准确地代表用户的预期路径。
另一种解决方案是在原始路径上简单地使用“后处理”算法,例如 Schneider's Algorithm - 该算法实际上不会实时工作,因为它会消耗性能
理想的解决方案
(我认为)可行的解决方案是使用Centripetal Catmull-Rom 插值。
在我研究的所有算法中,这似乎是最有前途的:
- 它不会在狭窄的拐角处产生自相交
- 它更贴合点,因此更准确地表示 原始路径。
Catmull-Rom 是一种插入一系列 常规 x/y 点或原始路径是否需要由 曲线?
【问题讨论】:
-
像许多其他编程语言一样,SVG 可以绘制二次和三次贝塞尔曲线和弧线,规范中没有任何更花哨的东西。
-
@HummelingEngineering 是的,我知道,我什至在问题中提到了它
-
@Nicholas_Kyriakides 这是您第二个问题的答案。我认为你必须使用一系列贝塞尔曲线来描述你的路径,控制点来自 Catmull-Rom 算法。
-
是的 - 但是如何是可行的问题
-
@Nicholas_Kyriakides 你没有在你的问题中提到贝塞尔曲线,虽然这是在 SVG 中使某些东西变得平滑的唯一方法,所以无论如何你最终都会使用它们。当您已经使用 Ramer–Douglas–Peucker 算法减少数据时,您是否尝试将这些数据用作 Bezier 控制点?
标签: svg computational-geometry curve-fitting catmull-rom-curve