这是一个用processing写的趣味画板,是我和室友一起做的一个小玩意儿。
画板的功能介绍如下图所示。 菜单栏详细介绍: 保存/另存为 :可以打开本地的文件夹选择器,默认存储格式为jpg,若用户指定格式,则以用户指定的格式存储图片。保存按钮在使用过一次后,再次点击不会打开文件夹选择器,而是保存到之前填写的存储位置。 背景颜色 :该画板的颜色模式为HSB模式,背景颜色选择区域是一个120x100的矩形区域,点击背景颜色时会清空绘画区域。 画笔颜色 :同背景颜色,只不过点击画笔颜色不会清空绘画区域。 图形选择 :该画板比较简单,图形较少,只有线条,随机圆,移动圆,矩形,圆角矩形,中心对称,花朵(图片),花朵(图形)。
画板的主界面如图所示: 下面就是这个画板的代码了,由四个标签组成,其中三个为class。 DrawPanel_mainfile:
String pic_name="line"; //用于记录图形
PFont font; //字体
int strokeSize=1; //用于记录描边粗细
color strokeColor; //用于记录描边颜色
color backColor; //用于记录绘画区域的背景颜色
int key_d_=0; //用于记录帮助是否打开
String filename; //用于记录之前保存的文件名
//以下四个变量用于画矩形
float x1,x2,y1,y2; //用于记录按钮按下和松开时的坐标
int j1=0; //用于记录是否有鼠标按下的坐标
int j2=0; //用于记录是否有鼠标松开的坐标
int d_; //用于矩形记录鼠标是否按下
//移动圆所需变量
int move_circle_d=0; //用于移动圆记录鼠标是否按下
//圆角矩形所需变量
float rcx1,rcx2,rcy1,rcy2;
int rcj1=0;
int rcj2=0;
int rcd_;
//中心对称所需变量
float csx,csy;
int csj=0;
int csd_;
int line_count=6; //该整数用于记录当前中心对称所产生的线条数
//花朵所需变量
float flowerSize=50; //定义一个全局变量用于增加花朵大小
//可填充颜色的花朵所需变量
PShape s; //创建一个图形对象用来存储花朵的形状
float jiaodu; //用来画花朵弧形的函数
float size=0; //用来记录花朵的大小
color colora=color(random(0,120),random(0,120),random(0,100)); //记录花朵的随机颜色
//按钮图标
PImage[] img=new PImage[13];
MoveCircle[] mcs=new MoveCircle[0];
void setup(){
background(255);
colorMode(HSB, 100); //设置颜色模式为HSB模式
backColor=color(0,0,120);
fill(backColor);
rect(-1,121,1001,680);
size(1000,800);
font=createFont("KaiTi-48.vlw",30); //创建字体为楷体
textFont(font); //将楷体设置为默认字体
textSize(30);
frameRate(30);
for(int i=0;i220&&mouseX5&&mouseY275&&mouseX5&&mouseY330&&mouseX5&&mouseY385&&mouseX5&&mouseY440&&mouseX5&&mouseY220&&mouseX65&&mouseY275&&mouseX65&&mouseY330&&mouseX65&&mouseY870&&mouseX10&&mouseY620&&mouseX10&&mouseY385&&mouseX60&&mouseY120&&mouseX15&&mouseY10&&mouseX15&&mouseY0){ //若用户再文件名处写了后缀
save(selection.getAbsolutePath()); //以用户规定的格式保存
}else{
save(selection.getAbsolutePath()+".jpg"); //默认保存为jpg格式
}
}
}
//保存调用的函数,之所以保存与另存为要分开写,是为了filename的正确存储,另存为按钮并不会filename传值
//这样点击另存为之后,再点保存按钮,不会保存到另存为设置的文件路径。这样filename就只能存储保存按钮
//输入的文件存储路径了
void selectFile_(File selection){
if(selection==null){
}else{
if(selection.getAbsolutePath().indexOf(".")>0){ //若用户再文件名处写了后缀
save(selection.getAbsolutePath()); //以用户规定的格式保存
filename=selection.getAbsolutePath(); //将文件名保存下来
}else{
save(selection.getAbsolutePath()+".jpg"); //默认保存为jpg格式
filename=selection.getAbsolutePath()+".jpg"; //将文件名保存下来
}
}
}
//键盘监听函数
void keyReleased(){
char k=key;
switch(k){
case 'c':
fill(backColor);
noStroke();
rect(-1,121,1001,680);
mcs=new MoveCircle[0];
break;
case 'C':
fill(backColor);
noStroke();
rect(-1,121,1001,680);
mcs=new MoveCircle[0];
break;
case 'h':
openHelp(); //调用打开帮助的函数
break;
case 'H':
openHelp();
break;
case '0':
strokeSize=0;
break;
case '1':
strokeSize=1;
break;
case '2':
strokeSize=2;
break;
case '3':
strokeSize=3;
break;
case '4':
strokeSize=4;
break;
case '5':
strokeSize=5;
break;
case '6':
strokeSize=6;
break;
case '7':
strokeSize=7;
break;
case '8':
strokeSize=8;
break;
case '9':
strokeSize=9;
break;
case 'w':
line_count+=1;
break;
case 's':
line_count-=1;
break;
}
}
//打开、关闭帮助的函数
void openHelp(){
if(key_d_==0){
//先用矩形覆盖背景颜色的区域,然后将帮助图片加载上去
noStroke();
fill(0,0,120);
rect(510,0,230,120);
image(img[12],510,10,230,100);
key_d_=1;
}else{
//同理用矩形覆盖帮助图片区域,再讲背景颜色的区域重新绘制一边
noStroke();
fill(0,0,120);
rect(510,10,230,110);
stroke(0,0,0);
strokeWeight(1);
line(610,0,610,120);
for (int i = 0; i < 120; i++) {
for (int j = 0; j < 100; j++) {
stroke(i, j, 120);
point(620+i, 10+j);
}
}
image(img[10],510,10,90,90);
key_d_=0;
}
}
//监听鼠标样式的函数
void mouseStyle(){
if(mouseX>220&&mouseX5&&mouseY275&&mouseX5&&mouseY330&&mouseX5&&mouseY385&&mouseX5&&mouseY440&&mouseX5&&mouseY220&&mouseX65&&mouseY275&&mouseX65&&mouseY330&&mouseX65&&mouseY870&&mouseX10&&mouseY620&&mouseX10&&mouseY385&&mouseX60&&mouseY120&&mouseX15&&mouseY10&&mouseX15&&mouseY140){
line(mouseX,mouseY,pmouseX,pmouseY);
}
}
//当图形为随机圆时
if(shape_name=="random_circle"){
frameRate(8); //修改帧速率,防止图形产生过快覆盖了原图形
noStroke();
if(mousePressed&&(mouseButton==LEFT)&&mouseY>140){
int r=(int)random(25,45); //随机产生圆半径
int R=(int)random(0,255); //随机red值
int G=(int)random(0,255); //随机green值
int B=(int)random(0,255); //随机blue值
int A=(int)random(0,255); //随机透明度
fill(R,G,B,A);
ellipse(mouseX,mouseY,r,r);
}
}
//当图形为移动圆形时
if(shape_name=="move_circle"){
frameRate(50);
noStroke(); //去掉描边
if(mouseY>140){
if(mousePressed){
move_circle_d=1;
}else{
if(move_circle_d==1){
MoveCircle mc=new MoveCircle(mouseX,mouseY,strokeColor,strokeSize);
mcs=(MoveCircle[])append(mcs,mc); //用append函数添加新元素到对象数组中
}
move_circle_d=0;
}
}
for(int i=0;i140){
if(mousePressed){
d_=1;
j2=0;
if (j1==0) //按下鼠标时记录此时的鼠标坐标
{
j1=1;
x1=mouseX;
y1=mouseY;
}
}else{
if (d_==1) {
fill(strokeColor);
j1=0;
if (j2==0) //松开鼠标时记录此时的鼠标坐标
{
j2=1;
x2=mouseX;
y2=mouseY;
}
quad(x1, y1, x1, y2, x2, y2, x2, y1); //只需在松开鼠标时绘画,用四边形,不能用矩形
d_=0;
}
}
}
}
//当图形为圆角矩形时
if(shape_name=="radius_rect"){
frameRate(100);
strokeWeight(strokeSize);
stroke(strokeColor);
if(mouseY>140){
if(mousePressed){
rcd_=1;
rcj2=0;
if (rcj1==0) //按下鼠标时记录此时的鼠标坐标
{
rcj1=1;
rcx1=mouseX;
rcy1=mouseY;
}
}else{
if (rcd_==1) {
fill(255);
rcj1=0;
if (rcj2==0) //松开鼠标时记录此时的鼠标坐标
{
rcj2=1;
rcx2=mouseX;
rcy2=mouseY;
}
//quad(rcx1, rcy1, rcx1, rcy2, rcx2, rcy2, rcx2, rcy1);
float rcr=min(abs(rcx1-rcx2),abs(rcy1-rcy2))/3.0; //圆角半径
float rct; //用于交换坐标值时作为中间量
//交换角点值,使得rcx1,rcy1为左上角的坐标,rcx2,rcy2为右下角坐标
if(rcx1>rcx2){
rct=rcx1;rcx1=rcx2;rcx2=rct;
}
if(rcy1>rcy2){
rct=rcy1;rcy1=rcy2;rcy2=rct;
}
fill(strokeColor);
arc(rcx1+rcr/2,rcy1+rcr/2,rcr,rcr,PI,PI+HALF_PI);
arc(rcx2-rcr/2,rcy1+rcr/2,rcr,rcr,PI+HALF_PI,TWO_PI);
arc(rcx2-rcr/2,rcy2-rcr/2,rcr,rcr,0,HALF_PI);
arc(rcx1+rcr/2,rcy2-rcr/2,rcr,rcr,HALF_PI,PI);
rect(rcx1,rcy1+rcr/2,rcx2-rcx1,rcy2-rcr-rcy1);
rect(rcx1+rcr/2,rcy1,rcx2-rcr-rcx1,rcy2-rcy1);
rcd_=0;
}
}
}
}
//当图形为中心对称图形时
if(shape_name=="center_shape"){
frameRate(300);
strokeWeight(strokeSize);
stroke(strokeColor);
if(mouseY>140){
if(mousePressed){
csd_=1;
if(csj==0){
csj=1;
csx=mouseX;
csy=mouseY;
}
translate(csx,csy); //移动坐标系
if(dist(mouseX-csx,mouseY-csy,0,0)150){
if(mousePressed){
translate(mouseX,mouseY);
scale(flowerSize/100-0.3+size);
s.beginShape();
s.fill(strokeColor);
s.endShape();
if(size120){
for(int j=0;j |