please format code with </> button * homework policy * asking questions
这是《The Nature of Code》书中第三章关于摩擦力与阻力的作业,我不知道哪里有问题,作为初学者这是我的第一个问题我没有办法去解决所以在这里求助大家。谢谢大家!
Mover movers = new Mover[100];
Liquid liquid;
void setup(){
size(640,320);
smooth();
for(int i =0;i<movers.length;i++){
movers[i] = new Mover(random(0.1,5),0,0);
}
liquid = new Liquid(0,height,2,height/2,0.1);
}
void draw(){
background(255);
liquid.display();
PVector wind=new PVector(0.01,0);
// PVector gravity=new PVector(0,0.1);
for(int i =0;i<movers.length;i++){
if(movers[i].isInside(liquid)){
movers[i].drag(liquid);
}
float m =0.1*movers[i].mass;
PVector gravity = new PVector(0,m);
float c =0.1;
PVector friction = movers[i].velocity.get();
friction.mult(-1);
friction.normalize();
friction.mult(c);
movers[i].applyForce(friction);
movers[i].applyForce(wind);
movers[i].applyForce(gravity);
movers[i].update();
movers[i].display();
movers[i].checkEdges();
}
}
class Mover{
PVector location;
PVector velocity;
PVector acceleration;
float mass;
Mover(float m,float x,float y){
mass= m;
location = new PVector(x,y);
velocity = new PVector(0,0);
acceleration = new PVector(0,0);
}
void applyForce(PVector force){
PVector f = PVector.div(force,mass);
acceleration.add(f);
}
void update(){
velocity.add(acceleration);
location.add(velocity);
acceleration.mult(0);
}
void display(){
stroke(0);
fill(174);
ellipse(location.x,location.y,mass16,mass16);
}
void checkEdges(){
if(location.x>width){
location.x = width;
velocity.x*=-1;
}else if(location.x < 0){
velocity.x*=-1;
location.x = 0;
}
if(location.y>height){
velocity.y*=-1;
location.y = height;
}
}
}
class Liquid{
float x,y,w,h;
float c;
PVector acceleration;
float mass;
PVector location;
PVector velocity;
Liquid(float x_,float y_,float w_,float h_,float c_){
x=x_;
y=y_;
w=w_;
h=h_;
c=c_;
}
void display(){
noStroke();
fill(174);
rect(x,y,w,h);
}
void applyForce(PVector force){
PVector f = PVector.div(force,mass);
acceleration.add(f);
}
boolean isInside(Liquid l){
if(location.x>l.x && location.x<l.x+l.w && location.y>l.y && location.y<l.y+l.h){
return true;
}else{
return false;
}
}
void drag(Liquid l){
float speed = velocity.mag();
float dragMagnitude = l.cspeedspeed;
PVector drag = velocity.get();
drag.mult(-1);
drag.normalize();
drag.mult(dragMagnitude);
applyForce(drag);
}
}