沿弧线变换路径

时间:2012-12-18 13:58:54

标签: objective-c xcode path core-animation transformation

我试图沿弧线变换路径。

我的项目在osx 10.8.2上运行,绘画是通过CALayers中的CoreAnimation完成的。

我的项目中有一个波形将由路径绘制。大约有200个样本点镜像到底部。这些被涂成每秒60次并更新为歌曲位置。

请忽略白线,它只是一个旋转指示器。

situation

我想要实现的是沿弧线绘制波形。 “向上”应该指向中间。它不需要一路走来。波形应沿绿色圆圈绘制。请看下面提供的草图。

what i want to achieve

我不确定如何以高效的方式实现这一目标。每秒有许多点需要协调校正。

我尝试了一些自己的想法:

1)有可能为路径添加线性变换,我认为这对我没有帮助。我唯一能想到的是添加一个点,用转换旋转路径,添加另一个点,旋转等等。但我认为这会非常缓慢

2)将路径绘制成图像并弯曲它肯定会导致图像伪影。

3)也许最好的想法是预先计算弧上的采样点,然后将向量保存到中心。取波形的y坐标,将它们放在采样点上,然后沿矢量移动到中心。

但也许我只是没有看到这个问题的某种简单解决方案。非常感谢帮助,非常欢迎新鲜的想法。提前谢谢!

1 个答案:

答案 0 :(得分:2)

恕我直言,最有效的方法(在CPU使用方面)将使用某种形式的预先计算的方法,该方法将考虑显示器的分辨率。

巧妙预先计算的值

我会进行数学转换(从线性到极地)并结合两个事实:

  1. 无需执行扩展的数学计算
  2. 无需渲染两个彼此距离太近的点
  3. 我没有现成的算法,但您可以使用预先计算的sin或cos表,并将数据范围与显示大小匹配,以便使用整数。

    例如,假设我们有一些范围从0到1E6的数据,我们需要在100像素高度矩形中显示每个点的sin值。我们可以使用预先计算的sin表并使用整数。这样显示点的sin值会快得多。可以改进这个概念以获得更好的结果。 此外,有一些方法可以仅保留曲线的重要点,以使显示的曲线看起来像原始曲线(请参阅维基百科上的 Ramer-Douglas-Peucker算法)。但我发现快速显示不断变化的数据效率很低。

    使用多核渲染

    1. 您可以使用多个核心来计算曲线的不同区域(可能很棘手)
    2. 或者您可以使用多个核心进行预先计算,并使用一个核心完成工作。