যদি তুমি এই বার্তা দেখে থাক, তার মানে বাইরের উপকরণ লোড করতে সমস্যা হচ্ছে।

If you're behind a web filter, please make sure that the domains *.kastatic.org and *.kasandbox.org are unblocked.

মূল বিষয়বস্তু

পারস্পরিক আকর্ষণ

ভালো হয়েছে, আমরা একটি সহজ উদাহরণ নিয়ে শুরু করেছিলাম—একটি বস্তু আরেকটি বস্তুকে আকর্ষণ করে—এবং তারপর দেখেছিলাম একটি বস্তু অনেক বস্তুকে আকর্ষণ করে। কিন্তু, আমরা জটিল কোন উদাহরণও করতে পারতাম যেমন: অনেক বস্তু একে অপরকে আকর্ষণ করে। পক্ষান্তরে, একটি পরিবেশে প্রত্যেকটি বস্তু ওই পরিবেশের অন্যান্য বস্তুকে আকর্ষণ করে (নিজেকে ব্যতীত)।
এটার জন্য প্রায় সব কাজই আমাদের করা হয়ে গেছে। এখন 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
লুপের মধ্যে পরিবর্তন করেছি যেন ভেতরের লুপ 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 আনপোরটেড লাইসেন্সের অধিনস্ত।

আলোচনায় অংশ নিতে চাও?

কোন আলাপচারিতা নেই।
ইংরেজি জানো? খান একাডেমির ইংরেজি সাইটে আরো আলোচনা দেখতে এখানে ক্লিক কর।