شما اینجا هستید

۳-۱ جمع بردار

پیغام خطا

Deprecated function: The each() function is deprecated. This message will be suppressed on further calls در book_prev() (خط 775 در /home/molavy/public_html/modules/book/book.module).

قبل از ادامه کار بر روی کلاس PVector و افزودن تابع add (تنها به خاطر اینکه یاد بگیریم، چون پروسسینگ خودش آن را از قبل برای ما پیاده سازی کرده است)، اجازه بدهید جمع بردار را با استفاده از نکاتی که در کتابهای ریاضی و فیزیک یادگرفته ایم امتحان کنیم.

برای متمایز شدن مقادیر برداری از اسکالر(عدد ساده که تنها نشان دهنده یک مقدار است ، مثل عدد صحیح و عدد ممیز شناور) معمولا آنها را با یک علامت بردار کوچک در بالای آن و یا به صورت درشتتر می نویسند.ما از نشان بردار استفاده می کنیم:


 

Vector: u⃗

Scalar:x


 

بیایید بگویم ما دو بردار زیر را داریم:

 

تصویر ۱-۵

هر بردار دو جزء دارد، یک x و یک y. برای جمع دو بردار با هم، ما تنها کافی است که x ها را با هم و y ها را با هم جمع کنیم.

 

تصویر ۱-۶

به بیان دیگر:

w⃗ =u⃗ + v⃗


می تواند بدین شکل نیز نوشته شود:

wx=ux+vx
wy=uy+vy

بنابراین، با جایگزینی u و v با مقادیر آنها که در تصویر ۱-۶ نشان داده شده است، ما داریم:

wx=5+3
wy=2+4

که به معنای:

wx=8 wy=6

در انتها آن را به صورت برداری می نویسیم:

w⃗ =(8,6)

حالا که ما فهمیدم چگونه دو بردار را با هم جمع کنیم، می توانیم آنرا در کلاس PVector پیاده سازی کنیم.

اجازه دهید یک تابع با نام add بسازیم و یک شی PVector دیگر به عنوان آرگومان به عنوان ورودی به آن بدهیم.

 class PVector {
 
  float x;
  float y;
 
  PVector(float x_, float y_) {
    x = x_;
    y = y_;
  }
 
  void add(PVector v) {
    y = y + v.y;
    x = x + v.x;
  }
} 

حال که ما می بینیم چگونه تابع add درون کلاس PVector نوشته شده است، ما می توانیم مثال توپ جهنده را با افزودن الگوریتم موقعیت فعلی+ سرعت و جمع برداری پیاده سازی کنیم:

location = location + velocity;
location.add(velocity);

 

در اینجا ما آماده ایم تا مثال توپ جهنده را با استفاده از PVector پیاده سازی کنیم.

مثال ۱-۲ توپ جهنده با استفاده از PVector

 PVector location;
PVector velocity;
 
void setup() {
  size(640,360);
  location = new PVector(100,100);
  velocity = new PVector(2.5,5);
}
 
void draw() {
  background(255);
 
  location.add(velocity);
  if ((location.x > width) || (location.x < 0)) {
    velocity.x = velocity.x * -1;
  }
  if ((location.y > height) || (location.y < 0)) {
    velocity.y = velocity.y * -1;
  }
 
  stroke(0);
  fill(175);
  ellipse(location.x,location.y,16,16);
}
 

در اینجا، شما ممکن است کمی مایوس شوید. بعد از این همه کار، به نظر می رسد تنها کاری کردیم که کد ها پیچیده تر از آنچه ابتدا بود شد. اگرچه این انتقاد کاملا وارد است، بهتر است بدانیم که ما هنوز قدرت برنامه نویسی با استفاده از بردار ها را نفهمیده ایم.

نگاه به برنامه ساده توپ متحرک و پیاده سازی جمع بردار ها تازه قدم اول است. در ادامه، وقتی به جهان پیچیده با چندین شی و نیرو های مختلف مواجه شویم(نیرو ها و در فصل دو معرفی می شوند)، مزیت استفاده از PVector واضح تر می شوند.

البته، به مزیت اصلی استفاده از بردار ها توجه کنیم، اگرچه ما از دو شی PVector برای تشریح دو مقدار استفاده کرده ایم-- مقدار x و y برای موقعیت و مقدار x و y برای سرعت-- ما هنوز نیاز به مراجعه به خود x و y در هر PVector به صورت مجزا داریم. وقتی می خواهیم یک شی را در Processing ترسیم کنیم، معنی ندارد که بگویم:

ellipse(location,16,16);

تابع ecllipse شی PVector را به عنوان آرگومان نمی گیرد. یک بیضی تنها با استفاده از دو مقدار عددی برای موقعیت های x و y ترسیم میشود، بنابراین ما برای اینکه بتوانیم از شی PVector استفاده کنیم و مقدایر x و y را از آن بگیریم از نحوی در شی گرایی به نام نقطه استفاده می کنیم

ellipse(location.x,location.y,16,16);

 

همین اتفاق در هنگام ترسیم دایره وقتی به لبه پنجره رسیده است اتفاق می افتد، و ما نیاز داریم به اجزاء هر دو بردار موقعیت و سرعت به صورت مجزا دسترسی داشته باشیم.

 if ((location.x > width) || (location.x < 0)) {
  velocity.x = velocity.x * -1;
} 

تمرین ۱-۱
یک چیزی را که قبلا با استفاده از x و y  جداگانه در processing ترسیم کرده اید بیابید و به جای آن از PVector ها برای ترسیم آن استفاده کنید.
تمرین ‍‍۱-۲
یکی از مثال های گردشگر تصادفی از بخش قبل را انتخاب کنید و آن را با PVector ها پیاده سازی کنید.
تمرین ۱-۳
مثال توپ جهنده با بردارها را به فضای سه بعدی ببرید. شما می توانید حرکت یک گوی دوره یک جعبه را پیاده سازی کنید.

دیدگاه جدیدی بگذارید