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

شروع موضوع توسط mohsensemsarpour ‏6 مارس 2008 در انجمن منطق و الگوریتم برنامه‌نویسی

  1. mohsensemsarpour

    mohsensemsarpour کاربر فعال

    ارسال‌ها:
    1,217
    تشکر شده:
    931
    امتیاز دستاورد:
    113
    الگوریتم بازی تیر اندازی رو می خوام کسی بلده

    با سلام
    می خواستم ببینم کسی الگوریتم بازی تیراندازی که با تنظیم زاویه و شتاب پرتاب صورت می گیره رو بلده توی تلوزیون زیاد دیدید حتما ؟؟؟
     
    نوشته شده توسط mohsensemsarpour در ‏6 مارس 2008
  2. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,765
    تشکر شده:
    1,382
    امتیاز دستاورد:
    113
    سلام.
    من چند خط کد نوشتم.
    نمی دونم منظورتون همین بود یا نه. یا در چه حدی می خواستید.
    با دلفی نوشتم ولی زیاد کار نکردم تا ببینم موضوع چیه.
    قسمتهای آبی کدهاست بقیه مربوط به زبان دلفیه. کامنت نوشتم مقداری جلوی کدها.
    کد (Text):
    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.

     
    [​IMG]

    [​IMG]
     
    نوشته شده توسط saalek110 در ‏6 مارس 2008
    mohsensemsarpour و armin_mx از این پست تشکر کرده اند.
  3. mohsensemsarpour

    mohsensemsarpour کاربر فعال

    ارسال‌ها:
    1,217
    تشکر شده:
    931
    امتیاز دستاورد:
    113
    ممنون از راهنمایی شما از اون جایی که من می خوام برنامه رو به زبون دیگه ای بنویسم می شه الگوریتم رو توضیح بدید.
     
    نوشته شده توسط mohsensemsarpour در ‏7 مارس 2008
  4. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,765
    تشکر شده:
    1,382
    امتیاز دستاورد:
    113
    با سلام
    کدی که من نوشتم بر این اساس کار می کنه که .....

    اولا بگم که در زبانهای ویژوال مثل وی بی و دلفی و سی شارپ(و بقیه دات نتی ها) ابزاری به نام تایمر دارید که مثلا روی 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 در ‏7 مارس 2008
  5. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,765
    تشکر شده:
    1,382
    امتیاز دستاورد:
    113
    در مورد تابع ceil : کلا گرد کردن برای اینه که برنامه دلفی من مختصات اعشاری برای shape قبول نمی کنه. در زبانهای دیگر هم فکر کنم چنین است. پس تابع گرد کردن نیاز است. من فعلا 3 نوع گرد کردن میشناسم. گرد به کف - گرد به سقف - گرد به نزدیکترین. من فعلا یکی را همین جوری علی الحساب به کار بردم ولی گرد به نزدیکترین عاقلانه تر است. در زبان برنامه نویسی خود توابع گرد کردن را اگر نیاز شد به کار ببرید.

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

    از :
    http://www.delphibasics.co.uk/RTL.asp?Name=Round&ExpandCode1=Yes
    کد (Text):
    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
    کد (Text):
    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.
    نتیجه اجرا:
    کد (Text):
    Round(12.75) = 13
       Trunc(12.75) = 12
         Int(12.75) = 12
       Frac(12.75) = 0.75
     
    نوشته شده توسط saalek110 در ‏7 مارس 2008
  6. mohsensemsarpour

    mohsensemsarpour کاربر فعال

    ارسال‌ها:
    1,217
    تشکر شده:
    931
    امتیاز دستاورد:
    113
    آقا ممنون از توضیحات کامل شما
    در مورد توضیحی که دادید فرمول ها و روش کار رو تا حدی فهمیده بودم و تابع ceil رو هم خودم سرچ کرده بودم و پیدا کرده بودم چیکار می کنه از این جهت چون من تا حالا به این بخش نیومده بودم گفتم اینو بگم دفعه بعد اگر سوال پرسیدم خیلی زحمت نکشید چون نمی خوام زیاد وقت شما رو بگیرم اما در مورد الگوریتم .
    ببینید من می خوام کاربر یک سرعتی رو انتخاب کنه و یک زاویه ای رو و توپ از لوله تفنگی بیرون بیاد خوب تا اینجا.
    اما در مورد حرکت همون طور که گفتید باید توپ تا یه جایی بالا بره و بعد پایین بیاد درسته خوب این کار رو شما بدون شرط انجام دادید درست می گم و وقتی به نقطه اوج می رسه طبق فرمول خودش منفی می شه و به پایین میاد درست میگم
    لطف کنید در مورد کلیات بیشتر توضیح بدید البته در این مورد کلا یه چیزایی فهمیدم منظورم سوالات دیگه هست.
    باز هم صمیمانه از شما تشکر می کنم ...
     
    نوشته شده توسط mohsensemsarpour در ‏7 مارس 2008
  7. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,765
    تشکر شده:
    1,382
    امتیاز دستاورد:
    113
    با سلام.
    جاذبه یک نیرو به سمت پایین است. و هر نیرویی باعث شتاب میشه. که من با gt سرعت لحظه ای را پیدا کردم.
    در مورد زاویه پرتاب با سینوس و کسینوس نیروی پرتاب را پخش کنید به سرعت افقی و سرعت عمودی.
     
    نوشته شده توسط saalek110 در ‏7 مارس 2008
    mohsensemsarpour از این پست تشکر کرده است.
  8. mohsensemsarpour

    mohsensemsarpour کاربر فعال

    ارسال‌ها:
    1,217
    تشکر شده:
    931
    امتیاز دستاورد:
    113
    دوستان سلام
    مي خواستم بدونم براي حركت پرتابي الگوريتمي ديديد كه بشه كاربر عدد سرعت و درجه رو وارد كنه حركت انجام بشه ...
    ممنون
     
    نوشته شده توسط mohsensemsarpour در ‏12 مارس 2008
  9. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,765
    تشکر شده:
    1,382
    امتیاز دستاورد:
    113
    نوشته شده توسط saalek110 در ‏16 مارس 2008
    mohsensemsarpour از این پست تشکر کرده است.

به اشتراک بگذارید