KeplerProcessing

Newtonの運動法則

F=ma

Verlet法の導出

玉の動きに

  • verletで玉の動きを計算
  • next, curr, prevで次ぎ,現在,過去の座標を使う
  • forceは万有引力を,x,y座業に分解する
float m_size;
float m=0.2;
float h=0.01;
float[][] coord = new float[400][2];
int k = 0;
float[] r0 = {  2.00, -0.01};
float[] rh = {  2.00, 0.00};

void setup() {
  frameRate(30);
  size( 500, 300, P3D);
  coord[0]= rh;
  coord[1]= r0; 
  for (int i=0; i < 391; i++) {
    coord[i+2] = verlet(coord[i+1], coord[i]);
  }
}

float[] force(float pos[]) {
  float x, y, L;
  float[] posforce = new float[2];
  x=pos[0];
  y=pos[1];
  L=pow( (x*x+y*y), 1.5);
  posforce[0] = -x/L;
  posforce[1] = -y/L;
  return posforce;
}

//現在と過去の座標から次の座標
float[] verlet(float curr[], float prev[]) {
  float[] posforce = new float[2];
  float[] next = new float[2];
  posforce = force(curr);
  next[0]=2*curr[0]-prev[0]+h*h/m*posforce[0];
  next[1]=2*curr[1]-prev[1]+h*h/m*posforce[1];
  return next;
} 


void draw() {

  //球を描画する座標 x、yは 座標*(単位座標のピクセル数)+ 原点の座標
  // orbitar 
  ;
  translate(200+100*coord[k][0],200+100*coord[k][1],0.0);

  fill(128, 128, 255);
  sphere(5);

  k += 10;  // for loop
  if (k >392) k = 0;
}

meshの作成


float x0,x1,y0,y1,z0,z1;
float dx,dy,dz,dc;
float currX, currY, oldX, oldY;

void setup() {
//
 currX=currY=oldX=oldY=0.0;
  set_mesh( -1, 2.5, -1.5, 1.5, -2.5, 0, 200);
}


float func(float x, float y) {
  return -1.0/sqrt(x*x+y*y);
  // return -1.0*x+2.0*y-3.0;
}
float x_size,y_size,z_size;
int x_min,x_max,y_min,y_max,z_min,z_max;
void set_mesh(float tx0, float tx1, float ty0, float ty1, float tz0, float tz1, int tsize) {
  x_size=tsize;
  m_size=tsize;
  x0=tx0;x1=tx1;
  y0=ty0;y1=ty1;
  z0=tz0;z1=tz1;
  y_size=(y1-y0)/(x1-x0)*x_size;
  z_size=(z1-z0)/(x1-x0)*x_size;
  dx=(x1-x0)/x_size;
  x_min=int(x0/dx);
  x_max=int(x1/dx);
  dy=(y1-y0)/y_size;
  y_min=int(y0/dy);
  y_max=int(y1/dy);
  dz=(z1-z0)/z_size;
  z_min=int(z0/dz);
  z_max=int(z1/dz);
  dc=128/m_size;
}

void plot_point(int i, int j){
  float z = func( i*dx, j*dy )/dz;
  if (z >= z_min && z <= z_max) {
    stroke(255, 127+dc*i, 127+dc*j);
    strokeWeight(2);
    point(i, j, z); // z0/dz+(z-z0)/dz
  }
}
void plot_axez(){ //default plot
  plot_axez(0.0);
}
void plot_axez(float z){  //z<>0.0
  stroke(255, 255, 255);
  strokeWeight(2);
  line(x_min,0,z/dz, x_max,0,z/dz);
  line(0,y_min,z/dz, 0,y_max,z/dz);
  line(0,0,z0/dz, 0,0,z1/dz);
}

void plot_mesh(){
  for (int i=x_min; i<=x_max; i+=4) {
    for (int j=0; j<=y_max; j+=20) {
      plot_point(i,j);
    }
    for (int j=-20; j>=y_min; j-=20) {
      plot_point(i,j);
    }
  }
  for (int j=y_min; j<=y_max; j+=4) {
    for (int i=0; i<=x_max; i+=20) {
      plot_point(i,j);
    }
    for (int i=-20; i>=x_min; i-=20) {
      plot_point(i,j);
    }
  }
}

float[] get_xyz(float x, float y, float z){
  float [] res = {x/dx,y/dy,z/dz};
  return res;
}

void draw() {
//
  // mesh drawing
  plot_mesh();
  plot_axez(-1.25);
  // center sphere
  float [] pos=new float[3];
  pos=get_xyz(0.0,0.0,-1.25);
  translate(pos[0],pos[1],pos[2]);
  sphereDetail(12, 12);
  stroke(128, 0, 0);
  fill(128, 0, 0);
  sphere(15);
  translate(-pos[0],-pos[1],-pos[2]);

視点(Camera)移動

void draw() {
  float mvX=0.0, mvY=0.0;
  background(10,10,10);
  camera(0, 0, m_size, 
         0, 0, -m_size/2, 
         0, 1, 0);

  if (mousePressed) {
    mvX =mouseX-oldX;
    mvY =mouseY-oldY;
  }
  oldX=mouseX;
  oldY=mouseY;
  currX += mvX;
  currY -= mvY;
  rotateX(radians(currY/3));
  rotateY(radians(18.0/3));
  rotateZ(radians(-currX/3));

  // mesh drawing
  plot_mesh();
  plot_axez(-1.25);
  // center sphere
  float [] pos=new float[3];
  pos=get_xyz(0.0,0.0,-1.25);
  translate(pos[0],pos[1],pos[2]);
  sphereDetail(12, 12);
  stroke(128, 0, 0);
  fill(128, 0, 0);
  sphere(15);
  translate(-pos[0],-pos[1],-pos[2]);

}
Last modified:2016/07/19 12:42:17
Keyword(s):
References: