關于實現獲取曲線的關鍵特征點獲取的工具類:JMSimplifyUtils
關于實現獲取曲線的關鍵特征點獲取的工具類,包含對Ramer–Douglas–Peucker算法的實現。
Description
假設我們繪制一條曲線,但是這條曲線可能就是一條折線,那么構成這條折線的組成關鍵點就只需要3個點,這三個點就是“關鍵特征點”。
最早考慮使用Ramer–Douglas–Peucker,后面簡稱RDP,這個通常意義上的路徑壓縮算法來實現,但是后來發現如果這個算法不改進的話,會存在一個嚴重的問題:起始點和終點小于容忍度的話,那么只能得到起點和終點,所有中間點都會被忽略,而且你無法按照你想獲取的最大點數來獲取關鍵特征點。
于是,自己又通過簡單的三角函數+歸并算法,來實現對路徑的特征關鍵點進行提取。
具體算法描述如下:
- 將曲線點左右兩組。
- 計算組是否為最小組,不是,則繼續劃分,是則計算最小組,得到最新的關鍵特征點。
- 將計算過后的過濾點左右兩組合并,得到所需的組關鍵特征點。
最小組關鍵特征點的算法描述:
假設有a,b,c,d三個點:
- 取a,b,c三個點計算夾角A,取b,c,d三個點計算夾角B
- 如果夾角A比夾角B小的話,就過濾掉b點,反之過濾c。
- 返回最終的三個點。
得到具體效果如下:
在使用效果來看,自己的角度算法得到的效果要優于RDP算法,感興趣的話,可以手動在Demo中切換獲取關鍵點的方式,這里JMSimplifyUtils提供了兩種方式來讓你得到關鍵特征點。
使用方法如下:
User Guide
通過RDP算法,來獲取關鍵特征點,pointArray:需要計算的曲線點組,tolerance:最小容忍度 (最小容忍度一般可以設置為手機的dpi值)
+(NSMutableArray *)simplifyByRDP:(NSArray *)pointArray tolerance:(double)tolerance;
通過三角函數+歸并算法計算關鍵特征點
pointArray:需要計算的曲線點組 maxCount:需要獲取最大關鍵特征點的個數
+(NSMutableArray *)simplifyByAngle:(NSArray *)pointArray maxCount:(NSInteger)maxCount;
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!