মূল বিষয়বস্তু
কম্পিউটার প্রোগ্রামিং
কোর্স: কম্পিউটার প্রোগ্রামিং > অধ্যায় 5
পাঠ 5: বল- নিউটনের গতিসূত্রসমূহ
- চ্যালেঞ্জ: ভাসমান বেলুন
- অনেকগুলো অবজেক্টের গতি
- চ্যালেঞ্জ: দেয়ালে বল
- মহাকর্ষ এবং ঘর্ষণ মডেল
- চ্যালেঞ্জ: গতিরোধকারী
- বায়ু এবং আবর্ত ঘর্ষণ
- চ্যালেঞ্জ: ডুবন্ত কাঠ
- মহাকর্ষীয় আকর্ষণ
- চ্যালেঞ্জ: নকশা উৎপাদক
- পারস্পরিক আকর্ষণ
- চ্যালেঞ্জ: পারস্পরিক বিকর্ষণ
- প্রকল্প: বাস্তুসংস্থান তৈরি
© 2023 Khan Academyব্যবহারের শর্তাদিগোপনীয়তার নীতিমালাকুকি নোটিশ
পারস্পরিক আকর্ষণ
ভালো হয়েছে, আমরা একটি সহজ উদাহরণ নিয়ে শুরু করেছিলাম—একটি বস্তু আরেকটি বস্তুকে আকর্ষণ করে—এবং তারপর দেখেছিলাম একটি বস্তু অনেক বস্তুকে আকর্ষণ করে। কিন্তু, আমরা জটিল কোন উদাহরণও করতে পারতাম যেমন: অনেক বস্তু একে অপরকে আকর্ষণ করে। পক্ষান্তরে, একটি পরিবেশে প্রত্যেকটি বস্তু ওই পরিবেশের অন্যান্য বস্তুকে আকর্ষণ করে (নিজেকে ব্যতীত)।
এটার জন্য প্রায় সব কাজই আমাদের করা হয়ে গেছে। এখন
Mover
অবজেক্টের অ্যারে নেই:var movers = [];
for (var i = 0; i < 5; i++) {
movers[i] = new Mover(
random(0.1, 2),
random(width),
random(height));
}
draw = function() {
background(255, 255, 255);
for (var i = 0; i < movers.length; i++) {
movers[i].update();
movers[i].display();
}
};
The
draw()
function is where we need to work some magic.
Currently, we’re saying: “for every mover i, update and display yourself.” Now what we need to say is: “for every mover i, be attracted to every other mover j, and update and display yourself.”for (var i = 0; i < movers.length; i++) {
// For every Mover, check every Mover!
for (var j = 0; j < movers.length; j++) {
var force = movers[j].calculateAttraction(movers[i]);
movers[i].applyForce(force);
}
}
for (var i = 0; i < movers.length; i++) {
movers[i].update();
movers[i].display();
}
Notice that we made an entirely new
for
loop above the update-and-display loop. That's because we want to make sure that we calculate all the attraction forces before updating each mover. If we accidentally updated each mover in that first for
loop, then we'd be affecting the calculation of the attraction forces after, and they wouldn't be accurate.Our code won't work yet, because we need each
Mover
to have a calculateAttraction()
method. In the previous example, we had an Attractor
object with a method named calculateAttraction()
. Now, since we have movers attracting movers, we can copy that method into the Mover
object:Mover.prototype.calculateAttraction = function(m) {
var force = PVector.sub(this.position, m.position);
var distance = force.mag();
distance = constrain(distance, 5.0, 25.0);
force.normalize();
var strength = (G * this.mass * m.mass) / (distance * distance);
force.mult(strength);
return force;
};
কিন্তু, একটি সমস্যা আছে। আমরা যখন প্রত্যেকটি mover i এবং mover j দেখছি, তখন i সমান j হওয়াটা কি সঠিক? উদাহরণস্বরূপ, mover #3 কি mover #3 কে আকর্ষণ করবে? উত্তরটি, অবশ্যই, না হবে। যদি পাঁচটি অবজেক্ট থাকে, আমরা চাই mover #3 যেন নিজেকে ছাড়া 0, 1, 2 এবং 4 কে আকর্ষণ করে। এছাড়াও, আমরা, উভয় বলকে বের করে mover #3 থেকে mover #1 এবং mover #1 থেকে mover #3 এ প্রয়োগ করতে চাই। বের করা বল (force) প্রতি জোড়ার জন্য একই হবে, কিন্তু প্রত্যেক mover এর ভরের উপর নির্ভর করে ত্বরণ ভিন্ন হবে। আমাদের আকর্ষণ বলের সারণি নিম্নরূপ:
0 ⇢ 1, 2, 3, 4
1 ⇢ 0, 2, 3, 4
2 ⇢ 0, 1, 3, 4
3 ⇢ 0, 1, 2, 4
1 ⇢ 0, 2, 3, 4
2 ⇢ 0, 1, 3, 4
3 ⇢ 0, 1, 2, 4
লুপের মধ্যে পরিবর্তন করেছি যেন ভেতরের লুপ mover গুলোর নিজেস্ব আকর্ষণ বাদ দেয়। এভাবেই আমরা এই উদাহরণটি শেষ করলাম:
for (var i = 0; i < movers.length; i++) {
for (var j = 0; j < movers.length; j++) {
if (i !== j) {
var force = movers[j].calculateAttraction(movers[i]);
movers[i].applyForce(force);
}
}
}
এবার সম্পূর্ণ প্রোগ্রাম দেখা যাক:
এই "প্রাকৃতিক সিমুলেশন" কোর্সটি নেওয়া হয়েছে Daniel Shiffman (ড্যানিয়েল শিফম্যান) এর লেখা "The Nature of Code" (কোডের প্রকৃতি) থেকে এবং এটি ক্রিয়েটিভ কমন্সের এট্রিবিউশন-নন কমার্শিয়াল 3.0 আনপোরটেড লাইসেন্সের অধিনস্ত।
আলোচনায় অংশ নিতে চাও?
কোন আলাপচারিতা নেই।