week15_01_circle_collision_Ball_new_Ball_display
1.建好簡單的物件架構
程式碼
//week15_01_circle_collision_Ball_new_Ball_display
void setup(){
size(640,360);
}
Ball ball = new Ball(100,200,20);
void draw(){
ball.display();
}
class Ball{
float x,y,z,r;
Ball(int x0,int y0,int r0) {
x = x0;
y = y0;
r = r0;
}
void display(){
ellipse(x,y,r+r,r+r);
}
}
week15_02_circle_collision_class_Ball_update
1.Ball類別功能
update() 方法:更新球的位置,並檢查球是否碰到視窗邊界,若碰到則反彈(反轉速度)。display() 方法:使用 ellipse() 函數在視窗上畫出球。程式碼
//week15_02_circle_collision_class_Ball_update
void setup(){
size(640,360);
}
Ball ball = new Ball(100,200,20);
void draw(){
ball.update();
ball.display();
}
//把class Ball 移動到新分頁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);
}
}
week15_03_circle_collision_detection_two_ball
1.做出碰撞偵測
checkCollision(Ball other)方法:- 邏輯:使用
dist(x, y, other.x, other.y)計算兩球中心之間的距離,並比較這個距離是否小於兩球半徑的總和 。 - 用途:判斷兩球是否碰撞,如果碰撞,返回
true,否則返回false。
- 邏輯:使用
邊界反彈邏輯:
- x 方向:如果球的下一個
x位置超過視窗寬度(640)或小於 0,速度vx反向(vx = -vx)。 - y 方向:同理,如果球的下一個
y位置超過視窗高度(360)或小於 0,速度vy反向(vy = -vy)。
- x 方向:如果球的下一個
速度隨機生成:
- 在建構子中,
vx和vy使用random(-10, +10)隨機生成速度,讓球的移動方向與速度有所變化。
- 在建構子中,
程式碼
//week15_03_circle_collision_detection_two_ball
Ball ball = new Ball(100, 200, 60);
Ball ball2 = new Ball(300, 200, 60);
void setup() {
size(640, 360);
}
void draw() {
background(51);
if(ball.checkCollision(ball2)) fill(#FFAAAA);
else fill(255);
ball.update();
ball.display();
ball2.update();
ball2.display();
}
//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);
}
}
week15_04_circle_collision_cos_vector_sin_N_N2_M_M2_swap
1.做出碰撞
程式碼
//week15_04_circle_collision_cos_vector_sin_N_N2_M_M2_swap
Ball ball = new Ball(100, 200, 60);
Ball ball2 = new Ball(300, 200, 60);
void setup() {
size(640, 360);
}
void draw() {
background(51);
if(ball.checkCollision(ball2)) fill(#FFAAAA);
else fill(255);
ball.update();
ball.display();
ball2.update();
ball2.display();
}
//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();
float a = diff.heading();
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(-N.y,N.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 = newV1.y;
other.vx = newV2.x;
other.vy = newV2.y;
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);
}
}
week15_05_maze_DFS_visited
1.做出迷宮地圖
程式碼
//week15_05_maze_DFS_visited
int [][] maze = {
{1,1,1,1,1,1,1,1,1,1},
{1,0,0,1,1,0,0,0,1,1},
{1,1,0,1,1,0,1,0,1,1},
{1,1,0,0,1,0,1,0,1,1},
{1,0,1,0,0,0,1,0,1,1},
{1,0,1,1,0,1,1,0,1,1},
{1,0,0,0,0,1,1,0,1,1},
{1,0,1,1,1,1,1,0,1,1},
{1,0,0,0,0,0,1,0,0,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);
}
week15_07_maze_DFS_visited_step_mousePressed_move
1.會往下還有往右,但還不會自動跑完地圖
//week15_07_maze_DFS_visited_step_mousePressed_move
int [][] maze = {
{1,1,1,1,1,1,1,1,1,1},
{1,0,0,1,1,0,0,0,1,1},
{1,1,0,1,1,0,1,0,1,1},
{1,1,0,0,1,0,1,0,1,1},
{1,0,1,0,0,0,1,0,1,1},
{1,0,1,1,0,1,1,0,1,1},
{1,0,0,0,0,1,1,0,1,1},
{1,0,1,1,1,1,1,0,1,1},
{1,0,0,0,0,0,1,0,0,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(){
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;
}
}







沒有留言:
張貼留言