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

۷-۱ بردار حرکت : سرعت

پیغام خطا

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 روشن شود. در اکثر مواقعی که یک ساختار داده جدید را یاد می گیریم این اتفاق می افتد. برای مثال، وقتی اولین بار آرایه ها را یاد گرفتیم، در ابتدا به نظر می رسد کار با آرایه ها سخت تر از نگه داری چند متغییر برای چیز های مختلف است. اما این موضوع به محض اینکه می خواهیم یک صد یا هزار یا ده ها هزار چیز را با هم نگه داری کنیم تغییر می کند. این موضوع در موردPVector هم درست است. چیزی که الان به نظر کاری بیهوده می آید در آینده منفعت خود را نشان خواهد داد، این منفعت ها آن بسیار لذت بخش است. زمان زیادی لازم نیست. شما مزیت آن را در فصل بعد خواهید دید.

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

ما این موضوع را در ابتدا با مثال ۱-۲ دیدیم: توپ متحرک.

یک شی در صفحه یک موقعیت دارد (موقعیتش در هر لحظه از زمان) همچنین یک سرعت دارد ( دستورالعملی که می گوید چطور در هر لحظه به وضعیت بعدی حرکت کند). سرعت با موقعیت جمع می شود:

 location.add(velocity); 


سپس ما شی را در یک موقعیت ترسیم می کنیم:

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


این حرکت ۱۰۱ است. ۱- موقعیت را با سرعت جمع می کنیم ۲- شی را در موقعیت ترسیم می کنیم در مثال توپ متحرک، تمام این اتفاقات در تب main در processing اتفاق افتاد، با تابع setup و draw. کاری که ما می خواهیم انجام دهیم این است که تمام منطق حرکت را به درون یک کلاس ببریم. به این شکل، ما می توانیم بنای حرکت اشیاء برای برنامه نویسی حرکت اشیاء را ایجاد کنیم. در بخش ۰-۲ مقدمه «کلاس گردشگر تصادفی» ما برنامه نویسی شی گرایی مقدماتی را در processing دیدیم(OOP). به خاطر آن توضیح کوتاه، این کتاب در نظر می گیرد که شما از آشنایی اولیه با کلاس ها و شی ها را processing برخوردار هستید. اگر نیاز است که این یادآوری انجام شود، پیشنهاد می کنیم که شی گرایی را در آموزش های processing بررسی کنید. در اینجا، ما میخواهیم یک کلاسی عمومی با نام Mover بسازیم که به ما اجازه جابه جایی چیز ها را در صفحه بدهد. حال باید دو سوال زیر را در نظر بگیریم: ۱- چه داده هایی کلاس mover دارد؟ ۲- چه توابع و عملکرد هایی این کلاس دارد؟ الگوریتم حرکت ۱۰۱ به ما می گوید جواب این دو سوال را می دهد. شی Mover دو بخش از داده ها را در بر می گیرد: موقعیت و سرعت، که هر دو شی های PVector هستند.

 class Mover {
 
  PVector location;
  PVector velocity; 


عملکردها ساده است. Mover نیاز دارد که حرکت ها دیده شوند. ما این نیاز ها را با توابع با نام های display و update پیاده سازی می کنیم. تمام کدهای منطق حرکت در update قرار دارند و ترسیم اشیاء در display قرار می گیرند.

 void update() {
    location.add(velocity);
  }
 
  void display() {
    stroke(0);
    fill(175);
    ellipse(location.x,location.y,16,16);
  }
 
} 


ما یک مورد مهم را فراموش کردیم، سازنده شی. سازنده یک تابع خاص درون کلاس است که نمونه ای از شی را می سازد. در اینجا ما تعریف می کنیم که چگونه یک شی آماده شود. تابع سازنده همیشه نامی یکسان با نام کلاس دارد و با عملگر new فراخوانی می شود:

 Mover m = new Mover(); 

در مورد ما، اجازه بدهید همینطوری تصمیم بگیریم که یک مکان اولیه تصادفی به سرعت تصادفی به شی Mover بدهیم.

 

  Mover() {
    location = new PVector(random(width),random(height));
    velocity = new PVector(random(-2,2),random(-2,2));
  } 


اگر برنامه نویسی شی گرا برای شما خیلی جدید باشد، یک چیزی ممکن است شما را گیج کند. بعد از این همه که ما زمان روی بحث و کار بر روی کلاس PVector گذاشتیم. کلاس PVector یک قالب برای شی های موقعیت و سرعت شد. حالا آنها درون یک کلاس دیگر یعنی Mover چه کار می کنند؟ در حقیقت، این موضوع یک کار عادی است که همیشه انجام می گیرد.به راحتی می توانیم بگوییم یک شی فقط یک چیزی است که داده ها را نگه میدارد(و تابع ها را). داده ها می توانند اعداد باشند(عدد صحیح،float، و غیره) یا شی های دیگر! ما این موضوع را بارها و بار ها در جاهای دیگر خواهیم دید. برای مثال در فصل ۴ ما یک کلاس برای توضیح یک سیستم ذرات خواهیم نوشت. شی ParticleSystem در بردارنده لیست از داده ها و شی های ذرات است... و هر شی ذره دربردارنده داده هایی از چند شی PVector است. اجازه بدهید که کلاس Mover را بانوشتن تابعی برای تشخیص لبه پنجره و اینکه وقتی به لبه پنجره رسید چه کار کند به پایان برسانیم. برای حالا اجازه بدهید کار را ساده کنیم، تنها میگویم که از صفحه خارج نشو.

 

 void checkEdges() {
 
    if (location.x > width) {
      location.x = 0;
    } else if (location.x < 0) {
      location.x = width;
    }
 
    if (location.y > height) {
      location.y = 0;
    } else if (location.y < 0) {
      location.y = height;
    }
   } 


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

 

 Mover mover;

سپس آن را با setup مقدار دهی اولیه کرده ایم:

 

 mover = new Mover();

و سپس تابع های لازم را در تابع draw صدا زده ایم:

 mover.update();
mover.checkEdges();
mover.display();

اینجا پیاده سازی عملی مثال آمده است:

مثال ۱-۷ حرکت ۱۰۱ (سرعت)

 Mover mover;
 
void setup() {
  size(640,360);
  mover = new Mover();
}
 
void draw() {
  background(255);
 
  mover.update();
  mover.checkEdges();
  mover.display();
}
 
class Mover {
 
  PVector location;
  PVector velocity;
 
  Mover() {
    location = new PVector(random(width),random(height));
    velocity = new PVector(random(-2,2),random(-2,2));
  }
 
  void update() {
    location.add(velocity);
  }
 
  void display() {
    stroke(0);
    fill(175);
    ellipse(location.x,location.y,16,16);
  }
 
  void checkEdges() {
    if (location.x > width) {
      location.x = 0;
    } else if (location.x < 0) {
      location.x = width;
    }
 
    if (location.y > height) {
      location.y = 0;
    } else if (location.y < 0) {
      location.y = height;
    }
  }
}

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