[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); }
沒有留言:
張貼留言