Processing摸索前行(5)

版权声明:本博客所有原创文章未经准许不得转载或保存转发,本人保留版权法律追诉权。 https://blog.csdn.net/haigear/article/details/85040212

上一篇,我们学会了类的封装,这个为我们后面建立更加可利于操作的对象奠定了基础。前面封装的类可以画线可以画格子,我们就利用它绘制示波器的格子,在这基础上我们来实现一个示波器与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)); 

运行效果如下:
在这里插入图片描述
剩下的任务,我们在下一篇中继续实现,到现在为止已经具备示波器的雏形了。下一篇中,我们要模塑绘制动态的波形且具备接受传感器数据的接口。

猜你喜欢

转载自blog.csdn.net/haigear/article/details/85040212