If you're seeing this message, it means we're having trouble loading external resources on our website.

তোমার যদি কোন ওয়েব ফিল্টার দেওয়া থাকে, তাহলে দয়া করে নিশ্চিত কর যে *.kastatic.org এবং *.kasandbox.org ডোমেইনগুলো উন্মুক্ত।

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

স্প্রিং বল

এই অংশের শুরুতে, পিক্সেলের সাথে সাইন তরঙ্গের ব্যবহার করে সরল ছন্দিত স্পন্দন তৈরি করা হয়েছিল, ঐ সাইন তরঙ্গ ব্যবহার করেই আমরা একটি স্প্রিং এ সংযুক্ত বব তৈরি করেছিলাম। আসলে sin() ফাংশন ব্যবহার করে খুব তাড়াতাড়ি, এক লাইনে কোড করেই কাজটি করা যায়, কিন্তু যদি আমরা দ্বিমাত্রিকভাবে একটি স্প্রিং এ সংযুক্ত বব চাই যা অন্যান্য পারিপার্শ্বিক বল (যেমন বায়ু, অভিকর্ষ ইত্যাদি) সাপেক্ষে প্রতিক্রিয়া দেবে তাহলে এটা দিয়ে কাজ হবে না। এ ধরনের সিমুলেশনের জন্য (যা সরল দোলকের মতই, কিন্তু এখানে শুধুমাত্র স্প্রিংটি কার্যকরী দৈর্ঘ্য হিসেবে কাজ করে), স্প্রিং এর বলকে PVector দিয়ে মডেল করা যায়।
হুকের সূত্রানুসারে স্প্রিং এর বল হিসাব করা হয়, নামকরণ কর রবার্ট হুক, একজন ব্রিটিশ পদার্থবিজ্ঞানী যিনি এই সূত্রটি 1660 সালে আবিস্কার কর। হুক সূত্রটি ল্যাটিন ভাষায় প্রকাশ কর: "Ut tensio, sic vis," অথবা “স্থিতিস্থাপক সীমার মধ্যে পীড়ন বিকৃতির সমানুপাতিক।” এটাকে এভাবে চিন্তা করা যায়:
The force of the spring is directly proportional to the extension of the spring.
অন্যভাবে বলতে গেলে, যদি ববটিকে বেশি শক্তি দিয়ে টানা হয়, তাহলে বলও শক্তিশালী হবে; আর যদি ববটিকে কম শক্তি দিয়ে টানা হয়, তাহলে বলও কম হবে। গাণিতিকভাবে, সূত্রটি নিম্নরূপ:
F, start subscript, s, end subscript, p, r, i, n, g, equals, minus, k, times, x
  • k হল একটি ধ্রুবক এবং এটার মান বলকে পরিমাপ করে। স্প্রিংটি দৃঢ় নাকি স্থিতিস্থাপক?
  • x হল স্প্রিং এর বিকৃতি, যেমন বর্তমান এবং স্থির দৈর্ঘ্যের মধ্যে পার্থক্য। সাম্যাবস্থায় কোন স্প্রিং এর দৈর্ঘ্যকে স্থির দৈর্ঘ্য (rest length) বলা হয়।
আমরা জানি, বল একটি ভেক্টর রাশি, এজন্য মান ও দিক উভয়ই বের করতে হবে। প্রোগ্রামে চলক তৈরি করার জন্য আরেকবার স্প্রিং এর চিত্র দেখে নেই।
উপযুক্ত মান নিয়ে, উপরের চিত্রে দেওয়া নামগুলোর উপর ভিত্তি করে তিনটি চলক তৈরি করি।
var anchor = new PVector(100, 10);
var bob = new PVector(110, 100);
var restLength = 20;
প্রথমে, হুকের সূত্র ব্যবহার করে বলের মান বের করি। আমাদের k এবং x জানতে হবে। k বের করা সহজ; এটি একটি ধ্রুবক, তাই যে কোন উপযুক্ত মান বসিয়ে দেই।
var k = 0.1;
x বের করা একটু জটিল। আমাদের “বর্তমান এবং স্থির দৈর্ঘ্যের মধ্যকার পার্থক্য” বের করতে হবে। স্থির দৈর্ঘ্যকে restLength চলক দিয়ে প্রকাশ করা হয়। তাহলে বর্তমান দৈর্ঘ্য (current length) কি হবে? ঝুলন বিন্দু (anchor) থেকে বব পর্যন্ত দূরত্ব। আমরা কীভাবে এই দূরত্ব বের করবো? ঝুলন বিন্দু থেকে ববের দিকে নির্দেশ করে এমন ভেক্টরের মান দিয়ে কি এটা বের করা যায়? (লক্ষ্য করি আমরা মহাকর্ষীয় আকর্ষণের অংশে একইভাবে দূরত্ব হিসাব করেছিলাম।)
var dir = PVector.sub(bob, anchor);
var currentLength = dir.mag();
var x = currentLength - restLength;
আমরা বলের মান বের করার জন্য প্রয়োজনীয় চলকগুলো পেয়ে গেছি (-1 * k * x), এখন দিক বের করতে হবে, একটি একক ভেক্টর যা বলের দিক নির্দেশ করে। সুসংবাদ হল এই ভেক্টরটি আগে থেকেই আছে। এটা কি সঠিক? কিছুক্ষণ আগেই চিন্তা করছিলাম: “আমরা কীভাবে দূরত্ব বের করবো? তাহলে ঝুলন বিন্দু থেকে ববের দিক নির্দেশ করে এমন ভেক্টরের মান কি?” আসলে, এই ভেক্টরটিই হল বলের দিক নির্দেশ করে!
উপরের চিত্রে, যদি স্প্রিংটিকে স্থির দৈর্ঘ্যের চেয়ে বেশি প্রসারণ করা হয়, তাহলে এটিকে পূর্বাবস্থায় ফিরিয়ে আনার প্রয়াসে ঝুলন বিন্দুর দিকে একটি বল সৃষ্টি হবে। আর যদি স্থির দৈর্ঘ্যের চেয়ে বেশি সংকুচিত হয়, তাহলে বলটি ঝুলন বিন্দু থেকে প্রসারণের জন্য ক্রিয়া করবে। সূত্রে এই পরস্পর বিপরীতমুখী দিককে -1 দিয়ে কার্যকর করা হয়েছে। একারণে দূরত্ব হিসাব করার জন্য শুধুমাত্র PVector কে নরমালাইজ করতে হবে। কোডে PVector চলকের নাম পরিবর্তন করে “force (বল)” নাম দেই।
var k = 0.01;
var force = PVector.sub(bob, anchor);
var currentLength = force.mag();
var x = currentLength - restLength;
// Direction of spring force, a unit vector
force.normalize();
// Putting it together: direction and magnitude!
force.mult(-1 * k * x);
স্প্রিং বলের ভেক্টর হিসাব করার জন্য আমরা অ্যালগোরিদম তৈরি করেছি, এখন প্রশ্ন হল: কোন ধরনের অবজেক্ট-অরিয়েন্টেড প্রোগ্রামিং কাঠামো ব্যবহার করবো? আবারও, এটা এমন একটি বিষয় যার কোন “সঠিক” উত্তর নেই। অনেক উপায়েই এটা করা সম্ভব; কীভাবে অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং করা হবে তা মূলত প্রোগ্রামের লক্ষ্য এবং নিজের কোড করার ধরনের উপর নির্ভরশীল। কিন্তু, যেহেতু আমরা সবসময় Mover অবজেক্ট নিয়ে কাজ করেছি, এভাবেই কোড করি। ধরি, আমাদের Mover অবজেক্ট হল একটি স্প্রিং এর “বব”। ববকে পর্দায় গতিশীল করার জন্য ববের অবস্থান, বেগ এবং ত্বরণের ভেক্টর প্রয়োজন। দারুন—এগুলো আগে থেকেই আছে! আরও ধরি, ববটি applyForce() মেথড থেকে অভিকর্ষ বল অনুভব করে। শুধুমাত্র আরেকটি ধাপ—স্প্রিং এর বল প্রয়োগ করতে হবে:
var bob = new Bob();

draw = function()  {
  // Our “make-up-a-gravity force”
  var gravity = new PVector(0, 1);
  bob.applyForce(gravity);
  // We need to also calculate and apply a spring force!
  var spring = ????
  bob.applyForce(spring);

  // Our standard update() and display() methods
  bob.update();
  bob.display();
};
একটি উপায় হল স্প্রিং এর বলের সকল কোড মূল draw() লুপের মধ্যে লেখা। কিন্তু ভবিষ্যতের কথা চিন্তা করলে, যদি আমরা একাধিক বব এবং স্প্রিং সংযোগ তৈরি করতে চাই, সেক্ষেত্রে একটি অতিরিক্ত অবজেক্ট তৈরি করাই বুদ্ধিমানের কাজ, একটি Spring অবজেক্ট। উপরের চিত্রে, Bob অবজেক্টটি ববের গতির হিসাব রাখে; Spring অবজেক্ট স্প্রিং এর ঝুলন বিন্দু, স্থির দৈর্ঘ্য এবং ববের উপর প্রয়োগকৃত স্প্রিং এর বলের হিসাব রাখে
ফলশ্রুতিতে আমরা এই সুন্দর কোডটি লিখতে পারি:
var bob = new Bob();
var spring = new Spring();

draw = function()  {
  // Our “make-up-a-gravity force”
  var gravity = new PVector(0, 1);
  bob.applyForce(gravity);
  // Spring.connect() will take care of 
  // computing and applying the spring force
  spring.connect(bob);

  // Our standard update() and display() methods
  bob.update();
  bob.display();
};
লক্ষ্য করলে দেখা যায় যে, এই একই রকম কাজটি আমরা মহাকর্ষীয় আকর্ষণের অংশে একটি Attractor অবজেক্টের জন্য করেছিলাম। ওইখানে, আমরা এরকম কোড করেছিলাম:
var force = attractor.calculateAttraction(mover);
mover.applyForce(force);
একইভাবে স্প্রিং এর ক্ষেত্রে:
var force = spring.calculateForce(bob);
bob.applyForce(force);
যাই হোক, এই উদাহরণে, আমরা শুধু এটাই করেছি:
spring.connect(bob);
তাহলে কি হল? আমরা কেন ববে applyForce() ব্যবহার করছি না? অবশ্য, উত্তর হল, আমাদের ববে applyForce() কল করতে হবে। কোডটি শুধু draw() এ করার পরিবর্তে, আমরা উপযুক্ত একটি বিকল্প (এবং অনেক সময় বাঞ্ছনীয়) অনুসরণ করে connect() মেথড ব্যবহার করে ববে applyForce() কল করি।
Spring.prototype.connect(bob) {
  var force = /* কিছু মজার হিসাব */;
  bob.applyForce(force);
};
কিন্তু কেন Attractor অবজেক্টের জন্য একভাবে এবং Spring অবজেক্টের জন্য অন্যভাবে করলাম? প্রথম যখন আমরা বল সম্পর্কে শিখি, বলের সকল কোড মূল draw() লুপে লেখা সহজবোধ্য ছিল এবং আশা করা যায় এটা বল সঞ্চয়ন সম্পর্কে জানতে সহায়তা করেছে। এটাতে অভ্যস্ত হওয়ায়, এখন আমরা সাধারণ কিছু বৈশিষ্ট্য অবজেক্টের মধ্যে কোড করতে পারি।
নিচের প্রোগ্রামে এই সবগুলো কোড একসাথে করি। আমরা কয়েকটি নতুন বিষয় যোগ করেছি: (1) Bob অবজেক্টের মধ্যে মাউসের সব ফাংশন আছে যার সাহায্যে ববকে মাউস দিয়ে নাড়ানো যায় এবং (2) Spring অবজেক্টে দৈর্ঘ্যকে সর্বোচ্চ এবং সর্বনিম্ন সীমার মধ্যে সীমাবদ্ধ রাখার জন্য একটি ফাংশন আছে।

এই "প্রাকৃতিক সিমুলেশন" কোর্সটি নেওয়া হয়েছে Daniel Shiffman (ড্যানিয়েল শিফম্যান) এর লেখা "The Nature of Code" (কোডের প্রকৃতি) থেকে এবং এটি ক্রিয়েটিভ কমন্সের এট্রিবিউশন-নন কমার্শিয়াল 3.0 আনপোরটেড লাইসেন্সের অধিনস্ত।