2023年10月12日 星期四

再...再課5單 互動技術概論 - Week05 - ArrayList

 先畫一個3D的盒子(方塊)。


程式碼:

void setup()
{
  size(400, 400, P3D); //Processing的3D功能
}

void draw()
{
  background(#B7E3FF);
  pushMatrix(); //備份矩陣
    translate(mouseX, mouseY);
    box(100); //3D的盒子或方塊
  popMatrix(); //還原矩陣
}
-------------------------------------------------------------------------------
加上對Y軸旋轉。

程式碼:
void setup()
{
  size(400, 400, P3D); //Processing的3D功能
}

void draw()
{
  background(#B7E3FF);
  pushMatrix(); //備份矩陣
    translate(mouseX, mouseY);
    rotateY(radians(mouseX)); //對Y軸轉
    box(100); //3D的盒子或方塊
  popMatrix(); //還原矩陣
}

-------------------------------------------------------------------------------
讓外面再套一個沒有填顏色的盒子。

程式碼:
void setup()
{
  size(400, 400, P3D); //Processing的3D功能
}

void draw()
{
  background(#B7E3FF);
  pushMatrix(); //備份矩陣
    translate(mouseX, mouseY);
    rotateY(radians(mouseX)); //對Y軸轉
    fill(0, 50, 50); //盒子的面填色
    box(100); //3D的盒子或方塊
    
    noFill(); //面不填色
    scale(2); //放大2倍
    box(100); // 盒子大小100,但上面還有放大2倍,所以是200
  popMatrix(); //還原矩陣
}

-------------------------------------------------------------------------------
利用頂點畫出一個三角形並且上色。

程式碼:
size(410, 410, P3D);
beginShape();
fill(0, 150, 50);  vertex(200, 0);
fill(50, 0, 150);  vertex(0, 400);
fill(150, 50, 0);  vertex(400, 400);
endShape();

-------------------------------------------------------------------------------
可是當我們把顏色去掉之後,會發現右邊的線並沒有畫上去。

程式碼:
size(410, 410, P3D);
noFill();
beginShape();
vertex(200, 0);
vertex(0, 400);
vertex(400, 400);
endShape();

-------------------------------------------------------------------------------
如果補上close函式後,就可以把線完整的畫出來了。

程式碼:
size(410, 410, 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(#B7E3FF);
  for(PVector p : pt)
  {
    ellipse(p.x, p.y, 10, 10);
  }
}
void mousePressed()
{
  pt.add(new PVector(mouseX, mouseY));
} //大的資料結構裡,加入小的PVector的物件。
-------------------------------------------------------------------------------
再來是讓我們點出第二個點開始會有線和面出現。

程式碼:
ArrayList<PVector> pt;
//大的資料結構ArrayList
void setup()
{
  size(400, 400, P3D);
  pt = new ArrayList<PVector>();
} //初始化,把大的資料結構準備好(裡面放小的資料結構)

void draw()
{
  background(#B7E3FF);
  for(PVector p : pt) //特殊的for迴圈,得到小的資料結構 
  {
    ellipse(p.x, p.y, 10, 10);
  }
  beginShape();
  for(PVector p : pt) //特殊的for迴圈,得到小的資料結構 
  {
    vertex(p.x, p.y);
  }
  endShape();
}
void mousePressed()
{
  pt.add(new PVector(mouseX, mouseY));
} //大的資料結構裡,加入小的PVector的物件。
-------------------------------------------------------------------------------
加上右鍵3D旋轉。


程式碼:
ArrayList<PVector> pt;
//大的資料結構ArrayList
void setup()
{
  size(400, 400, P3D);
  pt = new ArrayList<PVector>();
} //初始化,把大的資料結構準備好(裡面放小的資料結構)

void draw()
{
  background(#B7E3FF);
  pushMatrix();
  if(mousePressed && mouseButton==RIGHT)
  {
    translate(200, 200);
    rotateY(radians(frameCount));
    translate(-200, -200);  
}
  for(PVector p : pt) //特殊的for迴圈,得到小的資料結構 
  {
    ellipse(p.x, p.y, 10, 10);
  }
  beginShape();
  for(PVector p : pt) //特殊的for迴圈,得到小的資料結構 
  {
    vertex(p.x, p.y);
  }
  endShape();
  popMatrix();
}
void mousePressed()
{
  if(mouseButton==LEFT)
  {
    pt.add(new PVector(mouseX, mouseY));
  }
} //大的資料結構裡,加入小的PVector的物件。

-------------------------------------------------------------------------------
利用滑鼠的左右鍵和中鍵,讓我們按下的時候畫面會變顏色。

程式碼:
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);
}

-------------------------------------------------------------------------------
畫20個點,感測我們點了哪個點,然後再用更大的圓圈起來。


程式碼:
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()
{
  if(mouseButton==CENTER && ans!=null)
  {
    ans.x = mouseX;
    ans.y = mouseY;
  }
}
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;
      }
    }
  }
}

-------------------------------------------------------------------------------
最後加上可以刪除點的程式碼。
因為從頭開始刪會要後面的的全部移動,很浪費時間。
所以程式碼是從後面開始 (i-1)。

程式碼:
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)));
  } //假設畫面中,點好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 mouseDragged()
{
  if(mouseButton==CENTER && ans!=null)
  {
    ans.x = mouseX;
    ans.y = mouseY;
  }
}
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(int i=0; i<pt.size(); i++)
    {
      PVector p = pt.get(i);
      if(dist(p.x, p.y, mouseX, mouseY) < 5)
      {
        pt.remove(i);
      }
    }
  }  
}

沒有留言:

張貼留言