1. 程式人生 > >Processing摸索前行(5)

Processing摸索前行(5)

上一篇,我們學會了類的封裝,這個為我們後面建立更加可利於操作的物件奠定了基礎。前面封裝的類可以畫線可以畫格子,我們就利用它繪製示波器的格子,在這基礎上我們來實現一個示波器與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)); 

執行效果如下:
在這裡插入圖片描述
剩下的任務,我們在下一篇中繼續實現,到現在為止已經具備示波器的雛形了。下一篇中,我們要模塑繪製動態的波形且具備接受感測器資料的介面。