2023年10月12日 星期四

於 week05

 week05

第一步 畫出3D的盒子並跟著滑鼠移動

void setup(){
  size(400, 400, P3D);//3D功能
}
void draw(){
  background(#FFFFF2);
  pushMatrix();//備份矩陣
    translate(mouseX, mouseY);//移動到滑鼠位子
    box(100);//3D的盒子、方塊
  popMatrix();//還原矩陣
  
}



第二步 旋轉


void setup(){
  size(400, 400, P3D);
}
void draw(){
  background(#FFFFF2);
  pushMatrix();
    translate(mouseX, mouseY);
    rotateY(radians(mouseX));//對Y軸轉動
    box(100);
  popMatrix();
}

第三步 變透明

noFill();//無填充(變透明)


第四步 大的盒子包小的盒子(綠色)

......
void draw(){
  background(#FFFFF2);
  pushMatrix();
    translate(mouseX, mouseY);
    rotateY(radians(mouseX));
    fill(0,255,0);//綠色
    box(100);
    
    
    noFill();
    scale(2);//放大2倍
    box(100);
  popMatrix();
}



第五步 點線面色彩

size(400, 400, P3D);
beginShape();
  fill(255,0,0); vertex(200,0);
  fill(0,255,0); vertex(0,400);
  fill(0,0,255); vertex(400,400);
endShape();



第六步 發現不是完整三角形

如何解決

size(400, 400, P3D);
noFill();
beginShape();
  vertex(200,0);
  vertex(0,400);
  vertex(400,400);
endShape(CLOSE);




第七步 

ArrayList<PVector>pt;//大的資料結構ArrayList(可長可短的陣列)
void setup(){
  size(400,400,P3D);
  pt = new ArrayList<PVector>();
}//初始化,把大的資料結構準備好(裡面放小的資料結構)
void draw(){
  background(#FFFFF2);
  for(PVector p : pt){//特殊的for迴圈,得小資料結構
    ellipse(p.x, p.y, 10,10);
  }
}
void mousePressed(){
  pt.add(new PVector(mouseX, mouseY));
}//大的資料結構裡,加入小的PVector的物件


第八步 連出圖形


ArrayList<PVector>pt;
void setup(){
  size(400,400,P3D);
  pt = new ArrayList<PVector>();
}
void draw(){
  background(#FFFFF2);
  for(PVector p : pt){
      ellipse(p.x, p.y,10,10);
  }
  beginShape();
    for(PVector p : pt){
      vertex(p.x, p.y);
  }
  endShape();
}
void mousePressed(){
  pt.add(new PVector(mouseX, mouseY));
}




第九步 按右鍵會轉動

........
void draw(){
  background(#FFFFF2);
  pushMatrix();
  if(mousePressed && mouseButton == RIGHT){
    translate(200,200);
    rotateY(radians(frameCount));
    translate(-200,-200);
  }
    for(PVector p : pt){
        ellipse(p.x, p.y,10,10);
    }
    beginShape();
      for(PVector p : pt){
        vertex(p.x, p.y);
    }
    endShape();
  popMatrix();
}
void mousePressed(){
  if(mouseButton == LEFT){
    pt.add(new PVector(mouseX, mouseY));
  }
}



第十步 用滑鼠換顏色(左中右)

void setup(){
  size(400,400,P3D);
}
void draw(){
  background(255);
  if(mousePressed && mouseButton == LEFT) background(255,0,0);//紅
  if(mousePressed && mouseButton == CENTER) background(0,255,0);//綠
  if(mousePressed && mouseButton == RIGHT) background(0,0,255);//藍
}


更新(下面會有字出現)

.........
void mousePressed(){
  if(mouseButton == LEFT) println("LEFT");
  if(mouseButton == CENTER) println("CENTER");
  if(mouseButton == RIGHT) println("RIGHT");
}


第十一步

ArrayList<PVector>pt;
void setup(){
  size(400,400,P3D);
  pt = new ArrayList<PVector>();
  for(int i = 0; i<20; i++){
    pt.add(new PVector(i*20, 20));
  }//假設畫面中,點好了20個頂點
}
void draw(){
  background(255);
  for(PVector p:pt){//畫出20個頂點
    ellipse(p.x,p.y,10,10);
  }
  if(ans!=null) ellipse(ans.x, ans.y, 15, 15);
}
PVector ans = null;
void mousePressed(){
  for(PVector p:pt){
    if(dist(p.x, p.y, mouseX, mouseY)<5){
      ans=p;
    }
  }
}


第十二步 按中鍵會有雙圈圈並可以移動左鍵可增加頂點


ArrayList<PVector>pt;
void setup(){
  size(400,400,P3D);
  pt = new ArrayList<PVector>();
  for(int i = 0; i<37; i++){
    pt.add(new PVector(random(400), random(400)) );
  }//假設畫面中,隨機點好了37個頂點
}
void draw(){
  background(255);
  for(PVector p:pt){//畫出全部頂點
    ellipse(p.x,p.y,10,10);
  }
  if(ans!=null) ellipse(ans.x, ans.y, 15, 15);
}
PVector ans = null;
void mouseDragged(){//mouseDragged
  if(mouseButton==CENTER && ans!=null){
    ans.x = mouseX;
    ans.y = mouseY;
  }
}
void mousePressed(){//mousePressed
  if(mouseButton==LEFT) pt.add(new PVector(mouseX, mouseY));
  else if(mouseButton==CENTER){
    for(PVector p:pt){
      if(dist(p.x, p.y, mouseX, mouseY)<5){
        ans=p;
      }
    }
  }
}


第十三步 最後



............
void mousePressed(){
  if(mouseButton==LEFT) pt.add(new PVector(mouseX, mouseY));
  else if(mouseButton==CENTER){
    for(PVector p:pt){
      if(dist(p.x, p.y, mouseX, mouseY)<5){
        ans=p;
      }
    }
  }
  else if(mouseButton == RIGHT){//右鍵,要刪掉 用傳統for迴圈
    for(int i=0; i<pt.size(); i++){//要寫兩行才等於厲害的1行
      PVector p = pt.get(i);
      if(dist(p.x, p.y, mouseX, mouseY)<5){//找到夠近的點
        pt.remove(i);//把第i個點刪掉,會把大資料結構右邊的都左移一格
      }
    }
  }
}







沒有留言:

張貼留言