মূল বিষয়বস্তু
কম্পিউটার প্রোগ্রামিং
Course: কম্পিউটার প্রোগ্রামিং > Unit 5
Lesson 4: ভেক্টর- ভেক্টর সম্পর্কে প্রাথমিক ধারণা
- চ্যালেঞ্জ: ভেক্টর চলা
- ভেক্টর সম্পর্কিত গাণিতিক সমস্যা
- চ্যালেঞ্জ: লাইটসেবার
- ভেক্টর বিস্তার এবং নরমালাইজেশন
- চ্যালেঞ্জ: মান দৃষ্টিগোচর করা
- ভেক্টর গতি
- চ্যালেঞ্জ: ব্রেক করা গাড়ি
- স্ট্যাটিক ফাংশন বনাম উদাহরণস্বরূপ পদ্ধতি
- চ্যালেঞ্জ: স্ট্যাটিক (static) ফাংশন
- ইন্টার্যাক্টিভ ভেক্টর গতি
- চ্যালেঞ্জ: মাউস অনুসরণকারী
- প্রকল্প: কম্পিউটেশোনাল প্রাণি
© 2023 Khan Academyব্যবহারের শর্তাদিগোপনীয়তার নীতিমালাকুকি নোটিশ
স্ট্যাটিক ফাংশন বনাম উদাহরণস্বরূপ পদ্ধতি
অ্যালগোরিদম #3 করার আগে (মাউসের দিকে ত্বরান্বিত করা), আমরা ভেক্টর এবং
PVector
অবজেক্টের একটি বিশেষ অংশ দেখবো: স্থির (static) ফাংশন এবং অস্তিত্ব তথা ইন্সট্যান্স (instance) মেথডের মধ্যকার পার্থক্য।ভেক্টরকে উপেক্ষা করে, নিচের কোড দেখি:
var x = 0;
var y = 5;
x = x + y;
খুব সহজ, তাই না?
x
এর মান হল 0, আমরা y
কে যোগ করি এবং এখন x
এর মান হল 5। আমরা PVector
এর উপর ভিত্তি করে খুব সহজেই এটার সাথে সঙ্গতিপূর্ণ কোড করতে পারি।var v = new PVector(0,0);
var u = new PVector(4,5);
v.add(u);
ভেক্টর v এর মান হল (0,0), এটার সাথে u যোগ করি এবং এখন v এর মান হল (4,5)। সহজ, তাই না?
গণিতের আরও কিছু সাধারণ উদাহরণ দেখি:
var x = 0;
var y = 5;
var z = x + y;
x
এর মান হল 0, আমরা তার সাথে y
যোগ করি এবং ফলাফলটি একটি নতুন চলক z
এ সংরক্ষণ করি। এই উদাহরণে x
এবং y এর মান অপরিবর্তিত থাকে! এই গাণিতিক প্রক্রিয়াকে খুবই সাধারণ এবং তুচ্ছ একটি বিষয় বলে মনে হতে পারে। কিন্তু, PVector
এ, এই গাণিতিক প্রক্রিয়াটি এতটা সহজ নয়। ব্যাপারটি স্পষ্টভাবে বোঝার জন্য কোড করি।var v = new PVector(0,0);
var u = new PVector(4,5);
var w = v.add(u); // এটা কিন্তু সঠিক নয়!!!
উপরের কোডটি সঠিক বলে মনে হচ্ছে, কিন্তু
PVector
অবজেক্ট এভাবে কাজ করে না। add()
সংজ্ঞাটি দেখা যাক...PVector.prototype.add = function(v) {
this.x = this.x + v.x;
this.y = this.y + v.y;
};
...আমরা এখন বুঝতেই পারছি যে এই কোড দিয়ে কাজ হবে না। প্রথমত, এটা নতুন
PVector
কে রিটার্ন করে না (কোন return
স্টেটমেন্ট নেই) এবং দ্বিতীয়ত, এটা PVector
কে কল করার সময় এর মান পরিবর্তন করে। দুইটি PVector
অবজেক্ট যোগ করে ফলাফল হিসেবে একটি নতুন PVector
কে রিটার্ন করার জন্য অবশ্যই "স্থির" add()
ফাংশন ব্যবহার করতে হবে।একটি "স্থির" ফাংশন হল এমন একটি ফাংশন যা অবজেক্টের উপর সংজ্ঞায়িত হয়, কিন্তু এটা অবজেক্টের বৈশিষ্ট্য পরিবর্তন করে না। কিন্তু কেন অবজেক্টের উপর সংজ্ঞায়িত করবো? আসলে, এটাকে অবজেক্টের সাথে কিছু করতে হবে, এজন্য এটাকে অবজেক্টের সাথে যুক্ত করাই যুক্তিসংগত। এটা একটি অবজেক্টে namespace (নেমস্পেস) এর মত ব্যবহার করা হয়। উদাহরণস্বরূপ,
PVector
এর সকল স্থির ফাংশন অবশ্যই এতে পাঠিয়ে দেওয়া PVector
অবজেক্ট নিয়ে কোন না কোন কাজ করে এবং সবসময় কোন না কোন মান রিটার্ন করে। আমরা এই ফাংশনগুলোকে সার্বজনীনভাবে সংজ্ঞায়িত করতে পারি, কিন্তু এইভাবে করলে, আমরা সার্বজনীন ফাংশনকে এড়িয়ে চলতে পারি এবং এটার জন্য শ্রেণিকরণে সুবিধা হয়।তুলনা করে দেখা যাক। এখানে আমরা
add()
এর ইন্সট্যান্স মেথডটি ব্যবহার করি:v.add(u);
এই কোডটি
v
কে পরিবর্তন করবে, তাই রিটার্ন করা মান সংরক্ষণ করতে হবে না। পক্ষান্তরে, এইভাবে আমরা add()
এর স্থির ফাংশনটি ব্যবহার করবো:var w = PVector.add(v, u);
এক্ষেত্রে যদি আমরা ফাংশনটির ফলাফল সংরক্ষণ না করি, তাহলে উপরের কোডের কোন মূল্য থাকবে না, কারণ স্থির ফাংশন অবজেক্টকে পরিবর্তন করে না।
PVector
এর স্থির ফাংশন দিয়ে আমরা PVectors
এর দেওয়া মানগুলো অপরিবর্তিত রেখে, সাধারণ গাণিতিক প্রক্রিয়াগুলো PVector
অবজেক্টে প্রয়োগ করতে পারি।এভাবে স্থির ফাংশনের
add()
কোড করা হয়:PVector.add = function(v1, v2) {
var v3 = new PVector(v1.x + v2.x, v1.y + v2.y);
return v3;
};
এখানে কয়েকটি পার্থক্য আছে:
- আমরা সরাসরি অবজেক্টের উপর ফাংশন সংজ্ঞায়িত করি, এটার প্রোটোটাইপে নয়
- ফাংশনের মধ্যে কখনই
this
ব্যবহার করা হয় না - ফাংশন থেকে একটি মান রিটার্ন করা হয়
PVector অবজেক্টের
add()
, sub()
, mult()
এবং div()
এর স্থির ফাংশন আছে। এটার আরও স্থির ফাংশন আছে যা ইন্সট্যান্স মেথডে নেই, যেমন angleBetween()
, dot()
এবং cross()
। আমরা PVector
দিয়ে আরও প্রোগ্রাম তৈরি করার সময় এসকল ফাংশনের ব্যবহার দেখবো।এই "প্রাকৃতিক সিমুলেশন" কোর্সটি নেওয়া হয়েছে Daniel Shiffman (ড্যানিয়েল শিফম্যান) এর লেখা "The Nature of Code" (কোডের প্রকৃতি) থেকে এবং এটি ক্রিয়েটিভ কমন্সের এট্রিবিউশন-নন কমার্শিয়াল 3.0 আনপোরটেড লাইসেন্সের অধিনস্ত।
আলোচনায় অংশ নিতে চাও?
কোন আলাপচারিতা নেই।