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

۴-۲ اولین برخورد با جرم

پیغام خطا

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

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

 F⃗ =M×A⃗

نه این شکل که ما در قسمت قبل برای ساده کردن کار داشتم:

A⃗ =F⃗

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

در ابتدا نیاز است که جرم را اضافه کنیم.

 class Mover {
  PVector location;
  PVector velocity;
  PVector acceleration;
  float mass; 

واحد های اندازه گیری

حالا که جرم را معرفی کردیم، مهم است که سریع چند نکته را درباره اندازگیری بگوییم. ما می گوییم که دو شی ۳ متر فاصله دارند، توپ بیس بال با نرخ سرعت ۹۰ مایل در ساعت حرکت می کند، یا این توپ بولینگ دارای جرم ۶ کیلوگرم است. همانطور که بعدا در این کتاب خواهیم دید، گاهی ما می خواهیم مقایس ها در دنیای واقعی را در نظر بگیریم. اگرچه، در این فصل، در اغلب موارد این موضوع را نادیده میگیریم. واحد های اندازه گیری های ما با مقیاس پیکسل محاسبه می شوند( این دو دایره ۱۰۰ پیکسل فاصله دارند)، و همچنین فریم های انیمیشن(این توپ با نرخ سرعت دو پیکسل در هر فریم حرکت می کند). در مورد جرم، هیچ واحد اندازه گیری برای ما وجود ندارد. ما باید یک چیزی بسازیم. در این مثال، ما به صورت دلبخواهی عدد ۱۰ را انتخاب کرده ایم. واحدی برای اندازه گیری وجود ندارد. شاید شما بخواهید یک واحد اندازه گیری بسازید، مثلا «یک مگ» یا «یک تای» . همچنین قابل ذکر است که به هدف نمایش تفاوت های جرم، ما جرم را با پیکسل ارتباط دادیم( میگوییم، یک دایره با شعاع ۱۰ ترسیم کند). این به ما اجازه می دهد که جرم را و تفاوت های جرم ها و تغییرات را به نمایش بگذاریم. اگرچه در دنیای واقعی، اندازه تعریفی از جرم نمی دهد.یک توپ کوچک فلزی می تواند از یک بالن بزرگ چگالی بیشتری داشته باشد.

جرم اسکالر است(عدد شناور)، نه یک بردار، تنها یک عدد است که میزان ماده در شی را تعریف می کند. ما می توانیم درباره اشیاء تخیل کنیم و اندازه شی را به عنوان جرم محاسبه کنیم، اما این ساده است که بگوییم، « جرم این شی... اممممم.. نمیدونم... عدد ۱۰ خوبه؟

 

  Mover() {
    location = new PVector(random(width),random(height));
    velocity = new PVector(0,0);
    acceleration = new PVector(0,0);
    mass = 10.0;
  } 

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

 

 void applyForce(PVector force) {
   force.div(mass);
   acceleration.add(force);
 } 

باز هم هنوز اگرچه کد ما به نظر خیلی منطقی می آید، یک مشکل عمده اینجا داریم. این حالت را در نظر بگیرید که دو شی Mover داریم که هر دو تحت تاثیر نیروی باد قرار دارند.

 Mover m1 = new Mover();
Mover m2 = new Mover();
 
PVector wind = new PVector(1,0);
 
m1.applyForce(wind);
m2.applyForce(wind); 
دوباره، بیایید مثل یک رایانه فکر کنیم. شی m1 نیروی باد را دریافت می کند-- (۰و۱)-- تقسیم بر جرم(۱۰) و آن را به شتاب اضافه می کند.

m1 برابر با نیروی باد:(۰و۱)
تقسیم بر جرم به مقدار ۱۰: (۰و۰,1)
خوب،بریم سراغ m2، آن هم نیروی باد را دریافت می کند--(۱,۰). دست نگهدارید. میزان نیروی باد چقدر است؟ دقیقتر نگاه کنید، میزان نیروی باد که الان وجود دارد--(۰و۰,۱)
این مشکلات کوچک را که در کار با شی ها نیز به آنها بر می خوردیم به یاد می آورید؟ وقتی یک شی را به یک تابع پاس می دهید (در اینجا PVector) ، در حقیقت شما یک ارجاء به آن شی می دهید. نه یک کپی از آن را! بنابراین  اگر تابع شما تغییری در آن شی به وجود آورد( که در این جا به جرم تقسیم شده است) شی اصلی تغییر کرده است! اما ما نمی خواهیم که m2 نیروی باد تقسیم بر جرم m1 را دریافت کند. ما می خواهیم که نیرو به شکل اصلی آن شی وارد شود-- (۰و۱)، بنابراین ما خودمان را دربرابر تغییر با ایجاد یک کپی از PVector قبل از اینکه بر جرم تقسیم شود، محافظت می کنیم. خوشبختانه، کلاس PVector یک متد کارا برای ساخت کپی دارد—get .  متد get یک شی PVector جدید با داده های یکسان بر می گرداند. بنابراین ما می توانیم در استفاده از applyForce به صورت زیر تجدید نظر کنیم:
 void applyForce(PVector force) {
  PVector f = force.get();
  f.div(mass);
  acceleration.add(f);
} 

راه دیگری نیز برای نوشتن تابع بالا وجود دارد، استفاده از تابع استاتیک div . برای کمک در حل تمرین زیر به بخش متد های استاتیک در فصل یک نگاهی بندازید.
تمرین ۲-۲
متد applyForce را با استفاده از تابع استاتیک div به جای تابع get بازنویسی کنید.

 void applyForce(PVector force) {
  PVector f = _______.___(_____,____);
  acceleration.add(f);
} 

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