我正在为iOS开发一个绘画应用程序,为了获得平滑的线条,我应用了采样点的Ramer–Douglas–Peucker算法。
该算法适用于点的整个矢量,结果随着点的添加而变化。它会导致结果曲线在用户绘制时"跳跃"。
这个问题有已知的解决方案吗?
我从未实现或使用过这种算法,但我能想到两种可能的解决方案:
-
将算法应用于直线的离散部分。也就是说,等待用户画出10个点,然后在点0..9上运行算法。然后等待,直到用户画出下一个10点,并在第10..19点上运行算法,依此类推。一个可能的警告是,它可能会在第10点、第20点等处产生副作用,但我真的不知道用户是否会注意到这一点。
-
等待用户完成绘图,然后在整条线上运行算法一次。我以前在应用程序中见过这种方法。
这两种方法都有一个优点,即在每个点上运行算法不超过两次(在后一种情况下只运行一次),而如果每次添加点都运行算法,那么每次添加点时都会在前一个点上运行,这可能会对性能造成影响。
正如我所说,这对我来说不是一个专业领域,但我希望它能给你一些想法。
我怀疑这是否可以避免,原因很简单:算法无法猜测未来的点。
想象一下,你画出了前两点;很明显你会保留它们。现在转到第三点。如果R-D-P告诉你放弃中点,你可能不会,因为这会导致跳跃。等等。不允许跳转意味着你不允许任何删除!
也许你可以通过绘制保持稳定的原始曲线和平滑的曲线来减轻心理影响。
也就是说,R-D-p可能不是平滑的最佳方法。