iOS 波浪曲线的绘制

作者: Vesincc | 来源:发表于2017-02-27 13:36 被阅读391次

iOS 波浪曲线的绘制

还是先上图:

y=Asin(wx+u)+K

在想一下通式:y=Asin(wx+u)+K 对就是这么简单,那参数代表的又是什么呢?

  • A :振幅
  • w :角速度 w = 2PI/T T:周期
  • u :初相
  • K :y 轴偏移

有了这个公式,我们又该如何在屏幕上绘制正弦曲线呢?

    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, nil, 0, 0);

    CGFloat y = 0.0f;
    
    for (float x = 0.f; x <= self.width; x++) {
        y = self.A1 * sin(self.w*x + self.u1) + self.K1;
        CGPathAddLineToPoint(path, nil, x, y);
        x++;
    }

    CGPathAddLineToPoint(path, nil, self.width, self.height);
    CGPathAddLineToPoint(path, nil, 0, self.height);
    CGPathCloseSubpath(path);
    self.waveLayer1.path = path;
    CGPathRelease(path);

Build 运行一下,是不是就有了一个正弦曲线呢?接下来就要让正弦曲线动起来,这就要设置定时器去重绘这条曲线了。

CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(wave)];
        [displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
- (void)wave {

    offset += self.offsetX;
    
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, nil, 0, (self.A1*sin(offset + self.u1) + self.K1));
    
    CGFloat y = 0.0f;
    
    for (float x = 0.f; x <= self.width; x++) {
        y = self.A1 * sin(self.w*x + offset + self.u1) + self.K1;
        CGPathAddLineToPoint(path, nil, x, y);
        x++;
    }
    
    CGPathAddLineToPoint(path, nil, self.width, self.height);
    CGPathAddLineToPoint(path, nil, 0, self.height);
    CGPathCloseSubpath(path);
    self.waveLayer1.path = path;
    CGPathRelease(path);

}

offset : 波浪曲线的初始偏移量

​ offsetX : 波浪曲线每次刷新偏移量

再附一个参数初始化:

- (void)initData {
    
    self.A1 = 8;
  
    self.K1 = 80;
  
    self.u1 = M_PI*3/8.0f;
    
    self.offsetX = 0.03;
    offset = 0;
    
    self.w = M_PI/180;

}

这样波浪曲线就完成了。

添加头像

初始化一个 UIImageView 放在屏幕中间,每次刷新波浪曲线的时候,都去改变头像位置

- (void)wave {

    offset += self.offsetX;
    
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, nil, 0, (self.A1*sin(offset + self.u1) + self.K1));
    
    CGFloat y = 0.0f;
    
    for (float x = 0.f; x <= self.width; x++) {
        y = self.A1 * sin(self.w*x + offset + self.u1) + self.K1;
        CGPathAddLineToPoint(path, nil, x, y);
        x++;
    }
  
    if (self.floatImageView != nil) {
    
        y = self.A1 * sin(self.w*(self.width/2.0 ) + offset + self.u1) + self.K1;
        self.floatImageView.centerY = y - 30;
    }
  
    CGPathAddLineToPoint(path, nil, self.width, self.height);
    CGPathAddLineToPoint(path, nil, 0, self.height);
    CGPathCloseSubpath(path);
    self.waveLayer1.path = path;
    CGPathRelease(path);

}

头像偏移

关于头像的偏移,这里需要算出头像偏移角度,也就是与 X 轴的夹角。我们需要先算出正弦曲线在中间点的斜率。关于切线斜率怎么求呢? 高数老师告诉你:对函数求导后 x 处的值为斜率。那么对 y=Asin(wx+u)+K 求导:

y`= Awcos(wx + u)

获得屏幕中心的斜率为 k, 根据公式 k = tana

角度:a = arctank

这个角度便是我们需要的头像的偏移角度了,加在循环里面,每次再改变头像的角度。

- (void)wave {

    offset += self.offsetX;
    
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, nil, 0, (self.A1*sin(offset + self.u1) + self.K1));
    
    CGFloat y = 0.0f;
    
    for (float x = 0.f; x <= self.width; x++) {
        y = self.A1 * sin(self.w*x + offset + self.u1) + self.K1;
        CGPathAddLineToPoint(path, nil, x, y);
        x++;
    }
  
    if (self.floatImageView != nil) {
    
        y = self.A1 * sin(self.w*(self.width/2.0 ) + offset + self.u1) + self.K1;
        self.floatImageView.centerY = y - 30;
      
        CGFloat angel = atan(self.A1*(M_PI/60)*cos(self.w*(ScreenWidth/2.0f) + offset + self.u1));
        
        self.floatImageView.transform = CGAffineTransformMakeRotation(angel / M_PI);
    }
  
    CGPathAddLineToPoint(path, nil, self.width, self.height);
    CGPathAddLineToPoint(path, nil, 0, self.height);
    CGPathCloseSubpath(path);
    self.waveLayer1.path = path;
    CGPathRelease(path);

}

搞定!

相关文章

  • iOS 波浪曲线的绘制

    iOS 波浪曲线的绘制 还是先上图: 其实之前就一直想看一下 iOS 关于曲线绘制的相关类容,但由于刚刚步入职场,...

  • android 绘制波浪曲线

    怎样画波浪 通过贝塞尔曲线 怎样让波,浪起来 让波浪水平移动 保持让波浪动起来时,一直正确显示波浪 确保左侧起点始...

  • Android贝塞尔曲线动画

    前言: 利用贝塞尔曲线绘制类似波浪效果的优美曲线 概述: 环境:Android Studio 3.42 语言:Ja...

  • 绘制波浪正弦曲线

    iOS绘制波浪,具体来说就是结合CAShaperLayer、UIBezierPath进行一个高性能的绘制。前文已经...

  • AI绘制波浪曲线logo

    ·画一个矩形,复制一个,Ctrl+d再制,共8条。 ·全选-对象-封套扭曲-用网格建立,更改参数。 ·用a工具调节...

  • iOS 绘制波浪

    视频录制是效果看起来挺好的,转成GIF后播放就不流畅了。不过不影响。 先展示一下引用波浪控件的代码吧 再来展示一下...

  • Canvas教程(12)——三次贝塞尔曲线

    bezierCurveTo()方法 绘制三次贝塞尔曲线代码如下。 这个方法可谓是绘制波浪线的神器。根据之前的结论,...

  • Canvas中任意波浪线的绘制

    最近接触一个墨水屏的项目,有个需求就是会进行一些标记绘制,类似直线、自由曲线、波浪线等,所以就涉及到波浪线如何绘制...

  • iOS 波浪型绘制

    我们知道,正弦曲线公式可表示为y=Asin(ωx+φ)+k。 A,振幅,最高和最低的距离 ω,角速度,用于控制周期...

  • 杂项

    1.判断是否已经引入某个类 2.iOS 绘制曲线UIResponder 的touch moved方法中,使用点绘制...

网友评论

本文标题:iOS 波浪曲线的绘制

本文链接:https://www.haomeiwen.com/subject/imdzwttx.html