91 lines
2.8 KiB
Markdown
91 lines
2.8 KiB
Markdown
|
---
|
||
|
title: Particle Sim
|
||
|
localeTitle: الجسيمات نعم
|
||
|
---
|
||
|
## محاكاة الجسيمات في قماش
|
||
|
|
||
|
في هذا الدليل ، سنقوم ببناء محاكاة للجسيمات الأساسية في Canvas باستخدام مبادئ بسيطة من الرسوم المتحركة.
|
||
|
|
||
|
سنرغب في إنشاء مجموعة من الجسيمات مع التسارع والسرعات. سنقوم بإنشاء 100 جسيم في نقاط عشوائية على اللوحة.
|
||
|
|
||
|
`canvas = document.getElementById("canvas");
|
||
|
ctx = canvas.getContext('2d');
|
||
|
|
||
|
var particles = [];
|
||
|
for(var i=0; i<100; i++) {
|
||
|
particles.push(
|
||
|
{
|
||
|
x:Math.random()*canvas.width,
|
||
|
y:Math.random()*canvas.height,
|
||
|
vx:0,
|
||
|
vy:0,
|
||
|
ax:0,
|
||
|
ay:0
|
||
|
}
|
||
|
);
|
||
|
}
|
||
|
`
|
||
|
|
||
|
في حلقة الرسم لدينا ، نقدم هذه الجسيمات.
|
||
|
|
||
|
`function draw() {
|
||
|
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
||
|
for(var i=0; i<particles.length; i++) {
|
||
|
// update state
|
||
|
|
||
|
// render state
|
||
|
ctx.beginPath();
|
||
|
ctx.arc(particles[i].x, particles[i].y, 5, 0, 2*Math.PI);
|
||
|
ctx.fill();
|
||
|
}
|
||
|
|
||
|
window.requestAnimationFrame(draw);
|
||
|
}
|
||
|
window.requestAnimationFrame(draw);
|
||
|
`
|
||
|
|
||
|
الآن ، كل ما نحتاجه هو تحديث السرعة وتسريع كل إطار. سنضيف التسارع إلى السرعة وإضافة السرعة إلى الموضع.
|
||
|
|
||
|
`function draw() {
|
||
|
for(var i=0; i<particles.length; i++) {
|
||
|
// update state
|
||
|
particles[i].x+=particles[i].vx;
|
||
|
particles[i].y+=particles[i].vy;
|
||
|
particles[i].vx+=particles[i].ax;
|
||
|
particles[i].vy+=particles[i].ay;
|
||
|
|
||
|
/* render code */
|
||
|
}
|
||
|
|
||
|
window.requestAnimationFrame(draw);
|
||
|
}
|
||
|
window.requestAnimationFrame(draw);
|
||
|
`
|
||
|
|
||
|
هذا هو! كل ما يتعين علينا القيام به هو خلق قوة في مكان ما. دعونا نفعل ذلك مع مستمع النقر.
|
||
|
|
||
|
`canvas.addEventListener("click", function(e) {
|
||
|
var clickX = e.clientX-canvas.offsetLeft;
|
||
|
var clickY = e.clientY-canvas.offsetTop;
|
||
|
for(var i=0; i<particles.length; i++) {
|
||
|
var delx = particles[i].x-clickX;
|
||
|
var dely = particles[i].y-clickY;
|
||
|
var magnitudeSquared = Math.pow(delx, 2)+Math.pow(dely, 2);
|
||
|
|
||
|
|
||
|
particles[i].ax = 0.1*delx/magnitudeSquared;
|
||
|
particles[i].ay = 0.1*dely/magnitudeSquared;
|
||
|
|
||
|
}
|
||
|
});
|
||
|
`
|
||
|
|
||
|
هذا يضيف قوة عبر قانون مربع معكوس. انظر [هذه الصفحة](#placeholder) لمزيد من التفاصيل.
|
||
|
|
||
|
هذا كل شئ! codepen النهائي:
|
||
|
|
||
|
شاهد Pen [Particle Sim (FCC)](https://codepen.io/alanluo/pen/OjMbpm/) بواسطة Alan Luo ( [alanluo](https://codepen.io/alanluo) ) على [CodePen](https://codepen.io) .
|
||
|
|
||
|
#### معلومات اكثر:
|
||
|
|
||
|
* [MDN Canvas API](https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API)
|