iphone - 我怎样才能追踪触摸手指的运动来绘制平滑的曲线?

标签 iphone objective-c

就像我想要的那样,如果我在 iphone 屏幕上快速移动我的手指,那么我想要它使用 quartz 2d 或 opengl es 制作适当的曲线。

我想画一条曲线风格的路径...... 我看过那个 GLPaint(OpenglES) 示例,但它对我没有多大帮助,考虑到你的手指移动速度是否很快......

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

谢谢

编辑:从下面的答案中移出:

感谢大家......

但我曾尝试过使用两个控制点的贝塞尔曲线算法,但问题是首先如何计算控制点是否没有预定义点....

正如我提到的,我的手指移动速度很快......所以大多数时候我得到的是直线而不是曲线,因为接触点的数量较少......

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

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

最佳答案

根据您查看的样本点数量,我推荐两种方法:

简单插值

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

方法如下。假设您有四个连续的样本点 P0P1P2P3,连接 P3 的三次贝塞尔曲线 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. 在最小二乘意义上求解系统

假设您可以选择一个合理的 NURBS 节点向量,这将为您提供一个非常接近样本点的 NURBS 曲线,从而最大限度地减少样本与曲线之间的平方距离。如果需要,NURBS 曲线甚至可以分解为一系列贝塞尔曲线。

如果您决定探索这种方法,那么这本书 "Curves and Surfaces for CAGD" by Gerald Farin ,或类似的引用资料,将非常有帮助。在 Farin 的书的第 5 版中,第 9.2 节专门处理了这个问题。 7.8 节展示了如何使用贝塞尔曲线执行此操作,但您可能需要高阶曲线才能获得良好的拟合效果。

关于iphone - 我怎样才能追踪触摸手指的运动来绘制平滑的曲线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1052119/

相关文章:

iphone - 使用 Nineveh 或 OpenGL iPhone 通过光线追踪进行 3D 拾取

ios - 在iOS中听不到声音

iPhone UIWebView问题

iphone - 我目前在控制台 : 中收到此崩溃日志

ios - UITableView 在 iPad (ios7) 上显示意外的行 :

iphone - 在Phonegap中找不到'Cordova/CDVPlugin.h'文件

iOS7 AVCapture captureOutput 永远不会被调用

objective-c - 导航栏 objective-C 后面的 uiTableView 中的特定行

java - 什么是测试BNF语法的好工具?

ios - iOS 中的默认属性