使用貝塞爾曲線插值方法對(duì)繪圖進(jìn)行圓滑處理

畫(huà)圖

在iOS中實(shí)現(xiàn)繪圖的技術(shù)的話,比較通用的做法是簇搅,在onTouch事件中收集到軌跡坐標(biāo)點(diǎn)數(shù)據(jù)完域,然后在UIView中的drawInRect方法里面繪制每一幀畫(huà)面。在drawInRect方法使用CGContextRef的方法如CGContextAddLineToPoint等來(lái)實(shí)現(xiàn)馍资。一般來(lái)說(shuō)筒主,可以每?jī)蓚€(gè)點(diǎn)連成一條直線,然后把軌跡繪制出來(lái)鸟蟹。
但是這樣的話乌妙,如果一定時(shí)間內(nèi),繪畫(huà)的速度比較快建钥,屏幕產(chǎn)生的點(diǎn)的距離就變得比較遠(yuǎn)藤韵,這樣兩個(gè)點(diǎn)之間產(chǎn)生的直線連接起來(lái)看起來(lái)就比較有輪廓感。

    CGContextRef context = UIGraphicsGetCurrentContext(); //設(shè)置上下文
    //畫(huà)一條直線
    CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);//線條顏色
    CGContextSetLineWidth(context, 5.0);//線條寬度
    CGContextMoveToPoint(context, 100, 100); //開(kāi)始畫(huà)線, (100熊经,100) 為開(kāi)始點(diǎn)的坐標(biāo)
    CGContextAddLineToPoint(context, 200, 200);//畫(huà)直線, (200泽艘,200)為線條結(jié)束點(diǎn)的坐標(biāo)
    CGContextStrokePath(context); //開(kāi)始畫(huà)線
    CGContextRelease(context);

如下圖所示:


image.png

貝塞爾插值法優(yōu)化

首先要知道貝塞爾曲線的定義,以下是二階貝塞爾曲線公式镐依。


image.png

二階貝塞爾曲線的意思是匹涮,只有一個(gè)控制點(diǎn)P1,起點(diǎn)和終點(diǎn)分別是P0和P3槐壳。(三階貝塞爾曲線有兩個(gè)控制點(diǎn))當(dāng)t=0的時(shí)候然低,B(t)的值等于P0,當(dāng)t=1的時(shí)候,B(t)的值等于P2雳攘。P1是控制點(diǎn)带兜,用來(lái)控制起點(diǎn)P0和終點(diǎn)P2之間的彎曲程度。

所以吨灭,可以使用每三個(gè)點(diǎn)來(lái)組成一段二階貝塞爾曲線刚照,然后使用二階貝塞爾曲線方程進(jìn)行中間插值。這樣起點(diǎn)P0和新產(chǎn)生的插值點(diǎn)就形成了新的軌跡喧兄。Pn為復(fù)合二階貝塞爾曲線的插值坐標(biāo)點(diǎn)无畔,由貝塞爾曲線的t從[0,1]變化來(lái)產(chǎn)生。

image.png

進(jìn)一步優(yōu)化

貝塞爾曲線中點(diǎn)優(yōu)化

經(jīng)過(guò)第一步優(yōu)化繁莹,效果好了不少檩互,圓滑效果也出來(lái)了特幔,但是可以進(jìn)一步優(yōu)化咨演,可以計(jì)算P0與P1之間的中點(diǎn)Pm0,P1與P2之間的中點(diǎn)Pm1蚯斯,還是以P1為控制點(diǎn)薄风,這樣【Pm0,P1,Pm2】作為二階貝塞爾曲線的新的起點(diǎn)拍嵌、控制點(diǎn)遭赂、終點(diǎn)。
這樣的話横辆,軌跡的第一個(gè)點(diǎn)和最后一個(gè)點(diǎn)就孤立出來(lái)了撇他,可以直接把第一個(gè)點(diǎn)和第一個(gè)中點(diǎn)用直線連接便可。


image.png

繪制速度優(yōu)化

上述優(yōu)化是強(qiáng)制每3個(gè)坐標(biāo)點(diǎn)都做插值優(yōu)化狈蚤,這樣產(chǎn)生的插值點(diǎn)就會(huì)非常多困肩,因?yàn)槔L制的速度是可以通過(guò)固定時(shí)間內(nèi)產(chǎn)生的坐標(biāo)點(diǎn)來(lái)判斷的,所以可以通過(guò)速度來(lái)控制是否要進(jìn)行插值脆侮,如果速度非常慢锌畸,達(dá)不到插值的閾值,可以直接用直線連接靖避。

如果速度非程对妫快,需要插值幻捏,這時(shí)候盆犁,插值點(diǎn)的多少還是要經(jīng)過(guò)二階貝塞爾曲線方程t來(lái)判斷,速度越快篡九,t從[0,1]的變換越慢谐岁,這樣產(chǎn)生的插值點(diǎn)才會(huì)越多。

參考文章

https://blog.csdn.net/trent1985/article/details/51396665

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市翰铡,隨后出現(xiàn)的幾起案子钝域,更是在濱河造成了極大的恐慌,老刑警劉巖锭魔,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件例证,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡迷捧,警方通過(guò)查閱死者的電腦和手機(jī)织咧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)漠秋,“玉大人笙蒙,你說(shuō)我怎么就攤上這事∏旖酰” “怎么了捅位?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)搂抒。 經(jīng)常有香客問(wèn)我艇搀,道長(zhǎng),這世上最難降的妖魔是什么求晶? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任焰雕,我火速辦了婚禮,結(jié)果婚禮上芳杏,老公的妹妹穿的比我還像新娘矩屁。我一直安慰自己,他們只是感情好爵赵,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布吝秕。 她就那樣靜靜地躺著,像睡著了一般亚再。 火紅的嫁衣襯著肌膚如雪郭膛。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天氛悬,我揣著相機(jī)與錄音则剃,去河邊找鬼。 笑死如捅,一個(gè)胖子當(dāng)著我的面吹牛棍现,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播镜遣,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼己肮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼士袄!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起谎僻,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤娄柳,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后艘绍,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體赤拒,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年诱鞠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挎挖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡航夺,死狀恐怖蕉朵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情阳掐,我是刑警寧澤始衅,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站锚烦,受9級(jí)特大地震影響觅闽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜涮俄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望尸闸。 院中可真熱鬧彻亲,春花似錦、人聲如沸吮廉。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)宦芦。三九已至宙址,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間调卑,已是汗流浹背抡砂。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留恬涧,地道東北人注益。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像溯捆,于是被迫代替她去往敵國(guó)和親丑搔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345