الگوريتم شبيه سازي حركت پرتابي

mohsensemsarpour

کاربر فعال
الگوریتم بازی تیر اندازی رو می خوام کسی بلده

با سلام
می خواستم ببینم کسی الگوریتم بازی تیراندازی که با تنظیم زاویه و شتاب پرتاب صورت می گیره رو بلده توی تلوزیون زیاد دیدید حتما ؟؟؟
 

saalek110

Well-Known Member
سلام.
من چند خط کد نوشتم.
نمی دونم منظورتون همین بود یا نه. یا در چه حدی می خواستید.
با دلفی نوشتم ولی زیاد کار نکردم تا ببینم موضوع چیه.
قسمتهای آبی کدهاست بقیه مربوط به زبان دلفیه. کامنت نوشتم مقداری جلوی کدها.
کد:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls,math, StdCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    ball: TShape;
    Button1: TButton;
    Shape1: TShape;
    Shape2: TShape;
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
[COLOR="Blue"]
   v : extended ;    //moteghayere ashari
   time : extended;   //moteghayere ashari
[/COLOR]implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
[COLOR="Blue"]
time := time+1 ;
v := v-9.8*time/500 ;        // v=v-gt
ball.Left := ball.Left+1 ;      // hareka be rast +_ wind and moghavemate hava
ball.top := ball.top-Ceil(v);    // asare jazebeh

if  ball.top >300 then timer1.Enabled :=False ; // agar khord zamin beistad[/COLOR]
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
[COLOR="Blue"]
 ball.Left :=30 ;   // makane avalieye toop
 ball.top :=300 ;    // makane avalieye toop
 v :=10 ;             // sorate avalieh
time :=1 ;             // time
timer1.Enabled :=True ;  // timer triger[/COLOR]
end;

end.


 

mohsensemsarpour

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

saalek110

Well-Known Member
با سلام
کدی که من نوشتم بر این اساس کار می کنه که .....

اولا بگم که در زبانهای ویژوال مثل وی بی و دلفی و سی شارپ(و بقیه دات نتی ها) ابزاری به نام تایمر دارید که مثلا روی 50 وقتی بذارید اینتروالش را هر 50 هزارم ثانیه یک بار کدهای داخلش اجرا میشه.

ولی در سی مثلا با توربو سی 3 این تایمر را نداریم. نمی دونم اونجا راه درست چیه ولی من از حلقه استفاده کردم.
در تاپیک زیر:
http://forum.majidonline.com/showthread.php?t=63154
در زبان سی هم با زمان کار شده هم با حلقه.

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

اما می رسیم به جهت عمودی:
توپ به سمت بالا شوت میشه ولی رفته رفته سرعتش کم میشه تا به نقطه اوج می رسد و بر می گردد . و در حال پایین اومدن هم رفته رفته سرعتش زیاد میشه. gt همان کاهش است. یعنی شتاب جاذبه ضربدر زمان.
من داخل تایمر زمان را شمردم. همان time=time+1 در زبان سی داخل حلقه هم فکر کنم بشه زمان را شمرد. هر دور چرخش حلقه را فرض کنید یک اجرای تایمر برنامه ماست ولی چون چرخش حلقه سریع است باید ضرایب تصحیح بشه.
بله داشتیم می گفتیم. در جهت عمودی با استفاده از زمان سرعت تعیین شد در فرمول v := v-9.8*time/500 اون تقسیم بر 500 هم برای تنظیم است. کلا همه ضرایب را موقع اجرا ست کنید تا تنیجه دلخواه در بیاد . در خط بعدی ball.Left := ball.Left+1 توپ با سرعت ثابت به راست میره که بحث شد که نباید چنین باشه(باد و اصطحکاک) . در خط بعدی ball.top := ball.top-Ceil(v); ارتفاع توپ با توجه به سرعت تعیین میشه. در خط بعدیش هم بررسی شده که آیا توپ به زمین خورده یا نه. چون زمین نیروی مقاومی است که تمام معادلات را تغییر می دهد. ممکنه در اینجا بخواهید جهش دوباره توپ را بسازید که بحث دیگری است.

====================
نکته ای راجع به مقاومت هوا : این کاهش سرعت در موقع صعود توپ و سقوط توپ هم باید لحاظ بشه.
و باید وابسته به سرعت توپ مقدار مقاومت حساب بشه. مربوط میشه به مکانیک سیالات. در فیزیک دبیرستان هم دیدید که در سرعتهای بالا پشت جسم جریانهای گردابی به وجود میاد که باعث مقاومت بیشتره و در سرعتهای بالاتر از سرعت صوت مسئله شکستن دیوار صوتی مطرح میشه و کلا فرمولها فرق داره. ولی اگر دنبال این مقدار دقت نیستید که هیچی.
 

saalek110

Well-Known Member
در مورد تابع ceil : کلا گرد کردن برای اینه که برنامه دلفی من مختصات اعشاری برای shape قبول نمی کنه. در زبانهای دیگر هم فکر کنم چنین است. پس تابع گرد کردن نیاز است. من فعلا 3 نوع گرد کردن میشناسم. گرد به کف - گرد به سقف - گرد به نزدیکترین. من فعلا یکی را همین جوری علی الحساب به کار بردم ولی گرد به نزدیکترین عاقلانه تر است. در زبان برنامه نویسی خود توابع گرد کردن را اگر نیاز شد به کار ببرید.

در زیر راجع به تابع Round در دلفی بحث میشه:
----------------------------------------------------

از :
http://www.delphibasics.co.uk/RTL.asp?Name=Round&ExpandCode1=Yes
کد:
The Round function rounds a floating point Number to an Integer value. 
 
The rounding uses Bankers rules, where an exact half value causes a rounding to an even number: 
 12.4 rounds to 	12
12.5 rounds to 	12 // Round down to even
12.6 rounds to 	13
 	
13.4 rounds to 	13
13.5 rounds to 	14 // Round up to even
13.6 rounds to 	14
از همین سایت یک برنامه نمونه برای Round
کد:
unit Unit1;
 
interface
 
uses
  // The System unit does not need to be defined
  SysUtils,
  Forms, Dialogs;
 
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  end;
 
var
  Form1: TForm1;
 
implementation
{$R *.dfm} // Include form definitions
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  ShowMessage('Round(12.75) = '+IntToStr(Round(12.75)));
  ShowMessage('Trunc(12.75) = '+IntToStr(Trunc(12.75)));
  ShowMessage('  Int(12.75) = '+FloatToStr(Int(12.75)));
  ShowMessage(' Frac(12.75) = '+FloatToStr(Frac(12.75)));
end;
 
end.
نتیجه اجرا:
کد:
Round(12.75) = 13
   Trunc(12.75) = 12
     Int(12.75) = 12
   Frac(12.75) = 0.75
 

mohsensemsarpour

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

saalek110

Well-Known Member
با سلام.
جاذبه یک نیرو به سمت پایین است. و هر نیرویی باعث شتاب میشه. که من با gt سرعت لحظه ای را پیدا کردم.
در مورد زاویه پرتاب با سینوس و کسینوس نیروی پرتاب را پخش کنید به سرعت افقی و سرعت عمودی.
 

mohsensemsarpour

کاربر فعال
دوستان سلام
مي خواستم بدونم براي حركت پرتابي الگوريتمي ديديد كه بشه كاربر عدد سرعت و درجه رو وارد كنه حركت انجام بشه ...
ممنون
 

جدیدترین ارسال ها

بالا