隋雪潔+高林+楊偉+萬國超+劉貴彬



摘 要:分析了離散點數據的一般處理方法,針對慢速手繪圖形產生的邊緣噪點問題,提出一種適用于實時生成圖形的預處理算法,對采集的數據點進行實時篩選插值,以保證數據準確可靠。在MFC中進行實現,并將其應用于軟件開發,測試表明該算法繪圖效果改善極大,慢速手繪圖形平滑且不失真。
關鍵詞關鍵詞:離散點;MFC;GDI;插值;邊緣噪點
DOIDOI:10.11907/rjdk.161468
中圖分類號:TP317.4
文獻標識碼:A 文章編號:1672-7800(2016)008-0183-03
0 引言
無論是科學研究還是實際生產中,人們通過采集、測量或者實驗會獲得很多數據,通常情況下,這些數據都是離散的,很難直接從一大堆離散數據中找到它們的內在聯系。隨著計算機圖形學的發展,離散數據的重建與可視化得到越來越廣泛的研究與應用,主要是對數據進行插值、擬合形成曲線或曲面,用圖形圖像的方式表現出來。本文結合實際需求,針對手繪圖形實時輸出產生的噪點問題,提出一種新的研究方法,對干擾點進行處理,并在MFC中實現。實驗證明,該方法能夠很好地應用于手繪圖形生成中。
1 問題闡述
激光筆打在手繪板上進行繪圖,采樣畫筆的采樣頻率固定不變,快速書寫時點與點之間的間隔大,采集的樣點相對精確,所繪出的圖像圓滑,可以被視覺所接受。但在實際操作中,手繪迅速程度無法保證,當筆觸放慢時,點與點的間隔很小,相同時間段內,采集點的數量增多,若不對采集點進行處理,則導致繪出的圖像產生邊緣噪點。
2 離散點處理技術
離散點是一些孤立的點集,每個元素之間都有一定的間距,在二維或者三維空間上無規律分布,復雜程度不一[1]。
目前,國內外學者主要用3種技術對離散點進行處理,選擇何種方法取決于數據的準確性,用逼近的方法處理帶有一定誤差的數據;用插值的方法處理非常準確的數據;若部分數據有誤差,部分數據準確,則選用擬合的方法。
上述過程將數據分為兩部分,在閾值范圍以內的不做處理,若將不合閾值的點全部刪除,曲線會更加平滑,但直接刪除的后果是數據的誤差導致圖像失真,因此,該部分暫留點進行分析后再加以精確,保證數據的可靠性。
考慮到筆畫的趨勢問題,將點按照方位進行處理,以本次保留點為原點,下一保留點為終點,兩點連線作為參考向量,計算其余點向量與之夾角,夾角越小,與用戶繪制圖形相關性越大,反之,夾角太大,則極有可能為干擾點。
定義相鄰保留點的中點坐標為(x,y),干擾點坐標為(xj,yj),w1=0.5,與參照線直線夾角余弦值為w2,若w2>w1將本部分點再次刪減,以距離加權的方式計算其余采集點的估計值remain,插入相應保留點位置。
當前對已有離散點做好預處理,運用GDI的DrawCurve算法,通過一定的張力,將最終保留點連接為基數樣條曲線,保證繪制的曲線平滑地經過每一個點,陡度上沒有突然的變化和尖角,確保繪制的滑順性。
4 實現
4.1 平臺
采用VS/MFC開發環境,MFC是VC++ 的核心,徹底封裝Windows應用程序開發包的功能和結構,提供一個應用程序框架,并繼承C++繪圖方面的優點,結合圖形設備接口GDI,處理所有Windows程序的圖形輸出。MFC提供了兩種重要的類以支持GDI繪圖,一是用于設置繪圖屬性和繪制圖形的設備環境DC類,二是各種GDI繪圖對象的繪圖對象類[2]。
4.2 雙緩沖機制
Windows需要重畫窗口時,會向窗口發出一個消息函數,應用程序將在消息響應函數中重繪,導致屏幕不停閃爍,繪圖效率低,CPU占用率高,還有可能導致程序崩潰[3]。因此對于本次復雜繪圖,采用后緩沖區的方式,將窗口內容拷貝到dc中,要顯示的函數先繪制在內存虛擬dc上。為方便調用,dc作為一個全局的變量存在,當所有操作完成后,再將內容復制到屏幕,實質上只是在OnPaint里貼圖,解決屏幕閃爍問題。
主要實現代碼如下:
CPaintDC dc(this);CRect rect;GetClientRect(&rect); //獲取對話框長寬CDC dcBmp; //定義并創建一個內存設備環境 CBitmap MemBitmap; //定義一個位圖對象dcBmp.CreateCompatibleDC(&dc);//創建兼容性DC MemBitmap.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());//建立一個與屏幕顯示兼容的位圖,將位圖選入臨時內存設備環境
4.3 數據
采集的離散點數據保存在bin文件中,每個點分別由X坐標、Y坐標、筆畫計數組成,其中筆畫用來判斷兩點是否相連,采集數據部分點的存儲信息如圖1所示。
定義點的結構體:
typedef struct Po_s{ unsigned int x; 橫坐標值 unsigned int y; 縱坐標值 unsigned int down; 筆尖抬起與否的標志}Po
4.4 其它參數說明
其它參數說明如表1所示。
4.5 繪圖過程
繪制過程分為畫筆連續和畫筆抬起兩種情況,分別做不同處理。畫筆抬起時,調用DrawCurve算法繪圖,連接靜態數組point中已存點,將掃描點存入靜態數組point[0],同時將計數器n重置為1,間隔k置為1,最后清空靜態數組point。畫筆連續時,過程相對復雜,處理如下:
(1)掃描點間距小于閾值。①將該點刪除,暫時加入動態數組pt,間隔k加1;②若該掃描點為最后一點,調用DrawCurve算法繪圖,連接靜態數組point中已存點,將計數器n重置為0;否則,退出。
(2)掃描點間距大于等于閾值。①若刪除點數量num超過或等于12個(經反復試驗的最優臨界值):將動態數組pt中的點取出,按算法求取估計點,加入靜態數組point; 將計數器n加1,num置為0,間隔k置為1。若計數器n等于5,繪圖,并將均值點存入point[0],將計數器n置為1,否則退出;若刪除點數量num小于7個,直接退出;②將掃描點存入靜態數組point,計數器n加1,間隔k置為1,動態數組pt清空;③若計數器n等于5,繪圖,將掃描點存入point[0],計數器置為1,間隔k置為1,動態數組pt清空;否則(計數器n<5),若該掃描點為最后一點,調用DrawCurve算法繪圖,連接靜態數組point中已存點,將計數器n重置為0;④否則,進行下一次點的循環掃描。
5 測試
將實現的算法應用于慢速繪圖,用幾種不同筆觸走向的圖形進行測試,與未處理圖像比較,邊緣噪點去除效果顯著且不失真。曲線、直線、漢字的測試結果對比分別如圖2~圖4所示,可見優化后的圖像比優化前更加平滑。
6 結語
本文將一般離散點處理方式與實際問題相結合,針對實時生成的圖形,研究一種新型離散點的預處理方法,拓寬了直接曲線擬合方式的適用空間。在MFC中加以實現,并運用到軟件開發中,對不同類型的筆畫進行反復測試,達到了理想效果,筆畫連接更加正確、順暢。
參考文獻:
[1]蔡德福,石東源,李高望,等.基于輸入隨機變量離散數據的概率潮流計算方法[J].電網技術,2013(9):2475-2479.
[2]黃琛.基于MFC的繪圖軟件設計與實現[J].電腦知識與技術,2013(10):2345-2348.
[3]江建國,溫少營,張瑞楠.基于雙緩沖技術的GDI+無閃爍繪圖[J].計算機應用,2012(12):137-139.
[4]蘇江寬,基于B樣條的圖像插值算法研究[D].廣州:廣東工業大學,2014(6):12-16.
[5]顧天奇,張雷,冀世軍,等.封閉離散點的曲線擬合方法[J].吉林大學學報,2015(3):438-441.
[6]謝裕敏,舒輝,陳建敏,等.MFC消息響應函數的逆向定位[J].計算機應用,2009(5):1394-1396.
[7]蔡山,張浩,陳洪輝,等.基于最小二乘法的分段三次曲線擬合方法研究[J].科學技術與工程,2007(2):353-355.
[8]MU GUOWANG,DAI SHIJIE.Reconstruction of B-spline surface by interpolating boundary curves and approximating inner points[J].Computer Aided Drafting,Design and Manufacturing,2012(3):32-34.
(責任編輯:孫 娟)