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

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

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

কম্পিউটার প্রোগ্রামিং

ভেক্টর সম্পর্কে প্রাথমিক ধারণা

এই কোর্সে আমরা চারপাশের বিশ্বকে অনুকরণ করে কোড করার চেষ্টা করবো। আমরা পদার্থ বিজ্ঞানের মৌলিক বিষয়গুলো দেখবো যেমন—কীভাবে একটি আপেল গাছ থেকে পড়ে, কীভাবে একটি সরল দোলক কাজ করে, কীভাবে পৃথিবী সূর্যকে প্রদক্ষিণ করে, ইত্যাদি। আমাদের আলোচনার ক্ষেত্রে ,গতি প্রোগ্রামিং করার সবচেয়ে মৌলিক বিষয়— ভেক্টর ব্যবহার করা লাগবে। এখন শুরু করা যাক।
ভেক্টর শব্দটির অনেক অর্থ থাকতে পারে। 1980 সালে ক্যালিফোর্নিয়ার সাক্রামেন্টোতে শুরু করা একটি রক ব্যান্ডের নাম ভেক্টর। ক্যানাডাতে কেলোগের তৈরি করা একটি সিরিয়ালের নামও ভেক্টর। মহামারী রোগবিস্তার সংক্রান্ত বিজ্ঞানে, একটি রোগ সংক্রমণকারী জীব হল ভেক্টর। C++ প্রোগ্রামিং ভাষায়, ভেক্টর হল (std::vector) পরিবর্তনশীল অ্যারে। যদিও সংজ্ঞাগুলো বেশ তথ্যবহুল, কিন্তু আমরা এসব খুঁজছি না। আমরা খুঁজছি একটি ইউক্লিডীয় ভেক্টর ( গ্রিক গণিতবিদ ইউক্লিডের নামানুসারে এবং জ্যামিতিক ভেক্টর নামেও পরিচিত)। যখন এই কোর্সে “ভেক্টর” লেখা থাকবে, ধরে নিতে হবে এটি একটি ইউক্লিডীয় ভেক্টর, এর সংজ্ঞা: একটি রাশি যার মান ও দিক উভয়ই আছে
একটি ভেক্টরকে তীর চিহ্ন দিয়ে প্রকাশ করা হয়; তীর চিহ্নটি দিক এবং এটির দৈর্ঘ্য মান নির্দেশ করে।
একটি ভেক্টরের মান ও দিকের চিত্র
চিত্র 1.1: মান (তীরের দৈর্ঘ্য) এবং দিক (তীরের অভিমুখ) সহ একটি ভেক্টর (তীর চিহ্ন)।
উপরের চিত্রে, A বিন্দু থেকে B বিন্দু পর্যন্ত একটি ভেক্টর আঁকানো আছে যা A থেকে B তে যাওয়ার মান ও দিক নির্দেশ করে।

কেন ভেক্টর ব্যবহার করবো?

ভেক্টর সম্পর্কে আরও জানার আগে, আমরা ভেক্টর নিয়ে কেন কাজ করছি তা জানার জন্য একটি সাধারণ প্রোগ্রাম দেখি। খান একাডেমির জাভাস্ক্রিপ্টের পরিচিতি কোর্সটি যদি করা হয়ে থাকে, তাহলে অবশ্যই বলের খেলা প্রোগ্রামটি সম্পর্কে জ্ঞান আছে।
উপরের উদাহরণে, একটি সাধারণ দৃশ্য আছে—গোলাকৃতি (একটি “বল”) সহ একটি খালি ক্যানভাস। এই বলের কিছু বৈশিষ্ট্য কোডের চলকে প্রকাশ করা হয়েছে।
PositionVelocity
x and yxSpeed and ySpeed
আরেকটু উন্নত প্রোগ্রামে, আমরা অন্যান্য চলক নিতে পারি:
AccelerationTarget positionWindFriction
xacceleration and yaccelerationxtarget and ytargetxwind and ywindxfriction and yfriction
It’s becoming clearer that for every concept in this world (wind, position, acceleration, etc.), we’ll need two variables. And this is only a two-dimensional world. In a 3D world, we’ll need x, y, z, xSpeed, ySpeed, zSpeed, and so on.
আরও কম চলক ব্যবহার করতে পারলে কি ভালো হয়?
এটির পরিবর্তে:
var x = 5;
var y = 10;
var xSpeed;
var ySpeed;
আমরা শুধু দুইটি চলক নিতে পারি, যেখানে প্রতিটি চলক ভেক্টরের মত দ্বিমাত্রিক তথ্য ধারণ করতে পারে:
var position;
var speed;
প্রথমেই ভেক্টর ব্যবহার করে আমরা নতুন কিছু তৈরি করতে পারবো না। এছাড়াও শুধু ভেক্টর চলক ব্যবহার করলেই আমাদের প্রোগ্রাম পদার্থের সূত্রগুলো মানবে না। আসলে, চলকগুলো কোডকে সহজ করবে এবং বার বার ব্যবহার করা গাণিতিক সূত্রগুলো কোডে প্রয়োগের জন্য ফাংশন তৈরিতে সহায়তা করবে।
ভেক্টর পরিচিতির জন্য, আমরা দ্বিমাত্রিক জগৎ নিয়েই কাজ করবো। সবগুলো উদাহরণই ত্রিমাত্রিক জগতে করা সম্ভব (এবং আমরা যে অবজেক্টটি ব্যবহার করবো—PVector—সেটিও ত্রিমাত্রিকের জন্য প্রযোজ্য।) কিন্তু, দ্বিমাত্রিক নিয়ে শুরু করা অনেক সহজ।

PVector নিয়ে প্রোগ্রামিং

ভেক্টর হল দুইটি বিন্দুর মধ্যবর্তী পার্থক্য। ব্যাপারটি হল একজনকে এক বিন্দু থেকে অপর বিন্দুতে যেতে নির্দেশ দেওয়ার মতই।
এখানে কিছু ভেক্টর এবং তাদের সম্ভাব্য স্থানান্তর (translation) দেখানো হল: 
ভেক্টরের চিত্র
চিত্র 1.2
| (-15, 3) | পনেরো ধাপ পশ্চিমদিকে গিয়ে; ঘুরে উত্তরদিকে তিন ধাপ। | | (3, 4) | তিন ধাপ পূর্বদিকে গিয়ে; ঘুরে উত্তর দিকে চার ধাপ। | | (2, -1) | দুই ধাপ পূর্বদিকে গিয়ে; ঘুরে দক্ষিণ দিকে এক ধাপ। |
গতি প্রোগ্রামিং করার সময় এমনটি করা হয়েছিল। অ্যানিমেশনের প্রতিটি ফ্রেমের জন্য (যেমন: ProcessingJS এর draw() এর একবার লুপ), পর্দার প্রতিটি বস্তুকে অনুভূমিক (horizontally) এবং উল্লম্ব (vertically) বরাবর কয়েক পিক্সেল সরে যেতে বলা হয়।
ভেক্টর দিয়ে নতুন অবস্থান অনুমানের চিত্র
চিত্র 1.3
প্রতিটি ফ্রেমের জন্য:
new position = velocity applied to current position
If velocity is a vector (the difference between two points), what is position? Is it a vector too? Technically, one might argue that position is not a vector, since it’s not describing how to move from one point to another—it’s simply describing a singular point in space.
Nevertheless, another way to describe a position is the path taken from the origin to reach that position. That means a position can be the vector representing the difference between position and origin.
অবস্থান ভেক্টরের চিত্র
চিত্র 1.4
Let’s examine the underlying data for both position and velocity. In the bouncing ball example, we had the following:
PositionVelocity
x and yxSpeed and ySpeed
আমরা উভয়ের জন্য একই উপাত্ত রাখছি—দুটি ফ্লোটিং পয়েন্ট সংখ্যা, একটি x এবং একটি y। আমরা যদি নিজেরাই একটি ভেক্টর ক্লাস কোড করতাম, তাহলে আমরা একেবারে মৌলিক কোডিং করে শুরু করতাম:
var Vector = function(x, y) {
    this.x = x;
    this.y = y;
};
আসলে এটির মূলে, একটি PVector আছে যাতে দুইটি মান সংরক্ষণ করা সহজ (অথবা তিনটি, ত্রিমাত্রিকের উদাহরণে দেখবো)।
এবং এই কোডটি …
var x = 100;
var y = 100;
var xSpeed = 1;
var ySpeed = 3.3;
এমন হয়ে যায় …
var position = new PVector(100,100);
var velocity = new PVector(1,3.3);
Now that we have two vector objects (position and velocity), we’re ready to implement the algorithm for motion—position = position + velocity. In Example 1.1, without vectors, we had:
x = x + xSpeed;
y = y + ySpeed;
একটি আদর্শ জগতের ক্ষেত্রে, আমরা উপরের কোডটি এমনভাবে লিখতাম:
position = position + velocity;
কিন্তু জাভাস্ক্রিপ্টে, যোগ চিহ্নটি + শুধুমাত্র মৌলিক মানের জন্য বরাদ্দ (সংখ্যা, স্ট্রিং)। কিছু প্রোগ্রামিং ভাষায়, চিহ্নগুলো "ওভারলোড" করা যায়, কিন্তু জাভাস্ক্রিপ্টে যায় না। সৌভাগ্যক্রমে, PVector অবজেক্টে সাধারণ গাণিতিক সূত্রগুলো আছে, যেমন add()

ভেক্টর যোগ

PVector অবজেক্ট এবং এর add() মেথড দেখার আগে, গণিত এবং পদার্থ বই অনুযায়ী ভেক্টর যোগ করা দেখি।
ভেক্টরকে গাড় অক্ষরে অথবা উপরে তীর চিহ্ন দিয়ে বোঝানো হয়। এই অনুশীলনীর জন্য, একটি ভেক্টর রাশিকে স্কেলার (স্কেলার একক মানের রাশি, যেমন পূর্ণসংখ্যা অথবা ফ্লোটিং পয়েন্ট সংখ্যা) থেকে আলাদা করার জন্য, আমরা তীর চিহ্ন ব্যবহার করবো:
  • Vector: u
  • Scalar: x
ধরি, নিচের দুইটি ভেক্টর আছে:
দুটি ভেক্টরের চিত্র
চিত্র 1. 5
প্রতিটি ভেক্টরের দুইটি মান আছে, একটি x এবং একটি y। দুইটি ভেক্টর যোগ করার জন্য, আমরা দুইটি কে সাধারণভাবে উভয় x এবং উভয় y কে যোগ করি। 
চিত্র 1.6
অন্যভাবে নিচের কোডকে:
w=u+v
এটাকে এভাবে লেখা যায়:
wx=ux+vxwy=uy+vy
তারপর, চিত্র 1.6 থেকে u এবং v এর মান বসিয়ে, আমরা পাই:
wx=5+3wy=2+4
যার মানে হল:
wx=8wy=6
অবশেষে, আমরা একটি ভেক্টর লিখতে পারি:
w=(8,6)
এটি দেখে আমরা বুঝতে পারি যে কীভাবে ভেক্টর যোগ করা হয়, এখন দেখবো কীভাবে PVector অবজেক্টে ভেক্টর যোগ করা হয়। add() নামে একটি মেথড লেখি যেটা এর আর্গুমেন্ট হিসেবে আরেকটা PVector অবজেক্টকে নেয় এবং x এবং y কে যোগ করে।
var Vector = function(x, y) {
    this.x = x;
    this.y = y;
};

Vector.prototype.add = function(v) {
  this.y = this.y + v.y;
  this.x = this.x + v.x;
};
Now that we see how add() is written inside of PVector, we can return to our bouncing ball example with its position + velocity algorithm and implement vector addition:
position.add(velocity);
এখন আমরা PVector অবজেক্ট দিয়ে বলের খেলা উদাহরণটি পুনরায় কোড করতে প্রস্তুত! কোডটি দেখলেই আগের উদাহরণের সাথে পার্থক্য বোঝা যায়।
We should note an important aspect of the above transition to programming with vectors. Even though we are using PVector objects to describe two values—the x and y of position and the x and y of velocity—we still often need to refer to the x and y components of each PVector individually. When we go to draw an object in ProcessingJS, we can't code it like this:
ellipse(position, 16, 16);
ellipse() ফাংশনে আর্গুমেন্ট হিসেবে PVector ব্যবহার করা যায় না। একটি ellipse (উপবৃত্ত) শুধুমাত্র দুইটি স্কেলার রাশি দিয়ে আঁকা যায়, একটি x-স্থানাঙ্ক এবং একটি y-স্থানাঙ্ক। একারণেই আমাদের PVector অবজেক্টের মধ্যে গিয়ে x এবং y কে নেওয়ার জন্য অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং এর বিন্দু প্রতীক ব্যবহার করা হয়:
ellipse(position.x, position.y, 16, 16);
The same issue arises when testing if the circle has reached the edge of the window, and we need to access the individual components of both vectors: position and velocity.
if ((position.x > width) || (position.x < 0)) {
  velocity.x = velocity.x * -1;
}
Now, you might feel somewhat disappointed. After all, this change to using vectors may initially appear to have made the code more complicated than the original version. While this is a perfectly reasonable and valid critique, it’s important to understand that we haven’t fully realized the power of programming with vectors just yet. Looking at a simple bouncing ball and only implementing vector addition is just the first step.
As we move forward into a more complex world of multiple objects and multiple forces (which we’ll introduce soon), the benefits of PVector will become more apparent. Keep going!

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

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

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