版权声明:本博客所有原创文章未经准许不得转载或保存转发,本人保留版权法律追诉权。 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));
运行效果如下:
剩下的任务,我们在下一篇中继续实现,到现在为止已经具备示波器的雏形了。下一篇中,我们要模塑绘制动态的波形且具备接受传感器数据的接口。