代码本色第2章——力学

序言

此博文基于《代码本色》第三章所写,我们先来回顾一下牛顿力学三大定律

牛顿第一定律

内容:一切物体在没有受到力或合力为零的作用时,总保持静止状态或匀速直线运动状态。
说明:物体都有维持静止和作匀速直线运动的趋势,因此物体的运动状态是由它的运动速度决定的,没有外力,它的运动状态是不会改变的。物体的这种性质称为惯性。所以牛顿第一定律也称为惯性定律。第一定律也阐明了力的概念。明确了力是物体间的相互作用,指出了是力改变了物体的运动状态。因为加速度是描写物体运动状态的变化,所以力是和加速度相联系的,而不是和速度相联系的。在日常生活中不注意这点,往往容易产生错觉。
注意:牛顿第一定律并不是在所有的参照系里都成立,实际上它只在惯性参照系里才成立。因此常常把牛顿第一定律是否成立,作为一个参照系是否惯性参照系的判据。

牛顿第二定律

内容:物体在受到合外力的作用会产生加速度,加速度的方向和合外力的方向相同,加速度的大小与合外力的大小成正比,与物体的惯性质量成反比。
公式:F=ma,F为合外力
牛顿第二定律定量描述了力作用的效果,定量地量度了物体的惯性大小。它是矢量式,并且是瞬时关系。
要强调的是,物体受到的不为零合外力,会产生加速度,使物体的运动状态或速度发生改变,但是这种改变是和物体本身的运动状态有关的。
局限:该定律只适用于宏观物体的低速运动。

牛顿第三定律

内容:两个物体之间的作用力和反作用力,在同一条直线上,大小相等,方向相反。
需要注意:
(1)作用力和反作用力是没有主次、先后之分。同时产生、同时消失。
(2)这一对力是作用在不同物体上,不可能抵消。
(3)作用力和反作用力必须是同一性质的力。
(4)与参照系无

说白了,力就是一个带有方向的标量,也就是说它也是一个向量,此时可以参考前一篇关于向量的博客代码本色第1章——向量

此博客实现的功能与向量中相同,并在其基础上增加了重力。

可见小球与鼠标距离小于一定范围之后,小球就会弹回,但是仍然有接近的趋势

此作品的力学知识有:
1.牛顿第二定律
2.力的累加
3.重力

实验效果
在这里插入图片描述

Mover代码

class Mover {      
PVector position;    
PVector velocity;    
PVector acceleration;    
float mass;    
float g ;        
Mover(float m, float x, float y) {      
mass =m;      
g=1;      
position = 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);      position.add(velocity);      
  acceleration.mult(0);    
  }      
  void display() {      
  stroke(0);      
  strokeWeight(1);            
  float r=random(255);      
  float g=random(255);      
  float b=random(255);      
  fill(200,r,g,b);       
  if(position.x>width||position.x<0)  
    {        
    velocity.x=velocity.x*(-1);              
    }       
    if(position.y>height||position.y<0)      
    {      
    velocity.y=velocity.y*(-1);          
    }      
    float xx=mouseX-position.x;      
    float yy=mouseY-position.y;      
    double xy=Math.sqrt(xx*xx+yy*yy);      
    if(xy<80)      
    {        
    velocity.x=velocity.x*(-1);
            velocity.y=velocity.y*(-1);          
    }    
    ellipse(position.x, position.y, mass*25, mass*25);  }      
    PVector attract(Mover m) {      
    PVector force = PVector.sub(position, m.position);             // Calculate direction of force      
    float distance = force.mag();                                 // Distance between objects      
    distance = constrain(distance, 5.0, 25.0);                             // Limiting the distance to eliminate "extreme" results for very close or very far objects      
    force.normalize();                                            // Normalize vector (distance doesn't matter here, we just want this vector for direction        
    float strength = (g * mass * m.mass) / (distance * distance); // Calculate gravitional force magnitude      
    force.mult(strength);                                         // Get force vector --> magnitude * direction      
    return force;  
      }   
 }  
 
			

主函数代码


Mover[] movers = new Mover[20];        
void setup() {    
size(640,400);    
for (int i = 0; i < movers.length; i++) {    
  movers[i] = new Mover(random(0.1,2),random(width),random(height)); 
}        
}    
void draw() 
{    
background(0);    
for (int i = 0; i < movers.length; i++) 
{      
for (int j = 0; j < movers.length; j++) 
{        
if (i != j) 
{          
PVector force = movers[j].attract(movers[i]);           float xx=mouseX-movers[i].position.x;           
float yy=mouseY-movers[i].position.y;           
double xy=Math.sqrt(xx*xx+yy*yy);      
if(xy<50)      
{                
force.x=-force.x;        
force.y=-force.y;      
}            
movers[i].applyForce(force);        
}             
}       
float m=0.1*movers[i].mass;      
PVector g=new PVector(0,m);      movers[i].applyForce(g);        
movers[i].update();      
movers[i].display();               
}   
}  
		

其中,与前一篇的向量不同之处是

if(xy<50)      
{                
force.x=-force.x;        
force.y=-force.y;      
}            

此代码段是为了让圆形所受到的力反向,所以直接乘以-1即可

float m=0.1*movers[i].mass;      
PVector g=new PVector(0,m);      
movers[i].applyForce(g); 

此代码段主要作用是加了重力,这样就会让球有一种从空中掉落下来的感觉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值