前面我们基本了解了在Processing中绘图的基本流程和键盘及鼠标互动必备的一些知识,当然,我们的摸索绝不可能止步于此,我们要一路坚持,继续摸索前行。
我们在C++C#或者Java中已经感受到面对对象的好处,那么在Processing中应该也是能够实现类的设计和封装的,否则我们的那些个图形元素就不能按照我们的意图进行管理了。比如,将各种图形元素进行保存,那就基本没有办法了。
我们来看看Processing的类是如何设计实现的。我们以绘制线条为例,我们要给我们的线条增加一些功能,比如绘制线条时要同时指定其透明度或者颜色,则必须通过stroke来完成。如果我们自己设计一个线条类,则可以把透明度及颜色的设置单独分开,代码如下:
void setup()
{
size(560,300);
Pline ln1=new Pline(40,40,220,40);
Pline ln2=new Pline(40,140,220,140,color(10,160,50));
Pline ln3=new Pline(40,240,220,240,150);
Pline ln4=new Pline(340,40,520,40,color(10,160,50),100);
Pline ln5=new Pline(340,140,520,140);
ln3.Color=color(160,10,10);
ln3.StartX=340;
ln3.EndX=520;
ln3.drawline();
}
class Pline
{
float StartX,StartY,EndX,EndY;
float Alf=254;
color Color= color(0,0,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(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();
}
void drawline()
{
stroke(Color,Alf);
line(StartX,StartY,EndX,EndY);
noStroke();
}
}
运行效果如下图:
从上面的代码,我们可以看出,在Processing中定义类,与java中没有什么差别。我们这里利用了构造函数的重载来实现了我们的不同个数的参数实例化。
当然,这样增加了一个麻烦,那就是每次都要实例化一个类后才能够划线,在代码编写的时候要多写一个等号一个new以及类名称。我们做这样的类的封装一定是想代码更简单,那么如果实现更简单的代码呢,那就要用到静态类或者静态方法了。当然,使用静态类有个问题,那就是静态类中不能有非静态方法和变量的调用。而Processing中的常用方法中有很多都是非静态方法,如line 、fill和stroke等,这点我们事先必须注意。
当然,仅仅为了绘制一条线,可能我们感觉不不出类封装有多少优势,比如我们要绘制一个表格,表格的横线和竖线之间的其实就是一个相对距离的差别,完全没有必要重新开始去输入起点坐标和终点坐标四个参数。下面我们来封住一个偏移函数offset,那么绘制一个表格就变得高效一些了。
代码如下:
void setup()
{
size(560,380);
Pline ln1=new Pline(40,40,520,40);
ln1.offsetLine(0,60);
ln1.offsetLine(0,60);
ln1.offsetLine(0,60);
ln1.offsetLine(0,60);
ln1.offsetLine(0,60);
Pline ln2=new Pline(40,40,40,340);
ln2.offsetLine(80,0);
ln2.offsetLine(80,0);
ln2.offsetLine(80,0);
ln2.offsetLine(80,0);
ln2.offsetLine(80,0);
ln2.offsetLine(80,0);
}
class Pline
{
float StartX,StartY,EndX,EndY;
float Alf=254;
color Color= color(0,0,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 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绘制我们需要的填充了文字的表格的了。我们下一篇继续摸索。