mercredi 1 décembre 2021
physic's car engine demo version 0.3 programmed on my smartphone!
dimanche 14 novembre 2021
خوارزميات محاكات مسار حركة السيارة
الجزء الاول القسم النظري
ملاحضة : هذه المقالة موجة لاصحاب الاختصاص في البرمجة المحاكات و الالعاب و لديهم مستوى عالي في الرياضيات
A الدولاب الخلفي
B الدولاب الامامي
|AB|=L مسافة بين دواليب الامامية و الخلفية
Va سرعة دواليب الخلفية
Vb= V سرعة دواليب الامامية
θ زاوية دوان الدواليب المامية و اتجاه سرعة السيارة
الهدف من هذه المسألة هو حساب مسار الدواليب الاربعة للسيارة مع تغير سرعة و اتجاه السيارة و من ثم ايجاد الخوارزميات المناسب للتحكم في سياقة السيارة مع المتغيرات الاساسية السرعة و زاوية دوران دواليب الامامية
كما نلاحض في الصورة ان المسافة بين الدولاب الامامي و الخلفي يبق دائما ثابتة و السرعة تساوي V| = |Vb| cos(θ)| =>
|Vb|= |V|/cos(θ)
و بتالي شعاع Vb مركب من شعاعين اثنية على مسقاط المماس و الخط القائم
Vb = Vb cos(θ) Tab + Vb sin(θ) Nab
Tab = AB/|AB|
Nab شعاع قائم بنسبة ل AB
OA=(xa,ya) OB=(xb,yb)
AB=(xab,yab)=OB-OA=(xb-xa,yb-ya)
xab=xb-xa
yab=yb-ya
Tab= AB/|AB| = AB/L= (xab/L,yab/L)
Nab _|_ Tab => Nab . Tab = 0
Nab=(-yab,xab)
Vb = Vb cos(θ) Tab + Vb sin(θ) Nab
=>
Vb = V/cos(θ) * cos(θ) Tab + V/cos(θ)* sin(θ) Nab
Va = V Tab
Vb = V Tab + V tan(θ) Nab
dAB/dt= dOB/dt- dOA/dt= Vb-Va= V tan(θ) Nab
dAB/dt=V tan(θ) Nab
هذه هي معادلة الشعاعية التفاظلية لحركة النسبية للدواليب A و B
dxab(t)/dt = -V tan(θ)/L yab(t)
dyab(t)/dt = V tan(θ)/L xab(t)
ω=V tan(θ)/L سرعة دوران السيارة
dxab(t)/dt = - ω yab(t) (1)
dyab(t)/dt = ω xab(t) (2)
نقوم الان باضافة الاعداد المركبة لتبسيط المعادلة
Zab = xab + i yab
(1)+ i (2) =>
dxab(t)/dt + i dyab(t)/dt= - ω yab(t) +i ω xab(t)
d(xab(t) + i yab(t))/dt= i ω ( i yab(t) + xab(t) )
dZab/dt = iω Zab
ln Zab = ∫ iω dt + Constant
Zab(t) = Zab(0) exp( i ∫ ω(t) dt)
Zab(t) = Zab(0) exp( i ∫ V(t) tan(θ(t))/L dt)
و بما ان السرعة الدواليب الخلفية و زاوية الدوران الدواليب الامامية متغيرة سيتولى الحاسوب حل هذه المعادلة التفاظلية بطريقة euler
الجميع من يقود السيارة يعلم ان اذا قمنا بتثبيت السرعة و المقود ستقوم السيارة بالدوران على نفسها و ترسم شكل دائري او حركة مستقيم اذا كان المقود مستقيم
لنقم بحساب نصف قطر الدائرة الخارجية و الداخلية لمسار سيارة في حالة θ # 0
θ(t) = θ ثابة
V(t) = V ثابة
Zab(t) = Zab(0) exp( i ∫ V tan(θ)/L dt)
Zab(t) = Zab(0) exp( i V tan(θ)/L t)
xab(0)=L yab(0)=0
Zab(0) =xab(0)+ i yab(0) = L
Zab(t) = L exp( i V tan(θ)/L t)
xab(t)= L cos( V tan(θ)/L t)
yab(t)= L sin( V tan(θ)/L t)
xb(t)= xab(t)+ xa(t)
yb(t)= yab(t)+ ya(t)
dOA/dt = V Tab
dxa(t)/dt= V/L xab(t) dya(t)/dt= V/L yab(t)
dxa(t)/dt= V cos( V tan(θ)/L t)
dya(t)/dt= V sin( V tan(θ)/L t)
xa(t)= ∫ V cos( V tan(θ)/L t) dt
ya(t)= ∫ V sin( V tan(θ)/L t) dt
xa(t)= L cot(θ) sin( V tan(θ)/L t) +C1
ya(t)= -L cot(θ) cos( V tan(θ)/L t) +C2
xa(0)= 0 ya(0)= 0
xa(t)= L cot(θ) sin( V tan(θ)/L t)
ya(t)= L cot(θ) (1-cos( V tan(θ)/L t) )
xa(t)² + (ya(t)- L cot(θ))²= L² cot(θ)²
Ra = L cot(θ)
xa^2 + (ya-R)^2= R^2
نستنتج ان حركة الدولاب A الخلفي هو على شكل معادلة الدائرة نصف قطرها |L |cot(θ)
Ra = L |cot(θ)|
xb(t)= xab(t)+ xa(t)
yb(t)= yab(t)+ ya(t)
xb(t)= L cos( V tan(θ)/L t) + L cot(θ) sin( V tan(θ)/L t)
yb(t)=L sin( V tan(θ)/L t) + L cot(θ) (1-cos( V tan(θ)/L t) )
xb(t)= L/sin(θ) sin( V tan(θ)/L t +θ)
yb(t)=-L/sin(θ) cos( V tan(θ)/L t +θ) +L cot(θ)
xb(t)²+ (yb(t)- L cot(θ))²= L²/sin(θ)²
Rb = L/|sin(θ)|
Ra = Rb |cos(θ)|
Ra/Rb= |cos(θ)|
و نستنتج ايضا ان حركة الدولاب B المامي هو يخضع لمعادلة الدائرة نصف قطرها |(L/|sin(θ
تابع الجزء الثاني
تطبيق المعدلات النظرية في البرنامج و تجسيدها على شكل خوزميات...
jeudi 28 octobre 2021
hydrogen electron orbitals in 3d space
mardi 26 octobre 2021
vendredi 24 septembre 2021
pinfoot aso, Basic!
vendredi 28 mai 2021
vendredi 21 mai 2021
maze
mardi 18 mai 2021
mercredi 31 mars 2021
pinball physic's engine developped with processing language
منصة
class flipper {
float R,r,D,phi0;
float phi,omega;
float deltaphi=PI/3;
float choc=1.2;
float Vpinball = 13;
vec2 v,vt;
vec2 o,m;
vec2 a1,b1,a2,b2;
wall w1,w2 ;
circle c1,c2;
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() {
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(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;
}
void control_right( char c) {
if ((mousePressed && mouseButton == LEFT) || (keyPressed && key==c)) {
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 ((mousePressed && mouseButton == LEFT) || (keyPressed && key==c)) {
sound_pinball.stop();
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;
}
}
boolean collision() {
return w1.collision(b) ||w2.collision(b) || c1.collision(b) || c2.collision(b);
}
}