iOS贝塞尔bezier曲线

一.常规使用

属性:

@property(nonatomic,strong) CAShapeLayer *shapeLayer;
@property(nonatomic,strong) UIBezierPath *beizer;
@property(nonatomic,assign) CGPoint startPoint;
@property(nonatomic,assign) CGPoint movePoint;
@property(nonatomic,strong) UIView *drawView;

方法:

1.初始化CAShapeLayer:

- (void)initCAShaper{
    self.shapeLayer = [[CAShapeLayer alloc] init];
    self.shapeLayer.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
    self.shapeLayer.fillColor = nil;
    self.shapeLayer.lineCap = kCALineCapRound;
    self.shapeLayer.strokeColor = [UIColor whiteColor].CGColor;
    self.shapeLayer.lineWidth = 10;
    [self.drawView.layer addSublayer:self.shapeLayer];
}


2.初始化触控手势、画图区域view、贝塞尔路径,并执行初始化方法 1

- (void)drawingAtScreen{
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panTouch:)];
    [self.drawView addGestureRecognizer:pan];
    self.beizer = [UIBezierPath bezierPath];
    [self initCAShaper];
}


3.触控手势响应,处理触控坐标点,生成贝塞尔路径并赋值给shapeLayer

- (void)panTouch:(UIPanGestureRecognizer *)panGesture{
    _startPoint = [panGesture locationInView:self.drawView];
    if (panGesture.state == UIGestureRecognizerStateBegan) {
        [self.beizer moveToPoint:_startPoint];
    }
    if (panGesture.state == UIGestureRecognizerStateChanged) {
        _movePoint = [panGesture locationInView:self.drawView];
        
        [_beizer addLineToPoint:_movePoint];
        self.shapeLayer.path = _beizer.CGPath;
    }
}


4.清空图像

        [self.beizer removeAllPoints];
        self.shapeLayer.path = _beizer.CGPath;



二.绘制正弦曲线

属性:

@property(nonatomic,strong) CAShapeLayer *shapeLayer;
@property(nonatomic,strong) UIBezierPath *beizer;
@property(nonatomic,assign) CGPoint startPoint;
@property(nonatomic,strong) UIView *drawView;


方法:

1.初始化CAShapeLayer:

//初始化图层
- (void)initCAShaper{
    self.beizer = [UIBezierPath bezierPath];
    
    self.drawView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    self.drawView.backgroundColor = [UIColor blackColor];
    [self.view addSubview:self.drawView];
    
    self.shapeLayer = [[CAShapeLayer alloc] init];
    self.shapeLayer.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
    self.shapeLayer.fillColor = nil;
    self.shapeLayer.lineCap = kCALineCapRound;
    self.shapeLayer.strokeColor = [UIColor blueColor].CGColor;
    self.shapeLayer.lineWidth = 3;
    [self.drawView.layer addSublayer:self.shapeLayer];
}

2.获取贝塞尔控制点

- (NSArray *)getControlPointWithPoint0:(CGPoint)point0 andPoint1:(CGPoint)point1 andPoint2:(CGPoint)point2{
    
 //   CGFloat smooth_value = 0.6;
    CGPoint mediumC1 = CGPointMake((point0.x+point1.x)/2, (point0.y+point1.y)/2);
    CGPoint mediumC2 = CGPointMake((point1.x+point2.x)/2, (point1.y+point2.y)/2);
    
    CGFloat len0_1 = sqrt((point0.x-point1.x)*(point0.x-point1.x) + (point0.y-point1.y)*(point0.y-point1.y));
    CGFloat len1_2 = sqrt((point1.x-point2.x)*(point1.x-point2.x) + (point1.y-point2.y)*(point1.y-point2.y));
    
    CGFloat k = len0_1/len1_2;
    CGFloat xk = (k*mediumC2.x+mediumC1.x)/(k+1);
    CGFloat yk = (k*mediumC2.y+mediumC1.y)/(k+1);
    CGPoint K = CGPointMake(xk, yk);

    CGFloat diffX = point1.x - K.x;
    CGFloat diffY = point1.y - K.y;
    
    CGPoint ctl1 = CGPointMake(mediumC1.x+diffX, mediumC1.y+diffY);
    CGPoint ctl2 = CGPointMake(mediumC2.x+diffX, mediumC2.y+diffY);
    
    NSValue *ctlpoint1 = [NSValue valueWithCGPoint:ctl1];
    NSValue *ctlpoint2 = [NSValue valueWithCGPoint:ctl2];
    
    NSArray *pointsArray = [NSArray arrayWithObjects:ctlpoint1, ctlpoint2, nil];
    
    return pointsArray;
}

3.绘制正弦曲线

- (void)drawPathTest1{
    CGFloat mm = 300;
    
    NSMutableArray *pointArray = [[NSMutableArray alloc] init];
    
    CGFloat sinf = 3.1415926*2/100;
    
    for(NSInteger cc=0;cc<100;cc++){
        CGFloat sinY = sin(sinf*cc);
        CGFloat sinyy = sinY*100 + 300;
        CGPoint ppp = CGPointMake(cc*2, sinyy);
        NSValue *pppv = [NSValue valueWithCGPoint:ppp];
        [pointArray addObject:pppv];
    }
    
    
    [self.beizer moveToPoint:CGPointMake(0, 300)];
    
    for(NSInteger i=0;i<pointArray.count-2;i++){
        NSValue *vpoint1 = [pointArray objectAtIndex:i];
        NSValue *vpoint2 = [pointArray objectAtIndex:i+1];
        NSValue *vpoint3 = [pointArray objectAtIndex:i+2];
        CGPoint pp1 = vpoint1.CGPointValue;
        CGPoint pp2 = vpoint2.CGPointValue;
        CGPoint pp3 = vpoint3.CGPointValue;
        
        NSArray *ppp = [self getControlPointWithPoint0:pp1 andPoint1:pp2 andPoint2:pp3];
        NSValue *ctlValue1 = [ppp objectAtIndex:0];
        NSValue *ctlValue2 = [ppp objectAtIndex:1];
        CGPoint ctlpoint1 = ctlValue1.CGPointValue;
        CGPoint ctlpoint2 = ctlValue2.CGPointValue;
        
        [self.beizer addCurveToPoint:pp3 controlPoint1:ctlpoint1 controlPoint2:ctlpoint2];
    }
    
    self.shapeLayer.path = self.beizer.CGPath;
//    [self.beizer moveToPoint:p1];
//    [self.beizer addLineToPoint:p2];
//    self.shapeLayer.path = self.beizer.CGPath;
}












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值