Lab3 - Battery



void setup() {
  background(#191970);
  size(580, 580);
  smooth();
  strokeWeight(3);
  frameRate(60);
}

float V_BX=0, H_BY=0, BL=0, BW=0;
boolean end_X=false, end_Y=false;
void draw() {
  background(0);
  motion(0.03, 0.05);
  charge();
  Draw_Battery(V_BX, H_BY, BL, BW);
  Status();
}

void Draw_Battery(float V_BX, float H_BY, float BL, float BW) {

  //ratio//
  float BR=height/8;

  //X vertical V_BX;
  //Y horizontal  H_BY;

  //Length//BL;
  //Width//BW;

  noFill();
  stroke(255);
  //Big rectangle//
  rect(BR*2.5 + BR * V_BX,
    BR*3.5 + BR * H_BY,
    BR*3 + BR * BW,
    BR*1 + BR * BL);



  //small rectangle//
  rect(BR*5.5  + BR*V_BX  + BR*BW,
    BR*3.75 + BR*H_BY  + BR*1/4*BL,
    BR*0.15 + 0.15 * BR*BW,
    BR*0.5  + 0.5 * BR*BL);
  //color small rect//

  fill(#CCCCCC);
  rect(BR*5.5  + BR*V_BX  + BR*BW,
    BR*3.75 + BR*H_BY  + BR*1/4*BL,
    BR*0.15 + 0.15 * BR*BW,
    BR*0.5  + 0.5 * BR*BL);


  //capacity
  if (Cap_Battery>=1) {
    strokeWeight(1);
    stroke(255);
    fill(#FFFF33);
    rect((BR*2.5 + BR * V_BX),
      BR*3.5 + BR * H_BY,
      BR*1 + BR * BW/3,
      BR*1 + BR * BL);
  }

  if (Cap_Battery>=2) {
    fill(#99FF33);
    rect((BR*2.5 + BR * V_BX)+(BR*2.5 )*2/5 + BR*BW *1/3,
      BR*3.5 + BR * H_BY,
      BR*1 + BR * BW/3,
      BR*1 + BR * BL);
  }

  if (Cap_Battery>=3) {
    fill(#33FF33);
    rect((BR*2.5 + BR * V_BX)+(BR*2.5 )*4/5 + BR*BW *2/3,
      BR*3.5 + BR * H_BY,
      BR*1 + BR * BW/3,
      BR*1 + BR * BL);
  }

  Positive(V_BX*8, H_BY*8, BL*8, BW*8);
  Negative(V_BX*8, H_BY*8, BL*8, BW*8);
}

void Positive(float V_SX, float H_SY, float SL, float SW) {
  //ratio
  float PR=height/64;
  //X vertical//
  V_SX=V_SX+38+SW;
  //Y horizontal//
  H_SY=H_SY+28+SL/2;
  //Length//
  SL=SL/8;
  //Width//
  SW=SW/8;

  fill(#FF3333);
  noStroke();
  beginShape();
  vertex(PR*3.5 + PR*V_SX -0.25*PR*SL, PR*2.5 + PR*H_SY -0.5*PR*SW); //L 1
  vertex(PR*4.5 + PR*V_SX +0.25*PR*SL, PR*2.5 + PR*H_SY -0.5*PR*SW); //R 1
  vertex(PR*4.5 + PR*V_SX +0.25*PR*SL, PR*3.5 + PR*H_SY -0.25*PR*SW); //R 2
  vertex(PR*5.5 + PR*V_SX +0.5*PR*SL, PR*3.5 + PR*H_SY -0.25*PR*SW); //R 3
  vertex(PR*5.5 + PR*V_SX +0.5*PR*SL, PR*4.5 + PR*H_SY +0.25*PR*SW); //R 4
  vertex(PR*4.5 + PR*V_SX +0.25*PR*SL, PR*4.5 + PR*H_SY +0.25*PR*SW); //R 5
  vertex(PR*4.5 + PR*V_SX +0.25*PR*SL, PR*5.5 + PR*H_SY +0.5*PR*SW); //R 6
  vertex(PR*3.5 + PR*V_SX -0.25*PR*SL, PR*5.5 + PR*H_SY +0.5*PR*SW); //L 6
  vertex(PR*3.5 + PR*V_SX -0.25*PR*SL, PR*4.5 + PR*H_SY +0.25*PR*SW); //L 5
  vertex(PR*2.5 + PR*V_SX -0.5*PR*SL, PR*4.5 + PR*H_SY +0.25*PR*SW); //L 4
  vertex(PR*2.5 + PR*V_SX -0.5*PR*SL, PR*3.5 + PR*H_SY -0.25*PR*SW); //L 3
  vertex(PR*3.5 + PR*V_SX -0.25*PR*SL, PR*3.5 + PR*H_SY -0.25*PR*SW); //L 2

  endShape();
}

void Negative(float V_SX, float H_SY, float SL, float SW) {
  //ratio
  float PR=height/64;
  //X vertical//
  V_SX=V_SX+18;
  //Y horizontal//
  H_SY=H_SY+28+SL/2;
  //Length//
  SL=SL/8;
  //Width//
  SW=SW/8;

  fill(#FF3333);
  noStroke();
  beginShape();
  vertex(PR*3.5 + PR*V_SX -0.25*PR*SL, PR*2.5 + PR*H_SY -0.5*PR*SW); //L 1
  vertex(PR*4.5 + PR*V_SX +0.25*PR*SL, PR*2.5 + PR*H_SY -0.5*PR*SW); //R 1
  vertex(PR*4.5 + PR*V_SX +0.25*PR*SL, PR*5.5 + PR*H_SY +0.5*PR*SW); //R 6
  vertex(PR*3.5 + PR*V_SX -0.25*PR*SL, PR*5.5 + PR*H_SY +0.5*PR*SW); //L 6
  vertex(PR*3.5 + PR*V_SX -0.25*PR*SL, PR*2.5 + PR*H_SY -0.5*PR*SW); //L 1


  endShape();
}

float Cap_Battery=0;
void charge() {
  if (Cap_Battery<=0)Cap_Battery=0;
  if (Cap_Battery<=2) {
    fill(random(255), random(255), random(188));
    textSize(88);
    text("Charge", width/4, height/4);
  }
  if (Cap_Battery>0)Cap_Battery-=0.008;
}

void mouseClicked() {
  Cap_Battery++;
  if (Cap_Battery>=3.9)Cap_Battery=3.9;
}
float limit;
float limit_Above(float on, float off) {
  if (Cap_Battery<=2)limit=on;
  else if (Cap_Battery>2)limit=off;
  return limit;
}

void motion(float Motion_X, float Motion_Y) {


  if (V_BX>=2.5)end_X=true;
  else if (V_BX<-2.5)end_X=false;
  if (H_BY>=3.5)end_Y=true;
  else if (H_BY<-limit_Above(1.3, 3.5))end_Y=false;

  if (!end_X)
    V_BX=(V_BX+Motion_X);
  else if (end_X)
    V_BX=V_BX-Motion_X;

  if (!end_Y)
    H_BY=(H_BY+Motion_Y);
  else if (end_Y)
    H_BY=H_BY-Motion_Y;
}

void Status() {
  fill(255);
  textSize(13);
  if (Cap_Battery<=2)text("Status : warning", width/38, height/38);
  else if (Cap_Battery>2)text("Status : Discharge", width/38, height/38);
  else text("Status : Error", width/38, height/38);
}