圓滑曲線畫法

Catmull-Rom算法
根據(jù)四個(gè)點(diǎn)計(jì)算中間
前后兩個(gè)點(diǎn)位輔助點(diǎn)

-(CGPoint)getPoint:(CGFloat)t p:(CGPoint)p p1:(CGPoint)p1 p2:(CGPoint)p2 p3:(CGPoint)p3{
    CGFloat t2 = t*t;
    CGFloat t3 = t2*t;
    
    CGFloat f = -0.5*t3 + t2 - 0.5*t;
    CGFloat f1 = 1.5*t3 + -2.5*t2 + 1.0;
    CGFloat f2 = -1.5*t3 + 2.0*t2 + 0.5*t;
    CGFloat f3 = 0.5*t3 - 0.5*t2;
    
    CGFloat x = p.x*f + p1.x*f1 + p2.x*f2 + p3.x*f3;
    CGFloat y = p.y*f + p1.y*f1 + p2.y*f2 + p3.y*f3;
    return CGPointMake(x,y);
    
}

pointArray:點(diǎn)的數(shù)組
pointCount:曲線之間由count-1個(gè)小點(diǎn)組成枚赡,當(dāng)為0時(shí)顯示為最初與最末兩點(diǎn)的連線厚宰,1為原始折線
isSame:添加的輔助點(diǎn)跟初始點(diǎn)是否一致,不一致的只能用NO

#define P(p) [(NSValue *)[points objectAtIndex:p] CGPointValue]
- (void)getCurvePathWithPoint:(NSArray *)pointArray pointCount:(NSInteger)pointCount isSame:(BOOL)isSame{
    NSMutableArray *points = [pointArray mutableCopy];
    UIBezierPath *path = [UIBezierPath bezierPath];
    
    CAShapeLayer *layer = [CAShapeLayer layer];
    layer.strokeColor = [UIColor blackColor].CGColor;
    layer.fillColor = [UIColor clearColor].CGColor;
    
    //添加兩個(gè)輔助點(diǎn)
    [points insertObject:[points firstObject] atIndex:0];
    [points addObject:[points lastObject]];
    
    //添加的點(diǎn)與初始的點(diǎn)是否一致
    if (isSame) {
        [path moveToPoint:P(0)];
    }else{
        [path moveToPoint:P(1)];
    }
    
    for (int i = 0; i < points.count-3; i++) {
        CGPoint p0 = P(i);
        CGPoint p1 = P(i+1);
        CGPoint p2 = P(i+2);
        CGPoint p3 = P(i+3);
        for (int j = 0 ; j < pointCount; j++) {
            CGFloat t = 1.0 * j / pointCount;
            CGPoint point = [self getPoint:t p:p0 p1:p1 p2:p2 p3:p3];
            [path addLineToPoint:point];
        }
    }
    //添加最后一個(gè)點(diǎn)
    [path addLineToPoint:P(points.count-1)];
    
    layer.path = path.CGPath;
    [self.view.layer addSublayer:layer];
}

畫表格的測(cè)試

-(void)backgroundTable:(CGRect)frame{
    //下面距離20上面距離10戴涝,顯示范圍在frame內(nèi)各減少20
    
    width = frame.size.width;
    height = frame.size.height;
    
    UIBezierPath *path = [[UIBezierPath alloc] init];
    [path moveToPoint:CGPointMake(20, 10)];
    [path addLineToPoint:CGPointMake(20, height-20)];
    [path addLineToPoint:CGPointMake(width-10, height-20)];
    
    [path moveToPoint:CGPointMake(16, 18)];
    [path addLineToPoint:CGPointMake(20, 10)];
    [path addLineToPoint:CGPointMake(24, 18)];
    
    [path moveToPoint:CGPointMake(width-18, height-16)];
    [path addLineToPoint:CGPointMake(width-10, height-20)];
    [path addLineToPoint:CGPointMake(width-18, height-24)];
    
    CAShapeLayer *layer = [CAShapeLayer layer];
    layer.strokeColor = [UIColor blackColor].CGColor;
    layer.fillColor = [UIColor clearColor].CGColor;
    layer.path = path.CGPath;
    [self.view.layer addSublayer:layer];
}


-(void)ContrastFigure{
    
    NSMutableArray *a = [_arr mutableCopy];
    NSMutableArray *points = [NSMutableArray array];
    for (int i = 0; i<a.count; i++) {
        CGPoint p = CGPointMake(20+i*((width-40)/a.count), 20 + (10-[[_arr objectAtIndex:i] floatValue])*(height-40)/10);
        [points addObject:[NSValue valueWithCGPoint:p]];
    }
    NSLog(@"%@",a);
    [self getCurvePathWithPoint:points pointCount:100 isSame:NO];
    
    UIBezierPath *path1 = [[UIBezierPath alloc] init];
    CAShapeLayer *layer1 = [CAShapeLayer layer];
    layer1.strokeColor = [UIColor redColor].CGColor;
    layer1.fillColor = [UIColor clearColor].CGColor;
    for (int i = 0; i < _arr.count; i++) {
        if (i == 0) {
            [path1 moveToPoint:CGPointMake(20+i*((width-40)/_arr.count),20+(10-[[_arr objectAtIndex:i] floatValue])*(height-40)/10)];
        }else{
            [path1 addLineToPoint:CGPointMake(20+i*(width-40)/_arr.count,20+(10-[[_arr objectAtIndex:i] floatValue])*(height-40)/10)];
        }
    }
    layer1.path = path1.CGPath;
    [self.view.layer addSublayer:layer1];
}

viewDidLoad調(diào)用

[self backgroundTable:CGRectMake(0, 0, self.view.frame.size.width, 200)];
    
    _arr = @[@0,@10,@3,@8,@6,@9,@1,@2,@1,@2];
    [self ContrastFigure];

    NSArray *arr = [NSArray arrayWithObjects:[NSValue valueWithCGPoint:CGPointMake(30, 350)],[NSValue valueWithCGPoint:CGPointMake(130, 250)],[NSValue valueWithCGPoint:CGPointMake(180, 250)],[NSValue valueWithCGPoint:CGPointMake(230, 450)],[NSValue valueWithCGPoint:CGPointMake(280, 400)], nil];
        [self getCurvePathWithPoint:arr pointCount:100 isSame:YES];

圖片.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末缴挖,一起剝皮案震驚了整個(gè)濱河市滔韵,隨后出現(xiàn)的幾起案子级及,更是在濱河造成了極大的恐慌棚亩,老刑警劉巖拼卵,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奢浑,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡腋腮,警方通過查閱死者的電腦和手機(jī)雀彼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來即寡,“玉大人徊哑,你說我怎么就攤上這事〈细唬” “怎么了莺丑?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)墩蔓。 經(jīng)常有香客問我梢莽,道長(zhǎng),這世上最難降的妖魔是什么奸披? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任昏名,我火速辦了婚禮,結(jié)果婚禮上阵面,老公的妹妹穿的比我還像新娘轻局。我一直安慰自己份殿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布嗽交。 她就那樣靜靜地躺著卿嘲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪夫壁。 梳的紋絲不亂的頭發(fā)上拾枣,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音盒让,去河邊找鬼梅肤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛邑茄,可吹牛的內(nèi)容都是我干的姨蝴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼肺缕,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼左医!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起同木,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤浮梢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后彤路,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秕硝,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年洲尊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了远豺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坞嘀,死狀恐怖躯护,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情姆吭,我是刑警寧澤榛做,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站内狸,受9級(jí)特大地震影響检眯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜昆淡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一锰瘸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧昂灵,春花似錦避凝、人聲如沸舞萄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽倒脓。三九已至,卻和暖如春含思,著一層夾襖步出監(jiān)牢的瞬間崎弃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工含潘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留饲做,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓遏弱,卻偏偏與公主長(zhǎng)得像盆均,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子漱逸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容