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

۹-۲ جاذبه گرانشی

پیغام خطا

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

شاید معروف ترین نیرو گرانش باشد. ما گرانش را با بیشتر افتادن چیز ها می فهمیم، اما این تنها تجربه ما از گرانش است. در واقع همانطور که زمین توپ را به سمت خود میکشد توپ نیز زمین را به سمت خود میکشد. اندازه زمین آنقدر بزرگ است و برای همین نیروی جاذبه اش آنقدر زیاد است که باعث می شود تمام برهم کنش های جاذبه های دیگر را تحت تاثیر قرار دهد. هر شی جرم داری ، دارای نیروی جاذبه به اشیاء اطرافش است.و یک فرمول برای محاسبه قدرت این نیرو وجود دارد. در تصویر ۲-۶ می توانید آن را ببینید.

 

تصویر ۲-۶

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

F به نیروی جاذبه اشاره دارد، برداری که ما در نهایت می خواهیم محاسبه شود و به تابع applyForce ارسال گردد.

G یک مقدار سراسر ثابت برای جاذبه است که در دنیای ما برابر با این مقدار است:

6.67428 x 10-11

که واحد آن مترمکعب به ازای هر کیلوگرم درمجذور ثانیه است. اگر شما استاد فیزیک باشید یا بخواهید از این موضوع در دنیای واقعی استفاده کنید این عدد خیلی مهم است. اما در دنیای پروسسینگ آنچنان مهم نیست. دوباره این ثابتی است که ما از آن استفاده می کنیم تا نیرو ها در دنیایمان را ضعیف یا قوی کنیم. فقط آن را برابر یک میگیریم و نادیده گرفتن آن باعث اتفاق خواصی نمی شود.

 M1 و M2 جرم شی یک و دو هستند. همانطور که در قانون دوم نیوتن دیدیم(F⃗ =M×A⃗) جرم را نیز می توانیم نادیده بگیریم. اشیاء ترسیم شده در صفحه جرم فیزیکی واقعی ندارند. با اینحال اگر ما این مقادیر را داشته باشیم می توانیم شبیه سازی های جالب تری داشته باشیم که در آن اشیاء بزرگتر نیروی گرانش بزرگتری را از خودشان نشان می دهند.

 r∧ به بردار یکه از شی یک به شی دو اشاره می کند. همانطور که دیدیم ، می توانیم با کم کردن موقعیت یک شی از شی دیگر مسیر آن را محاسبه کنیم.

R2 به فاصله بین دو شی که مربع شده است اشاره دارد. اجازه بدهیددر مورد این موضوع بیشتر فکر کنیم. در هر کجای این فرمول --- مثل G,m1 ,m2 --- هرچه قدر مقدار آن بزرگتر باشد، مقدار نیرو بیشتر می شد. جرم بزرگ، نیروی بیشتر را به همراه دارد، G بزرگتر برابر نیروی بزرگتر است. حالا ، وقتی این مقدار در زیر تقسیم داریم یعنی اندازه نیرو نسبت معکوسی با مربع فاصله دارد. هرچقدر یک شی دورتر باشد مقدار نیرو ضعیفتر است. هرچقدر نزدیکتر باشد، مقدار آن بیشتر است.

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

۱) هر شی یک موقعیت دارد:

Pvector location1 و Pvector location2

۲)هر شی یک جرم دارد:

float mass1 و float mass2

۳) یک متغیر float با نام G برای مقدار ثابت گرانشی سراسری داریم.

با این مفروضات داده شده، ما می خواهیم که نیروی PVector force را محاسبه کنیم که همان نیروی گرانش است. ما این کار را در دو بخش انجام می دهیم. اول، مسیر نیروی r را در فرمول بالا محاسبه می کنیم، دوم قدرت نیرو به نسبت جرم و فاصله محاسبه می کنیم.

از فصل یک به خاطر آورید. چطور ما توانستیم ترسیمی از یک شی داشته باشیم که به سمت موس شتاب بگیرد؟(تصویر ۲.۷ را ببینید)

تصویر ۲-۷

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

 

PVector dir = PVector.sub(mouse,location);

در مثال ما، بردار مسیر بردار جاذبه که شی ۱ به شی ۲ اعمال می کند برابر است با:

PVector dir = PVector.sub(location1,location2);
dir.normalize();
فراموش نکنید که ما نیاز به یک بردار واحد داریم، یک بردار که به ما فقط درباره مسیر می گوید، ما می بایست بردار را با کسر از موقعیت ها نرمال کنیم.
بسیار خوب، ما مسیر نیرو را گرفتیم. حالا ما فقط نیاز به محاسبه اندازه بردار آن برای کشیدن بردار برطبق آن داریم
float m = (G * mass1 * mass2) / (distance * distance);
dir.mult(m);
تنها اشکال این است که ما فاصله را نمی دانیم.G، جرم ۱و جرم ۲ که به ما داده شده است. اما ما نیاز به محاسبه فاصله حقیقی داریم تا کد بالا بتواند کار کند.	آیا ما نباید فقط یک که از یک موقعیت به موقعیت دیگر اشاره دارد را ایجاد کنیم؟ آیا اندازه این بردار فاصله بین دو شی نیست؟

تصویر ۲.۸

خوب، اگر ما اگر تنها یک خط کد اضافه کنیم و اندازه بردار را قبل از اینکه آن را نرمال کنیم به دست آوریم، آیا فاصله را نداریم.

PVector force = PVector.sub(location1,location2);
 

	

The length (magnitude) of that vector is the distance between the two objects.

float distance = force.magnitude();

 

	

Use the formula for gravity to compute the strength of the force.

float m = (G * mass1 * mass2) / (distance * distance);

 

	

Normalize and scale the force vector to the appropriate magnitude.

force.normalize();

force.mult(m);


 

توجه کنید که من Pvector با نام dir را به نام force تغییر نام داده ام، بعد از این، وقتی ما کارهای محاسباتی را به اتمام رساندیم، PVector که که شروع کرده ایم After all, when we’re finished with the calculations, the PVector we started with ends up being the actual force vector we wanted all along.

حالا که ما کارهای محاسباتی و کد نویسی اندازه گیری نیروی جاذبه را (شبیه سازی جاذبه) را تمام کرده ایم، ما نیاز به این داریم که آنها به اشیاء واقعی در محیط Processing اعمال کنیم.در مثال ۲.۱، یاد آورید که ما چگونه یک شی متحرک ساده را برای اولین بار ایجاد کردیم. یک کلاس PVector با موقعیت، سرعت اولیه و شتاب، همچنین یک تابع به نام applyForce. اجازه بدهید این کلاس دقیقا به برنامه خود اضافه کنیم.

یک شی متحرک ساده.

شی متحرک ما نیروی جاذبه را از شی دارای نیروی جاذبه دریافت خواهد کرد، این موضوع در تصویر ۲.۹ نمایش داده شده است.

تصویر ۲.۹

ما می توانیم برای ساده بودن کار با ساخت یک کلاس جدید به نام Attractor شروع کنیم – و تنها به آن یک موقعیت و یک جرم بدهیم، و البته یک تابع که بتواند با آن خودش را در صفحه ترسیم کند.(اندازه جرم را به سایز مربوط می کنیم).

class Attractor {

	

Our Attractor is a simple object that doesn’t move. We just need a mass and a location.

float mass;

  PVector location;
 
  Attractor() {
    location = new PVector(width/2,height/2);
    mass = 20;
  }
 
  void display() {
    stroke(0);
    fill(175,200);
    ellipse(location.x,location.y,mass*2,mass*2);
  }
}


 

و در برنامه اصلی ما، ما می توانیم یک نمونه از کلاس Attractor اضافه کنیم.

Mover m;
Attractor a;
 
void setup() {
  size(640,360);
  m = new Mover();

	

Initialize Attractor object.

a = new Attractor();

}
 
void draw() {
  background(255);
 

	

Display Attractor object.

a.display();

 
  m.update();
  m.display();
}

این یک ساختار مناسب: یک برنامه اصلی با شی متحرک و شی دارای جاذبه، و یک کلاس که مقادیر و رفتار های جسم متحرک و جاذب را در دست دارد. قسمت آخر این معما این است که چطور کاری کنیم یک شی دیگری را جذب کند. چطور می توانیم کاری کنیم که این دو شی بایکدیگر صحبت کنند؟

چند راه برای انجام آن وجود دارد. چند مورد محدود از آن اینجا آمده است

وظیفه

تابع

۱- یک تابع که هر دو شی متحرک و دارای جاذبه را به عنوان ورودی می گیرد.

attraction(a,m);

۲- یک تابع در کلاس شی دارای جاذبه که شی متحرک را به عنوان ورودی می گیرد.

a.attract(m);

۲- یک تابع که کلاس شی متحرک که شی دارای جاذبه را می گیرد.

m.attractedTo(a);

۴- یک تابع در کلاس شی داری جاذبه که شی متحرک را به عنوان ورودی می گیرد و یک Pvector را بر می گرداند. که یک نیروی جاذبه است.یک نیروی جاذبه به تابع applyForce در شی متحرک اعمال می شود.

PVector f = a.attract(m);
m.applyForce(f);

 


 

و به همین منوال ایده های دیگر را می توان ادامه داد...

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

به عبارت دیگر، می خواهیم داشته باشیم:

PVector f = new PVector(0.1,0);
m.applyForce(f);
ما همچنین داریم:
PVector f = a.attract(m);
m.applyForce(f);
و بنابراین تابع رسم ما می تواند به شکل زیر بازنویسی شود:
void draw() {
  background(255);
 

	

Calculate attraction force and apply it.

PVector f = a.attract(m);

  m.applyForce(f);
 
  m.update();
 
  a.display();
  m.display();
 
}

دیدگاه‌ها

چرا در فرمول آر به توان دو داریم؟

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