如何在触摸时跟踪手指移动以绘制平滑曲线?

时间:2009-06-27 04:36:16

标签: iphone objective-c

像我想要的那样,如果我在iphone屏幕上快速移动我的手指,那么我想要一些使用石英2d或opengl es使其成为正确曲线的东西。

我想画曲线风格的路径...... 我曾经看过GLPaint(OpenglES)的例子,但考虑到你的手指动作是否很快,它不会帮助我......

像一条平滑的曲线...... 任何人都有某种例子请告诉我

感谢

编辑:从下面的回答中移开:

感谢所有.......

但是我尝试了两个控制点的bezier曲线算法,但问题首先是如何计算控制点是否没有预定义的点....

正如我所提到的,我的手指运动速度很快......所以大部分时间我都是直线而不是曲线,因为接触点数量较少.......

现在正如标记所说的分段时尚,ihad试着考虑前四个接触点并将它们渲染到屏幕上,然后移除第一个点然后再去接下来的四个点。第1步:1,2,3,4步骤2:2,3,4,5就像在那种方法中我得到重叠,这实际上不是问题,但没有得到平滑的曲线.... ....

但是为了快速移动手指,我必须找到别的东西?????

3 个答案:

答案 0 :(得分:10)

根据您所查看的样本点数量,我建议采用两种方法:

简单插值

您可以按设定的间隔简单地对手指位置进行采样,然后使用类似Catmull-Rom样条的内容插入采样点。这比听起来容易,因为您可以轻松地将Catmull-Rom样条曲线转换为一系列三次贝塞尔曲线。

这是怎么回事。假设您有四个连续的样本点P0P1P2P3,则会定义连接P1P2的三次贝塞尔曲线通过以下控制点:

B0 = P1
B1 = P1 + (P2 - P0)/6
B3 = P2 + (P1 - P3)/6
B4 = P2

只要您的采样点不太密集且非常容易,这应该可以正常工作。唯一的问题可能是样本的开始和结束,因为第一个和最后一个采样点没有在开放曲线中插值。一个常见的解决方法是将您的第一个和最后一个采样点加倍,以便您有足够的点来让曲线通过每个原始样本。

要了解Catmull-Rom曲线的外观,您可以试试Java applet demonstrating Catmull-Rom splines

为样本拟合曲线

更先进(也更困难)的方法是对样本点进行最小二乘近似。如果你想试试这个,程序看起来如下:

  1. 收集样本点
  2. 定义NURBS曲线(包括其结矢量)
  3. 建立样本和线性方程组。曲线
  4. 以最小二乘意义解决系统
  5. 假设您可以选择一个合理的NURBS结矢量,这将为您提供一个NURBS曲线,该曲线非常接近您的采样点,从而最小化样本与曲线之间的平方距离。如果需要,NURBS曲线甚至可以分解为一系列贝塞尔曲线。

    如果您决定探索这种方法,那么书籍"Curves and Surfaces for CAGD" by Gerald Farin或类似的参考书将非常有用。在Farin的第5版中,第9.2节专门讨论了这个问题。第7.8节显示了如何使用贝塞尔曲线进行此操作,但您可能需要一条高度曲线才能获得良好的拟合。

答案 1 :(得分:3)

Naaff概述了NURBS技术。不幸的是,我认为在飞行中生成一个平滑的bezier可能对iPhone来说太过分了。我编写绘图应用程序,每秒获得大量touchesMoved事件是一个很大的挑战。你真的需要优化你的绘图代码,以便在记录单个点时获得良好的性能 - 更不用说构建贝塞尔曲线了。

如果您最终使用bezier或NURBS曲线表示 - 您可能必须等到用户完成触摸屏幕才能计算平滑路径。当用户移动他们的手指(然后使用Quartz重新绘制整个重新计算的路径)时连续进行数学运算并不会给你足够高的数据收集率来做任何有用的事情......

祝你好运!

答案 2 :(得分:1)

像Shadow建议做的事情。以某个频率获取触摸位置,然后从中获取Bézier curve。这就是在Illustrator等程序中使用鼠标(或平板电脑)绘制路径的方法。