vendredi 25 octobre 2024

2D pinball physic's engine

 




//flipper

class flipper {

float R,r,D,phi0;

float phi,omega;

float deltaphi=PI/2.6;

float choc=1.2;

float Vpinball = 25;

vec2 v,vt;

vec2 o,m;

vec2 a1,b1,a2,b2;

wall w1,w2 ;

circle c1,c2;

 //bar() { };

 

 flipper(vec2 io,float iR,float ir,float iD,float iphi0) {

   o = new vec2(io.x,io.y); 

   R =iR; r = ir; D = iD; phi0 = iphi0;

   m = new vec2(D,0);

 // rotate the bar  

   m = add(o,m);

   m = rot(m,o,phi0);

 // compute the two walls

  float L = sqrt(D*D-pow(R-r,2));

  a1 = new vec2();

  b1 = new vec2();

  a1.x = R*(R-r)/D+o.x; a1.y = R*L/D+o.y;

  b1.x = r*(R-r)/D+D+o.x; b1.y = r*L/D+o.y;

  a1 = rot(a1,o,phi0); b1 = rot(b1,o,phi0);

  w1 = new wall(a1.x,a1.y,b1.x,b1.y);

  a2 = new vec2();

  b2 = new vec2();

  a2.x = R*(R-r)/D+o.x; a2.y = -R*L/D+o.y;

  b2.x = r*(R-r)/D+D+o.x; b2.y = -r*L/D+o.y;

  a2 = rot(a2,o,phi0); b2 = rot(b2,o,phi0);

  w2 = new wall(a2.x,a2.y,b2.x,b2.y); 

  c1 = new circle(o.x,o.y,R);c1.choc =0.5;

  c2 = new circle(m.x,m.y,r);c2.choc =0.5;

   v =new vec2(0,0);

   vt =new vec2(0,0);

   omega = 5;

 }


void draw() {

  strokeWeight(1);

  stroke(0,255,0);

 fill(255,0,0,100);

 beginShape();

vertex(w1.a.x,w1.a.y);

vertex(w1.b.x,w1.b.y);

vertex(w2.b.x,w2.b.y);

vertex(w2.a.x,w2.a.y);

endShape(CLOSE);

  noFill();

  w1.wg=2; w2.wg = 2;

  w1.setcolor(255,0,0);

  w2.setcolor(255,0,0);

 w1.draw();w2.draw();

  //stroke(255,0,0);

  strokeWeight(1);

  fill(255,0,0);

  ellipse(o.x,o.y,2*R,2*R);

  ellipse(m.x,m.y,2*r,2*r);

 fill(255);  stroke(255);  strokeWeight(2);

  ellipse(o.x,o.y,R,R);

  ellipse(m.x,m.y,r,r);

}


void  update_motion(float t) {

    a1 = rot(a1,o,omega*t);

    b1 = rot(b1,o,omega*t);

    w1.a.x =a1.x;w1.a.y =a1.y;w1.b.x =b1.x;w1.b.y=b1.y;

    w1.omega = omega;

    a2 = rot(a2,o,omega*t);

    b2 = rot(b2,o,omega*t);

    w2.a.x =a2.x;w2.a.y =a2.y;w2.b.x =b2.x;w2.b.y=b2.y;

    w2.omega = omega;

    m = rot(m,o,omega*t);

    c2.p.x = m.x;c2.p.y=m.y;

    phi+=omega*t;

  }

  boolean touch_left() {

    for ( int i=0;i< touches.length;i++) 

    if (touches[i].x>width/2) return true;

    return false;

  }

   boolean touch_right() {

    for ( int i=0;i< touches.length;i++) 

    if (touches[i].x<width/2) return true;

    return false;

  }

   void control_right( char c) {

   if (/*touchIsStarted*/touch_left() ) {

   // if (!sound_pinball.isPlaying()) sound_pinball.play();


    if (phi>=phi0+deltaphi) omega=0; else omega=Vpinball;

  } else {

    if (phi<=phi0) omega=0; else omega=-Vpinball;

   }}

  

   void control_left( char c) {

      if (/*touchIsStarted*/ touch_right()) {

     //   sound_pinball.stop();

     // if (!sound_pinball.isPlaying()2) sound_pinball.play();


      

    if (phi<=(phi0-deltaphi)) omega=0; else omega=-Vpinball;

  } else {

    if (phi>=phi0) omega=0; else omega=Vpinball;

  }

   }

boolean collision(ball b) {

    

    

    return w1.collision(b) || w2.collision(b) || c1.collision(b) || c2.collision(b);

}


}

vendredi 10 février 2023

the power of Trigonometric functions!












اليوم اقدم برنامج يبين ما مدى اهمية الدوال الجيبية في محاكات حركة دوران عقرب الساعة مكتوب بلغة جافا , عدد اسطره لا يتجاوز 40 كما هو موضح ا


/* CLOCK */

PImage clock;
float rh,rm,rs;
float xh,yh,thetah;
float xm,ym,thetam;
float xs,ys,thetas;
void setup() {
size(600,600);
clock=loadImage("e:/processing/clock0.jpg");
rh = 80; rm = 120; rs = 160;
}
void draw() {
thetah = 2*PI*hour()/12-PI/2;
xh = rh* cos(thetah)+width/2; yh = rh* sin(thetah)+height/2;
thetam = 2*PI*minute()/(60)-PI/2;
xm = rm* cos(thetam)+width/2; ym = rm* sin(thetam)+height/2;
thetas = 2*PI*second()/(60)-PI/2;
xs = rs* cos(thetas)+width/2; ys = rs* sin(thetas)+height/2;
background(0);
image(clock,0,0);
textSize(20);
fill(0);
textAlign(CENTER);
text(hour()+":"+minute()+":"+second(),width/2,180);
stroke(0,0,255); strokeWeight(3);
line(width/2,height/2,xs,ys);
stroke(0,255,0); strokeWeight(5);
line(width/2,height/2,xm,ym);
stroke(255,0,0); strokeWeight(8);
line(width/2,height/2,xh,yh);
}

dimanche 27 novembre 2022

لعبة hockeyball بواسطة الشبكة !


















هذه اللعبة ستكون اول نموذج تعليمي بحيث سأقوم توضيح جميع الخطوات برمجة الالعاب من النقطة صفر الى مستوى الاعتراف , الدروس ستكون على شكل اجزاء متسلسلة , اشير في الاخير ان هذه الدروس موجهة لمن لديهم ادنى معرف عن البرمجة نظريا و الرياضيات مستوى ثانوي على الاقل
1/ اختيار لغة البرمجة المناسبة
2/ علاقة شاشة الكمبيوتر بالهندسة ثنائية الابعاد
3/ مفهوم الرسومات و تحويلها الى تعليمات رقمية
4/ مبدأ حركة الرسومات في الشاشة
5/ تفاعل الفأرة و لوحة المفاتيح مع الكمبيوتر
7/ فيزياء الحركة و اصطدام الرسومات
8/ ادارة الاحداث و توجيهها
9/ مبدأ الذكاء الاصطناعي و تطبيقاته في الالعاب
10/ برمجة العاب عن طريق شبكة LAN


 

mercredi 2 novembre 2022

double pendulum

 





float theta1,vtheta1,theta2,vtheta2;

float x1,y1,x2,y2;
float vx,vy;
float g=9.8;
float l= 4;
void init() {
theta1 =0; vtheta1 = 0.0;
theta2 =0; vtheta2 = 0.0;
//l= density*l;
}
void motion(float dt) {
float a= 2;
float b= cos(theta1-theta2);
float c= cos(theta1-theta2);
float d = 1;
float b1= vtheta1*vtheta2*sin(theta1-theta2)-2*g/l*sin(theta1)+ax*vx;
float b2 = -vtheta1*vtheta2*sin(theta1-theta2)-g/l*sin(theta2)+ay*vy;
float det = a*d-b*c;
float r1= (d*b1-b*b2)/det;
float r2= (-c*b1+a*b2)/det;
vtheta1+= dt*r1;
vtheta2+= dt*r2;
// vtheta1+= dt/l*(ax*cos(theta1)+sin(theta1)*(-g+ay));
// vphi+=dt/(l*sin(phi))*(ax*sin(phi)-ay*cos(phi));
theta1+= vtheta1*dt;
vtheta1*=0.98;
// vtheta2+= vtheta1+dt/l*(ax*cos(theta2)+sin(theta2)*(-g+ay));
theta2+= vtheta2*dt;
vtheta2*=0.98;
vx+=dt*ax;
vy+=dt*ay;
}
void pendulum() {
strokeWeight(10);
k=100;
float theta1,vtheta1,theta2,vtheta2;
float x1,y1,x2,y2;
float vx,vy;
float g=9.8;
float l= 4;
void init() {
theta1 =0; vtheta1 = 0.0;
theta2 =0; vtheta2 = 0.0;
//l= density*l;
}
void motion(float dt) {
float a= 2;
float b= cos(theta1-theta2);
float c= cos(theta1-theta2);
float d = 1;
float b1= vtheta1*vtheta2*sin(theta1-theta2)-2*g/l*sin(theta1)+ax*vx;
float b2 = -vtheta1*vtheta2*sin(theta1-theta2)-g/l*sin(theta2)+ay*vy;
float det = a*d-b*c;
float r1= (d*b1-b*b2)/det;
float r2= (-c*b1+a*b2)/det;
vtheta1+= dt*r1;
vtheta2+= dt*r2;
// vtheta1+= dt/l*(ax*cos(theta1)+sin(theta1)*(-g+ay));
// vphi+=dt/(l*sin(phi))*(ax*sin(phi)-ay*cos(phi));
theta1+= vtheta1*dt;
vtheta1*=0.98;
// vtheta2+= vtheta1+dt/l*(ax*cos(theta2)+sin(theta2)*(-g+ay));
theta2+= vtheta2*dt;
vtheta2*=0.98;
vx+=dt*ax;
vy+=dt*ay;
}
void pendulum() {
strokeWeight(10);
k=100;
x1=k*l*sin(theta1)+x0;
y1=k*l*cos(theta1)+y0;
x2=x1+k*l*sin(theta2);
y2=y1+k*l*cos(theta2);
stroke(255);
float k=1000;
stroke(255);
line(x0,y0,x1,y1);
line(x1,y1,x2,y2);
stroke(255,0,0);fill(255,255,0);
// ellipse(x1,y1,60,60);
fill(200,0,0);noStroke();
lights();
//ambientLight(0,0,0,0,-1,0);
lightSpecular(255,255,255);
directionalLight(200,100,100,-1,0,-1);
specular(200);
pushMatrix();
translate(x1,y1);
sphere(50);
popMatrix();
pushMatrix();
translate(x2,y2);
sphere(60);
popMatrix();
noFill();stroke(200);
ellipse(x0,y0,60,60);
ellipse(x0,y0,10,10);
}