我在Actionscript中创建了一个绘图应用程序(虽然我的问题与Actionscript无关)。基本思想是在按下鼠标时开始绘画并跟踪鼠标移动。我想要的是:
目前,(1)存在问题,因为我在几秒钟内就可以获得数千个鼠标移动。由于(1)线条看起来很锯齿。 当前的想法:当用户完成绘制线时,我将所有移动存储在一个数组中并减少它们(中位数阈值),然后使用样条算法重新创建一条线。
有更好的方法吗?
答案 0 :(得分:10)
见Sarah Frisken的Efficient Curve Fitting。也可以at the author's page。
答案 1 :(得分:6)
(在寻找同样的问题时碰到了你的问题,碰巧把我们自己的东西放在一起)
http://willowsystems.github.com/jSignature/#/about/linesmoothing/
(与SEO相同的链接: http://willowsystems.github.com/jSignature/%2523%252Fabout%252Flinesmoothing%252F.html)
您描述的问题是双重的。 1.您想要“简化”捕获数据。 2.你想在点内绘制一条漂亮的线条(“适合曲线”)。
上面引用的Simplify.js确实不错,但它只给你积分。对于jSignature,我们想要一种超高效,非滞后的曲线拟合算法。
请参阅上面的链接,了解一个(我们的)拟合方法(Bezier aka'cubic')点之间的曲线。它允许您保持用户绘制的线条,并且只是在连接最后2个坐标时滞后,或者您可以简化并重绘整条线。
(我们出版的算法是故意的,因为建立“现有技术”并排除了组合方法的可剥性。这意味着,我们没有把自己的专利支架放在算法上,并且很难搜索并且没有找到它可以在其他地方获得专利。当然可能会有一些专利巨头可能会在你实施这个方法时遇到问题,但至少不是我们。所以,尽情享受吧。)
演示链接在鼠标移动时使用4像素跳过。这很粗糙,但可以实现数据的实时“简化”。如果您能够捕获整个笔划并重新绘制它,那么请使用simplify.js。
答案 2 :(得分:2)
Mike Bostock在这里有一些很好的例子Line Simplification。他指出Douglas-Peucker算法是众所周知的。但是Visvalingam似乎更有效。