【问题标题】:How to render a smooth path given a set of data points?如何在给定一组数据点的情况下渲染平滑路径?
【发布时间】:2009-08-03 14:18:29
【问题描述】:

过去几天我一直对路径渲染感到困惑,但没有任何真正的解决方案。

通过路径渲染,我的意思是给定一组 x,y 数据点(在不同的距离处)以在给定数据集点之间以固定间隔绘制一条固定长度的虚线(或在我的情况下为旋转四边形)以创建一条平坦的道路。

如果你有 iPhone 的飞行控制,我正在尝试创建与该游戏中的路径渲染类似的效果。

这是我的问题。如果图形的宽度 + 间隙不能精确地设计为 2 个数据集点之间的距离,那么我就会留下重叠或欠重叠。我对此的唯一解决方案是

1) 将重叠/欠重叠点作为下一个数据集点的终点,然后从那里绘制到下一个点。

2) 始终在最终端点下绘制并从下一个数据点重新开始。

这些解决方案都不理想,都存在问题。

谁有更好的解决方案?

任何帮助将不胜感激。

以下屏幕说明了我正在尝试创建的内容:http://www.firemint.com/flightcontrol/screenshots-peaceful.html

粗虚线。

更新:

您好,我尝试通过曲线进行渲染,我计算了三次曲线(通过 4 个控制点)。然而,问题是插值之一。给定 0 和 1 我可以通过任何 2 点。但是我想逐步完成整个路径(多个控制点)。问题是某些控制点的距离会不同,因此以恒定的步进增量(例如 0.2)步进会产生不规则的结果。我意识到为了正确地通过整个路径,我需要计算整个曲线的长度......问题是我该怎么做? ...还是有其他方法?

干杯 丰富

【问题讨论】:

  • 你有没有找到关于这个话题的解决方案?

标签: iphone path render interpolation


【解决方案1】:

有一个名为“CGPathAddQuadCurveToPoint”的 CoreGraphics 函数用于绘制平滑路径。 An example on how to use it is on GitHub.

【讨论】:

  • 谢谢,我回家后再试试。告诉我,可以在 Open GLES 中完成的事情吗?据我所知,很多 CoreGraphics 的东西在 Open GLES 中不起作用。
  • @Rich 它可以与 OpenGL 集成,就像任何 CoreGraphics 的东西都可以与 OpenGL 集成一样。我没有这方面的经验。 =)
  • 我不认为您可以在开放的 gl es 表面上渲染核心图形内容???
  • 链接现在似乎已被删除。
【解决方案2】:

您可能想看看Bezier curves 或hermite curves,它们并不难计算,而且您会得到漂亮的柔和曲线。

【讨论】:

    【解决方案3】:

    您可能应该查看Bézier curves 和Splines 算法。

    【讨论】:

      【解决方案4】:

      您是否完全受限于固定大小的四边形?理想的解决方案是将最后一个四边形截断为正确的大小。

      如果您受到限制,您可以做几件事。如果您正在绘制虚线,您可以改变虚线的距离,以确保您永远不会在端点上出现部分四边形。这可能会在视觉上分散注意力,因为距离会根据段的长度进行调整。

      编辑:

      啊,图片有帮助。我假设因为这是在 iPhone 上,所以你会得到一系列点,它们之间的画线会产生可接受的曲线。如果是这种情况,使用样条线/曲线图元可能是矫枉过正。我可能会简单地通过在距最后一个数据点给定距离的每个数据点上绘制四边形来接近绘制线。

      算法类似于:

      1. 在第一个数据点上绘制四边形(适当旋转)
      2. 遍历点列表,直到距离最后一个点至少 X 距离
      3. 在当前点和上次访问的点之间移动,以找到放置下一个四边形的确切中心。
      4. 绘制四边形(适当旋转)
      5. 转到第 2 步
      6. 如果您有最后一个四边形的部分点,请照常绘制(这将比截断它提供更好的视觉效果)。

      为了好玩,让两点之间的距离 D 小于两点之间的距离(这在 2D 情况下可能更简单,但我通常喜欢工作):

      vector v = point2 - point1;
      normalize(v);
      v *= D;
      finalPoint = point1 + v;
      

      【讨论】:

      • 我只接受与当前距离给定距离的数据点,因此我的点排序将具有最小距离。这与我的旋转图形的距离相同。然而,如果用户快速移动他们的手指,点之间的距离就会变大(因此需要插值)。您能否再详细说明一下 Lerping 部分,因为这听起来与我目前正在做的事情相似,而且这不会产生像屏幕截图中那样平滑的路径。
      • 我描述的方法只有在数据点之间的距离不超过破折号之间距离的 2 倍时才看起来不错。如果您的数据点比那个更远,您需要研究一种曲线拟合方法(此类问题的标准曲线拟合往往是 Catmull-rom),因为您的曲线将开始变平。
      • 关于插值,由于您的数据点通常不会完全位于您要绘制四边形的位置之上,因此您需要在两个数据点之间的某个位置。当您知道要介于哪两个之间时,您可以应用线性插值(根据四边形应该沿着直线的距离求解两点之间的直线方程以获得一些插值常数)或者如果它们更远,应用曲线近似插值(如上所述)。
      • 感谢您的回复。如果用户快速移动他们的手指,数据点将比破折号的距离更远。我认为这看起来越来越像曲线插值工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-15
      • 2015-07-25
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      • 2022-01-02
      • 2015-05-17
      相关资源
      最近更新 更多