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

۵-۲ ایجاد نیرو ها

پیغام خطا

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).

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

در این فصل، ما به شیوه ساخت نیرو ها در دنیای processing خواهیم پرداخت.

۱- ساخت یک نیرو! گذشته از این حرف ها، شما برنامه نویس هستید، دنیای خود را می سازید، دلیلی ندارد که نتوانیم که یک نیرو بدون هیچ منبعی و با قواعد خودمان بسازیم و آن را به اشیاء اعمال کنیم.

۲- شبیه سازی یک نیرو! بله، نیرو ها در دنیای واقعی وجود دارند، کتاب های فیزیک شامل فرمول هایی برای این نیرو ها هستند. ما می توانیم این فرمول ها را برداریم و به کد های برنامه نویسی ترجمه کنیم و نیرو های دنیای واقعی را در Processing شبیه سازی کنیم.

راحت ترین راه ساخت یک نیرو این است که یک عدد را انتخاب کنیم. اجازه بدهید به ایده شبیه سازی باد برگردیم. یک نیروی باید مستقیم و خیلی ضعیف داشته باشیم چطور است؟ یک شی Mover با نام m را در نظر بگیرید، کد ما شبیه زیر می شود:

 PVector wind = new PVector(0.01,0);
 m.applyForce(wind); 

نتیجه خیلی جالب نیست، اما برای شروع خوب است. ما یک شی Pvector ساختیم، آنرا مقدار دهی اولیه کرده ایم، و آن را به شی فرستادیم( که آن را به شتابی اکنون دارد اضافه و اعمال می کند) اگر بخواهیم که دو نیرو داشته باشیم، شاید باد و گرانش( یک مقدار قوی تر به سمت پایین) ممکن است به این شکل باشد:

 

مثال ۲-۱ نیرو ها

 PVector wind = new PVector(0.01,0);
  PVector gravity = new PVector(0,0.1);
  m.applyForce(wind);
  m.applyForce(gravity); 

حالا ما دو نیرو داریم، با مسیرها و مقادیر متفاوت، هر دو به شی m اعمال شده اند. داریم به یک جاهایی می رسیم. حالا ما می خواهیم یک دنیا برای اشیاء مان در Processing بسازیم، یک محیط که واقعا بتواند پاسخ دهد.

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

این تمام کلاس Mover ما است که تا کنون ساختیم. توجه کنید که این همان کلاس Mover در فصل یک است بعلاوه جرم و تابع applyForce.

 class Mover {
 
  PVector location;
  PVector velocity;
  PVector acceleration;
  float mass;
 
  Mover() {
    mass = 1;
    location = new PVector(30,30);
    velocity = new PVector(0,0);
    acceleration = new PVector(0,0);
  }
 
  void applyForce(PVector force) {
    PVector f = PVector.div(force,mass);
    acceleration.add(f);
  }
 
  void update() {
    velocity.add(acceleration);
    location.add(velocity);
    acceleration.mult(0);
  }
 
  void display() {
    stroke(0);
    fill(175);
    ellipse(location.x,location.y,mass*16,mass*16);
  }
 
  void checkEdges() {
    if (location.x > width) {
      location.x = width;
      velocity.x *= -1;
    } else if (location.x < 0) {
      velocity.x *= -1;
      location.x = 0;
    }
 
    if (location.y > height) {
      velocity.y *= -1;
      location.y = height;
    }
  }
} 

حالا که کلاس ما آماده شد، ما می توانیم بگوییم یک صد شی Mover در یک آرایه بساز.

 Mover[] movers = new Mover[100]; 

و حالا ما می توانیم همه این شی های Mover را در setup با یک حلقه مقدار دهی اولیه کنیم.

 void setup() {
  for (int i = 0; i < movers.length; i++) {
    movers[i] = new Mover();
  }
} 

اما حالا ما یک مشکل کوچک داریم. اگر ما به سازنده های شی Mover مراجعه کنیم...

 Mover() {
    mass = 1;
    location = new PVector(30,30);
    velocity = new PVector(0,0);
    acceleration = new PVector(0,0);
  } 

ما کشف کردیم که هر شی Mover دقیقا به یک شی ساخته شده است. ما می خواهیم که که شی های Mover ما با جرم ها و در موقعیت های مختلف ساخته شود. اینجاست که با افزودن آرگومان ها به سازنده کلاس را کامل می کنیم.

 Mover(float m, float x , float y) {
    mass = m;
    location = new PVector(x,y);
    velocity = new PVector(0,0);
    acceleration = new PVector(0,0);
  } 

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

 Mover m1 = new Mover(10,0,height/2);
Mover m1 = new Mover(0.1,width,height/2); 

با یک آرایه، ما می توانیم همه اشیاء را در یک حلقه مقدار دهی کنیم.

 void setup() {
  for (int i = 0; i < movers.length; i++) {
    movers[i] = new Mover(random(0.1,5),0,0);
  }
} 

برای هر شی متحرک که ما ساختیم، جرم یک مقدار تصادفی بین ۰,۱ و ۵ است . موقعیت شروع x بر روی صفر تنظیم شده است، و موقعیت شروع y نیز صفر است.البته راههای زیادی برای مقدار دهی به اشیاء وجود دارد، این تنها نمونه ای از راههای ممکن است.

به محض اینکه اشياء تعریف شدند، ساخته و مقدار دهی شده اند، تمام کد ساده است. هر شی به حرکت در میاید نیرو های محیطی به آن اعمال می شود و شما می توانید از این نمایش لذت ببرید.

 void draw() {
  background(255);
 
  PVector wind = new PVector(0.01,0);
  PVector gravity = new PVector(0,0.1);
 
  for (int i = 0; i < movers.length; i++) {
    movers[i].applyForce(wind);
    movers[i].applyForce(gravity);
    movers[i].update();
    movers[i].display();
    movers[i].checkEdges();
  }
} 

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

تمرین ۲-۳

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

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