2023年10月26日 星期四

於week07

 week07

第一步  用滑鼠畫線

void setup(){
  size(400,400);
  background(255);
}
void draw(){
  if(mousePressed) line(mouseX, mouseY, pmouseX, pmouseY);
}
void mouseReleased(){
  background(255);
}

第二步  製造一個鬼往中間靠近

........
float ghostX=400, ghostY=20;
void draw(){
  ellipse(200,200, 15,15);
  if(mousePressed) line(mouseX, mouseY, pmouseX, pmouseY);
  ellipse(ghostX,ghostY, 15,15);
  float dx = 200-ghostX, dy = 200-ghostY, len = sqrt(dx*dx+dy*dy);
  ghostX += dx / len / 3;
  ghostY += dy / len / 3;
}
void mouseReleased(){
  background(255);
}



第三步  解決殘影問題(用ArrayList)



ArrayList<PVector>pt = new ArrayList<PVector>();
void setup(){
  size(400,400);
  background(255);
}
float ghostX=400, ghostY=20;
void mouseDragged(){//按下mouse鍵,再拖它
  pt.add( new PVector(mouseX, mouseY) );
}
void draw(){
  background(255);
  ellipse(200,200, 15,15);
  //if(mousePressed) line(mouseX, mouseY, pmouseX, pmouseY);
  for(int i=0; i<pt.size(); i++){
    PVector p = pt.get(i);
    ellipse(p.x, p.y, 3, 3);
  }
  ellipse(ghostX,ghostY, 15,15);
  float dx = 200-ghostX, dy = 200-ghostY, len = sqrt(dx*dx+dy*dy);
  ghostX += dx / len / 3;
  ghostY += dy / len / 3;
}
void mouseReleased(){
  background(255);
}



第四步  解決畫點問題變畫線


ArrayList<PVector> pt=new ArrayList<PVector>();
void setup(){
  size(400,400);
  background(255);
}
float ghostX=400,ghostY=20;
void mouseDragged(){
  pt.add(new PVector(mouseX,mouseY));
}
void draw(){
  background(255);
  ellipse(200,200,15,15);
  for(int i=0;i<pt.size();i++){
    PVector p=pt.get(i);
    ellipse(p.x,p.y,3,3);
  }
  ellipse(ghostX,ghostY,15,15);
  float dx=200-ghostX,dy=200-ghostY,len=sqrt(dx*dx+dy*dy);
  ghostX+=dx/len/3;
  ghostY+=dy/len/3;
void mouseReleased(){
  for(int i=pt.size()-1;i>=0;i--){//倒過來的for迴圈
    pt.remove(i);
  }
}
  


第五步 點變線

ArrayList<PVector> pt=new ArrayList<PVector>();
void setup(){
  size(400,400);
  background(255);
}
float ghostX=400,ghostY=20;
void mouseDragged(){
  pt.add(new PVector(mouseX,mouseY));
}
void draw(){
  background(255);
  ellipse(200,200,15,15);
  for(int i=0;i<pt.size()-1;i++){
    PVector p=pt.get(i),p2=pt.get(i+1);
    line(p.x,p.y,p2.x,p2.y);
  }
  ellipse(ghostX,ghostY,15,15);
  float dx=200-ghostX,dy=200-ghostY,len=sqrt(dx*dx+dy*dy);
  ghostX+=dx/len/3;
  ghostY+=dy/len/3;
void mouseReleased(){
  for(int i=pt.size()-1;i>=0;i--){
    pt.remove(i);
  }
}

第六步 線變粗


.........
void draw(){
  background(255);
  ellipse(200,200,15,15);
  ellipse(ghostX,ghostY,15,15);
  strokeWeight(4);
  float dpx=0, dpy=0;//要看p.x p2.x的差距,p.y p2.y的差距
  for(int i=0;i<pt.size()-1;i++){
    PVector p=pt.get(i),p2=pt.get(i+1);
    dpx += abs(p2.x - p.x);//累積x的移動量
    dpy += abs(p2.y - p.y);//累積y的移動量
  }
  if(dpx>100 && dpy<40) stroke(255, 0, 0);type1 紅色的線
  else stroke(0);//黑色線
  for(int i=0; i<pt.size()-1; i++){
    PVector p = pt.get(i), p2 = pt.get(i+1);
    line(p.x, p.y, p2.x, p2.y);
  }
  float dx=200-ghostX,dy=200-ghostY,len=sqrt(dx*dx+dy*dy);
  ghostX+=dx/len/3;
  ghostY+=dy/len/3;
void mouseReleased(){
  for(int i=pt.size()-1;i>=0;i--){
    pt.remove(i);
  }
}


第七步 線畫到一定長度變紅色


............
void draw(){
  background(255);
  strokeWeight(1);
  stroke(0); ellipse(200, 200, 15, 15);
  stroke(0); ellipse(ghostX, ghostY, 15, 15);
  strokeWeight(4);
  float dpx=0, dpy=0;
  for(int i=0;i<pt.size()-1;i++){
    PVector p=pt.get(i),p2=pt.get(i+1);
    dpx += abs(p2.x - p.x);//累積x的移動量
    dpy += abs(p2.y - p.y);//累積y的移動量
  }
  if(dpx>100 && dpy<40) stroke(255, 0, 0);
  else if(dpx<40 && dpy>100) stroke(0,0,255);
  else stroke(0);
  for(int i=0; i<pt.size()-1; i++){
    PVector p = pt.get(i), p2 = pt.get(i+1);
    line(p.x, p.y, p2.x, p2.y);
  }
.............



第八步  綠色線往右下

............
void draw(){
  background(255);
  strokeWeight(1);
  stroke(0); ellipse(200, 200, 15, 15);
  stroke(0); ellipse(ghostX, ghostY, 15, 15);
  strokeWeight(4);
  float dpx=0, dpy=0;
  int rightdown = 0;//往右下
  for(int i=0;i<pt.size()-1;i++){
    PVector p=pt.get(i),p2=pt.get(i+1);
    dpx += abs(p2.x - p.x);
    dpy += abs(p2.y - p.y);
    if(p2.x - p.x > 0 && p2.y - p.y > 0) rightdown++;
  }
  if(dpx>100 && dpy<40) stroke(255, 0, 0);//type1 紅色的橫線
  else if(dpx<40 && dpy>100) stroke(0,0,255);//type2 藍色的直線 
  else if(rightdown>30) stroke(0,255,0);//type3的前半段.往右下
  else stroke(0);
  for(int i=0; i<pt.size()-1; i++){
    PVector p = pt.get(i), p2 = pt.get(i+1);
    line(p.x, p.y, p2.x, p2.y);
  }
...........

第九步  綠色線

...........
void draw(){
  background(255);
  strokeWeight(1);
  stroke(0); ellipse(200, 200, 15, 15);
  stroke(0); ellipse(ghostX, ghostY, 15, 15);
  strokeWeight(4);
  float dpx=0, dpy=0;
  float rightdown = 0;//往右下
  for(int i=0;i<pt.size()-1;i++){
    PVector p=pt.get(i),p2=pt.get(i+1);
    dpx += abs(p2.x - p.x);
    dpy += abs(p2.y - p.y);
    if(p2.x - p.x > 0 && p2.y - p.y > 0) rightdown+=sqrt(dpx*dpx+dpy*dpy);
    ellipse(p.x,p.y,10,10);
  }
  println(rightdown);
  if(dpx>100 && dpy<40) stroke(255, 0, 0);//type1 紅色的橫線
  else if(dpx<40 && dpy>100) stroke(0,0,255);//type2 藍色的直線 
  else if(rightdown>1500) stroke(0,255,0);//type3的前半段.往右下
  else stroke(0);
  for(int i=0; i<pt.size()-1; i++){
    PVector p = pt.get(i), p2 = pt.get(i+1);
    line(p.x, p.y, p2.x, p2.y);
  }
...............


第十步  綠色勾勾

..........
void draw(){
  background(255);
  strokeWeight(1);
  stroke(0); ellipse(200, 200, 15, 15);
  stroke(0); ellipse(ghostX, ghostY, 15, 15);
  strokeWeight(4);
  float dpx=0, dpy=0;
  float rightdown = 0, rightup = 0;//往右下
  boolean green_part1 = false, green_ok = false;
  for(int i=0;i<pt.size()-1;i++){
    PVector p=pt.get(i),p2=pt.get(i+1);
    dpx += abs(p2.x - p.x);
    dpy += abs(p2.y - p.y);
    if(p2.x - p.x > 0 && p2.y - p.y > 0) rightdown+=sqrt(dpx*dpx+dpy*dpy);
    if(p2.x - p.x > 0 && p2.y - p.y < 0) rightup+=sqrt(dpx*dpx+dpy*dpy);
    ellipse(p.x,p.y,10,10);
    if(green_part1==false && rightdown>150) green_part1 = true;
    else if(green_part1 == true && rightup>150) green_ok = true;
  }
  println(rightdown);
  if(dpx>100 && dpy<40) stroke(255, 0, 0);//type1 紅色的橫線
  else if(dpx<40 && dpy>100) stroke(0,0,255);//type2 藍色的直線 
  else if(green_ok) stroke(0,255,0);//type3的前半段.往右下
  else stroke(0);
  for(int i=0; i<pt.size()-1; i++){
    PVector p = pt.get(i), p2 = pt.get(i+1);
    line(p.x, p.y, p2.x, p2.y);
............


第十一步 倒綠勾勾不成立

........
void draw(){
  background(255);
  strokeWeight(1);
  stroke(0); ellipse(200, 200, 15, 15);
  stroke(0); ellipse(ghostX, ghostY, 15, 15);
  strokeWeight(4);
  float dpx=0, dpy=0;
  float rightdown = 0, green_rightup = 0;//往右下
  boolean green_part1 = false, green_ok = false;
  for(int i=0;i<pt.size()-1;i++){
    PVector p=pt.get(i),p2=pt.get(i+1);
    dpx += abs(p2.x - p.x);
    dpy += abs(p2.y - p.y);
    if(p2.x - p.x > 0 && p2.y - p.y > 0) rightdown+=sqrt(dpx*dpx+dpy*dpy);
    if(green_part1 && p2.x - p.x > 0 && p2.y - p.y < 0) green_rightup += sqrt(dpx*dpx+dpy*dpy);
    ellipse(p.x,p.y,10,10);
    if(green_part1==false && rightdown>150) green_part1 = true;
    else if(green_part1 == true && green_rightup>150) green_ok = true;
  }
  println(rightdown);
  if(dpx>100 && dpy<40) stroke(255, 0, 0);//type1 紅色的橫線
  else if(dpx<40 && dpy>100) stroke(0,0,255);//type2 藍色的直線 
  else if(green_ok) stroke(0,255,0);//type3全部完成
  else if(green_part1) stroke(0, 128, 0);//暗暗的綠色
  else stroke(0);
.......


第十二步 倒勾勾變黃色

.............

void draw(){
  background(255);
  strokeWeight(1);
  stroke(0); ellipse(200, 200, 15, 15);
  stroke(0); ellipse(ghostX, ghostY, 15, 15);
  strokeWeight(4);
  float dpx=0, dpy=0;
  float rightdown = 0, green_rightup = 0;//往右下 往右上
  float rightup = 0, yellow_rightdown = 0;//往右上 往左下
  boolean green_part1 = false, green_ok = false;
  boolean yellow_part1 = false, yellow_ok = false;
  for(int i=0;i<pt.size()-1;i++){
    PVector p=pt.get(i),p2=pt.get(i+1);
    dpx += abs(p2.x - p.x);
    dpy += abs(p2.y - p.y);
    if(p2.x - p.x > 0 && p2.y - p.y > 0) rightdown+=sqrt(dpx*dpx+dpy*dpy);
    if(green_part1 && p2.x - p.x > 0 && p2.y - p.y < 0) green_rightup += sqrt(dpx*dpx+dpy*dpy);
    if(p2.x - p.x > 0 && p2.y - p.y < 0) rightup+=sqrt(dpx*dpx+dpy*dpy);
    if(yellow_part1 && p2.x - p.x > 0 && p2.y - p.y > 0) yellow_rightdown +=  sqrt(dpx*dpx+dpy*dpy);
    //ellipse(p.x,p.y,10,10);
    if(green_part1==false && rightdown>150) green_part1 = true;
    else if(green_part1 == true && green_rightup>150) green_ok = true;
    if(yellow_part1==false && rightup>150) yellow_part1 = true;
    else if(yellow_part1 == true && yellow_rightdown>150) yellow_ok = true;
  }
  println(rightdown);
  if(dpx>100 && dpy<40) stroke(255, 0, 0);//type1 紅色的橫線
  else if(dpx<40 && dpy>100) stroke(0,0,255);//type2 藍色的直線 
  else if(green_ok) stroke(0,255,0);//type3全部完成
  //else if(green_part1) stroke(0, 128, 0);//暗暗的綠色
  else if(yellow_ok) stroke(255,255,0);
  else stroke(0);
..............





沒有留言:

張貼留言