Processing摸索前行(5)
阿新 • • 發佈:2018-12-22
上一篇,我們學會了類的封裝,這個為我們後面建立更加可利於操作的物件奠定了基礎。前面封裝的類可以畫線可以畫格子,我們就利用它繪製示波器的格子,在這基礎上我們來實現一個示波器與arduino通訊,arduino負責資料的採集。
開始之前,我們來分析一下我們的需求和目標:
1、將讀取的資料轉換為波形
2、可以根據需要放大波形及重新定義標尺單元細分度
3、可開啟周波實時顯示(即波形根據時間的推移訊號波右移)
當然,除了這些需求,我們要先理清編寫任務流程的思路:
1、首先我們來編寫一個帶標尺的表格
2、編寫一個波形繪製函式,它必須滿足(可接受模擬引數的方法,當波形滿屏時開始右移)
首先我們來看看示波器的標尺程式碼實現:
int w=560; int h=380; int woff=80; int hoff=80; void settings() { size(w,h); } void setup() { background(0); Pline ln1=new Pline(0,40,w,40); for(int i=0;i<w/woff;i++) ln1.offsetLine(0,woff); Pline ln2=new Pline(40,0,40,h); for(int i=0;i<w/hoff;i++) ln2.offsetLine(hoff,0); //水平標尺 Pline ln3=new Pline(0,h/2+2,0,h/2+8); Pline ln4=new Pline(0,h/2+10,0,h/2+4); ln3.changeColor(color(20,220,20)); ln4.changeColor(color(20,220,20)); for(int i=0;i<w/40;i++) { ln3.offsetLine(40,0); for(int j=0;j<10;j++) ln4.offsetLine(4,0); } //垂直標尺 Pline ln5=new Pline(w/2,0,w/2+8,0); Pline ln6=new Pline(w/2,0,w/2+4,0); ln3.changeColor(color(20,220,20)); ln4.changeColor(color(20,220,20)); for(int i=0;i<w/40;i++) { ln5.offsetLine(0,40); for(int j=0;j<10;j++) ln6.offsetLine(0,4); } } class Pline { float StartX,StartY,EndX,EndY; float Alf=254; color Color= color(0,180,0); Pline(float sx,float sy,float ex,float ey) { StartX=sx; StartY=sy; EndX=ex; EndY=ey; drawline(); } Pline(float sx,float sy,float ex,float ey,float alf ) { StartX=sx; StartY=sy; EndX=ex; EndY=ey; Alf=alf; drawline(); } Pline(float sx,float sy,float ex,float ey,color clr ) { StartX=sx; StartY=sy; EndX=ex; EndY=ey; Color=clr; drawline(); } Pline(Pline ln,color clr) { StartX=ln.StartX+20; StartY=ln.StartY+20; EndX=ln.EndX+20; EndY=ln.EndY+20; Color=clr; drawline(); } Pline(float sx,float sy,float ex,float ey,color clr,float alf ) { StartX=sx; StartY=sy; EndX=ex; EndY=ey; Color=clr; Alf=alf; drawline(); } Pline(Pline ln,color clr,float alf ) { StartX=ln.StartX+20; StartY=ln.StartY+20; EndX=ln.EndX+20; EndY=ln.EndY+20; Color=clr; Alf=alf; drawline(); } void changeColor(color cl) { Color=cl; } void drawline() { stroke(Color,Alf); line(StartX,StartY,EndX,EndY); noStroke(); } void offsetLine(float offsetX,float offsetY) { StartX=StartX+offsetX; StartY=StartY+offsetY; EndX=EndX+offsetX; EndY=EndY+offsetY; drawline(); } }
實際,以上程式碼在《Processing摸索前行(4)》的基礎上並沒有多大改變,只不過是應用我們前面封裝過的Pline多繪製了4條線,也就是說,整個螢幕我們就初始化了6條線,其餘都是利用offset得來的,是不是得來非常高效啊!
以下是執行效果:
下面我們來實現波形繪製,在setup中繪製兩條靜態的波形:
//一號通道波形 stroke(150,10,10); for(int a=0;a<720;a++) line(a,h/2+80*sin(a*PI/180),a+1,h/2+80*sin((a+1)*PI/180)); //二號通道波形 stroke(10,150,10); for(int a=0;a<740;a++) line(a-20,h/2+80*sin(a*PI/180),a-21,h/2+80*sin((a+1)*PI/180));
執行效果如下:
剩下的任務,我們在下一篇中繼續實現,到現在為止已經具備示波器的雛形了。下一篇中,我們要模塑繪製動態的波形且具備接受感測器資料的介面。