2024年12月16日 星期一

SY-BlingBangBang week15 點播4

   [TODO]

上課內容:

Collision1

// week15_1_circle_collision_class_Ball_new_Ball_display
// https://processing.org/examples/circlecollision.html
void setup(){
  size(640,360);
}
Ball ball = new Ball(100, 200, 20);
void draw(){
  ball.display();
}
class Ball{
  float x,y,r;
  Ball(int x0, int y0, int r0){
    x = x0;
    y = y0;
    r = r0;
  }
  void display(){
    ellipse(x, y, r+r, r+r);
  }
}



Collision2

[主頁]

// week15_2_circle_collision_class_Ball_update
// https://processing.org/examples/circlecollision.html
void setup(){
  size(640,360);
}
Ball ball = new Ball(100, 200, 20);
void draw(){
  ball.update();//加這行
  ball.display();
}
//把class Ball 移到右邊的新分頁(名字也叫Ball)

[分頁]

class Ball{
  float x,y,r;
  float vx,vy;
  Ball(int x0, int y0, int r0){
    x = x0;
    y = y0;
    r = r0;
    vx = random(-10,+10);
    vy = random(-10,+10);
  }
  void update(){
    if(x+vx > 640 || x+vx < 0) vx = -vx;
    if(y+vy < 0 || y+vy > 360) vy = -vy;
    x += vx;
    y += vy;
  }
  void display(){
    ellipse(x, y, r+r, r+r);
  }
}



Collision3

主頁

// week15_3_circle_collision_detection_two_ball
void setup(){
  size(640,360);
}
Ball ball = new Ball(100, 200, 60);
Ball ball2 = new Ball(300, 200, 60);//加這行
void draw(){
  background(51);
  if(ball.checkCollision(ball2)) fill(#FFAAAA);
  else fill(255);
  ball.update();
  ball.display();
  ball2.update();//加這行
  ball2.display();//加這行
}
//把class Ball 移到右邊的新分頁(名字也叫Ball)

分頁

class Ball{
  float x,y,r;
  float vx,vy;
  Ball(int x0, int y0, int r0){
    x = x0;
    y = y0;
    r = r0;
    vx = random(-10,+10);
    vy = random(-10,+10);
  }
  boolean checkCollision(Ball other){
    if(dist(x, y, other.x, other.y) < r+other.r) return true;
    else return false;
  }
  void update(){
    if(x+vx > 640 || x+vx < 0) vx = -vx;
    if(y+vy < 0 || y+vy > 360) vy = -vy;
    x += vx;
    y += vy;
  }
  void display(){
    ellipse(x, y, r+r, r+r);
  }
}


Collision4

主頁

// week15_4_circle_collision_cos_sin_vector_N_N2_M_M2_swap
void setup(){
  size(640,360);
}
Ball ball = new Ball(100, 200, 60);
Ball ball2 = new Ball(300, 200, 60);//加這行
void draw(){
  background(51);
  if(ball.checkCollision(ball2)) fill(#FFAAAA);
  else fill(255);
  ball.update();
  ball.display();
  ball2.update();//加這行
  ball2.display();//加這行
}
//把class Ball 移到右邊的新分頁(名字也叫Ball)

分頁
class Ball{
  float x,y,r;
  float vx,vy;
  Ball(int x0, int y0, int r0){
    x = x0;
    y = y0;
    r = r0;
    vx = random(-10,+10);
    vy = random(-10,+10);
  }
  boolean checkCollision(Ball other){
    if(dist(x+vx, y+vy, other.x+other.vx, other.y+other.vy) <= r+other.r) {
      PVector diff = new PVector(other.x-x, other.y-y);
      float len = diff.mag(); //maganitude 量值、長度的意思
      float a = diff.heading(); //向量的方向,對應某個角度
      //大家熟的 cos(a), sin(a)
      PVector N = diff.copy().normalize(); //連線方向
      N.mult(N.dot(new PVector(vx,vy)));
      PVector N2 = new PVector(-N.y, N.x).normalize(); //另一個垂直方向
      N2.mult(N2.dot(new PVector(vx,vy)));
      
      PVector M = diff.copy().normalize();
      M.mult(M.dot(new PVector(other.vx, other.vy)));
      PVector M2 =new PVector(-M.y, M.x).normalize();
      M2.mult(M2.dot(new PVector(other.vx, other.vy)));
      
      PVector newV1 = PVector.add(M,N2);
      PVector newV2 = PVector.add(N,M2);
      vx = newV1.x;
      vy = newV2.y;
      other.vx = newV2.x;
      other.vy = newV2.y;
      return true;
    }
    else return false;
  }
  void update(){
    if(x+vx > 640-r || x+vx < 0+r) vx = -vx;
    if(y+vy < 0+r || y+vy > 360-r) vy = -vy;
    x += vx;
    y += vy;
  }
  void display(){
    ellipse(x, y, r+r, r+r);
  }
}


迷宮1
// week15_5_maze_DFS
int [][] maze = {
  {1,1,1,1,1,1,1,1,1,1},
  {1,0,0,0,0,0,1,1,1,1},
  {1,1,0,1,0,0,1,1,1,1},
  {1,1,0,1,0,0,0,0,1,1},
  {1,1,0,1,0,0,1,1,1,1},
  {1,1,0,0,0,0,1,1,1,1},
  {1,1,0,1,1,1,1,1,1,1},
  {1,1,0,1,1,1,1,1,1,1},
  {1,1,0,0,0,0,0,0,1,1},
  {1,1,1,1,1,1,1,1,1,1},
};
void setup(){
  size(400,400);
}
void draw(){
  for(int i=0; i<maze.length; i++){
    for(int j=0; j<maze[0].length; j++){
      if(maze[i][j]==1) fill(0);
      else fill(255);
      rect(j*40, i*40, 40, 40);
    }
  }
}



迷宮2
// week15_6_maze_DFS_visited
int [][] maze = {
  {1,1,1,1,1,1,1,1,1,1},
  {1,0,0,0,0,0,1,1,1,1},
  {1,1,0,1,0,0,1,1,1,1},
  {1,1,0,1,0,0,0,0,1,1},
  {1,1,0,1,0,0,1,1,1,1},
  {1,1,0,0,0,0,1,1,1,1},
  {1,1,0,1,1,1,1,1,1,1},
  {1,1,0,1,1,1,1,1,1,1},
  {1,1,0,0,0,0,0,0,1,1},
  {1,1,1,1,1,1,1,1,1,1},
};
int [][] visited = new int [10][10];
int startI = 1, startJ = 1, I=1, J=1, step=1;
void setup(){
  size(400,400);
  visited[I][J] = step;
}
void draw(){
  for(int i=0; i<maze.length; i++){
    for(int j=0; j<maze[0].length; j++){
      if(maze[i][j]==1) fill(0);
      else fill(255);
      rect(j*40, i*40, 40, 40);
    }
  }
  fill(255,0,0);
  rect(startJ*40, startI*40, 40, 40);
}



迷宮3
// week15_7_maze_DFS_visited_step_mousePressed_move
int [][] maze = {
  {1,1,1,1,1,1,1,1,1,1},
  {1,0,0,0,0,0,1,1,1,1},
  {1,1,0,1,0,0,1,1,1,1},
  {1,1,0,1,0,0,0,0,1,1},
  {1,1,0,1,0,0,1,1,1,1},
  {1,1,0,0,0,0,1,1,1,1},
  {1,1,0,1,1,1,1,1,1,1},
  {1,1,0,1,1,1,1,1,1,1},
  {1,1,0,0,0,0,0,0,1,1},
  {1,1,1,1,1,1,1,1,1,1},
};
int [][] visited = new int [10][10];
int startI = 1, startJ = 1, I=1, J=1, step=1;
void setup(){
  size(400,400);
  visited[I][J] = step;
}
void draw(){
  for(int i=0; i<maze.length; i++){
    for(int j=0; j<maze[0].length; j++){
      if(maze[i][j]==1) fill(0);
      else fill(255);
      rect(j*40, i*40, 40, 40);
    }
  }
  fill(255,0,0);
  rect(startJ*40, startI*40, 40, 40);
  for(int i=0; i<maze.length; i++){
    for(int j=0; j<maze[0].length; j++){
      if(visited[i][j]>0){
        fill(0,0,255);
        text(""+visited[i][j], j*40+20, i*40+20);
      }
    }
  }
}
void mousePressed(){ //按下mouse會往右走 or往下走
  if(maze[I+1][J]==0){ //下面這格,是空格,可以走
    I = I+1;
    visited[I][J] = ++step;
  }
  else if(maze[I][J+1]==0){
    J = J+1;
    visited[I][J] = ++step;
  }
}



迷宮4
// week15_8_maze_DFS_boolean_true_false_ok
int [][] maze = {
  {1,1,1,1,1,1,1,1,1,1},
  {1,0,0,0,0,0,1,1,1,1},
  {1,1,0,1,0,0,1,1,1,1},
  {1,1,0,1,0,0,0,0,1,1},
  {1,1,0,1,0,0,1,1,1,1},
  {1,1,0,0,0,0,1,1,1,1},
  {1,1,0,1,1,1,1,1,1,1},
  {1,1,0,1,1,1,1,1,1,1},
  {1,1,0,0,0,0,0,0,1,1},
  {1,1,1,1,1,1,1,1,1,1},
};
int [][] visited = new int [10][10];
int startI = 1, startJ = 1, I=1, J=1, step=1;
void setup(){
  size(400,400);
  visited[I][J] = step;
}
void draw(){
  for(int i=0; i<maze.length; i++){
    for(int j=0; j<maze[0].length; j++){
      if(maze[i][j]==1) fill(0);
      else fill(255);
      rect(j*40, i*40, 40, 40);
    }
  }
  fill(255,0,0);
  rect(startJ*40, startI*40, 40, 40);
  for(int i=0; i<maze.length; i++){
    for(int j=0; j<maze[0].length; j++){
      if(visited[i][j]>0){
        fill(0,0,255);
        text(""+visited[i][j], j*40+20, i*40+20);
      }
    }
  }
}
boolean DFS(int i, int j, int s){
  if(i==8 && j==8) return true; //走到目的地
  if(maze[i][j]==1) return false; //擋住,不能走
  if(visited[i][j] > 0) return false; //走過,不要再走
  visited[i][j] = s; //現插旗子,表示走到這裡
  if(DFS(i+1, j, s+1)) return true;
  if(DFS(i-1, j, s+1)) return true;
  if(DFS(i, j+1, s+1)) return true;
  if(DFS(i, j-1, s+1)) return true;
  visited[i][j] = 0;
  return false;
}
void mousePressed(){ //按下mouse會往右走 or往下走
  visited[1][1] = 0;
  DFS(1,1,1);
}


沒有留言:

張貼留言