نمایش نتایج 1 تا 7 از 7

نام تاپیک: چرخش 180 درجه ای object

  1. #1

    چرخش 180 درجه ای object

    من می خوام ببینم چطوری میشه یه شیئ مثلا یه دایره رو مثل طلوع و غروب خورشید
    مثل پایین : از نقطه x به y با یه حرکت نیم دایره انتقال بدیم؟




    X Y

  2. #2
    کاربر تازه وارد آواتار ms_mohaghegh
    تاریخ عضویت
    مهر 1385
    محل زندگی
    شوشتر
    سن
    39
    پست
    44
    مواد لازم:
    فرمول دایره) x^2 + y^2 = r^2
    انتخاب یک مبدأ) برای رسم هر نموداری، یک نقطه به عنوان مبدأ مختصات نیاز است.
    Timer) حرکت در بستر زمان انجام می گیرد.

    روش کار:
    ما می خوایم روی یه نیم دایره راه بریم. اگه نیمه بالایی دایره مسیر مورد نظر ما باشه، با انتخاب یه شعاع ( r ) مناسب و انتخاب مقادیری بین r- و r برای x می تونیم y رو بدست بیاریم. برای پیدا کردن مابقی نقاط مسیر کافیه از یه حلقه استفاده کنی که برای مقادیر x از r- تا r تکرار بشه. این روش پیدا کردن مسیره.
    حالا ما این مسیر رو پیدا کردیم، چطور بکشیمش؟ برای رسمش باید یه مبدأ انتخاب کنیم. مختصات مبدأ (0,0) در نظر گرفته می شه ولی لزوماً مکان مبدأ نقطه (0,0) فرم ما نیست! بهتره بگم ما یه مختصات مجازی داریم که مثلاً نقطه ای با فاصله 300 از سمت چپ فرم و 200 از بالای فرم یعنی (300,200) به عنوان نقطه (0,0) در نظر گرفته می شه. بنا بر این همه نقاط نمودار ما باید به اندازه 200 واحد از بالا و 300 واحد از چپ فاصله بگیرن. مبدأ باید طوری انتخاب بشه که شکل ما توی تمام مسیر حرکتش قابل مشاهده باشه. ما مرکز دایره رو به عنوان مبدأ مختصاتمون انتخاب می کنیم. به این ترتیب اگه همون نقطه (300,200) رو به عنوان مبدأ در نظر گرفتی باید خصوصیت left تمام نقاط مسیر حرکت رو (از دید برنامه نویسی) 300 تا و خصوصیت right شون رو 200 تا افزایش بدی. حالا چطور این کار رو انجام بدیم؟ توضیح می دم.
    قراره که حرکت کنیم. برای نمایش حرکت، باید تعداد مشخصی frame در واحد زمان نمایش داده بشه. توی هر frame اون شیئی (object) که می خوای حرکت کنه باید به نقطه بعدی انتقال پیدا کنه. چطور؟ r رو که داریم ، x رو هم که داریم؛ توی فرمول دایره می ذاریم y پیدا می شه؛ مختصات مجازی رو بدست میاریم و شیئ رو با دادن مقادیر جدید left و top جابجا می کنیم. اگه مختصات مبدأمون رو با O نشون بدیم، left نهایی که باید بدست بیاریم برابر میشه با O.x+x و top نهایی هم برابر می شه با O.y-y (تفریق به علت اینه که توی دلفی فاصله از بالای فرم یعنی "top" محاسبه می شه نه از پایین).
    حالا این مقدار دهی کجا انجام می شه؟ اگه خاطرت باشه توی مواد لازم یه دونه timer هم بود. توی OnTimer برای timer مونه که این جابجایی انجام می شه. هر بار ، مقدار x به اندازه دلخواه افزایش پیدا می کنه، left برابر x و top برابر top-y می شه، تا وقتی که x برابر r بشه. وقتی x برابر یا بزرگتر از r شد timer باید از کار بیفته. یعنی یه چیزی مثل این:
      if x>r then
    timer1.Enabled:= False
    else
    // کد جابجایی
    // ...
    // ...
    فراموش نکن که r, x و y باید خارج از تابع OnTimer و به شکل عمومی تعریف بشن و x و به تبع اون y توی OnTimer به میزان دلخواه (مثلاً x:= x + 10 ) افزایش پیدا کنن.
    موفق باشی.
    آخرین ویرایش به وسیله ms_mohaghegh : جمعه 23 فروردین 1387 در 11:47 صبح دلیل: اصلاحات

  3. #3
    نقل قول نوشته شده توسط ms_mohaghegh مشاهده تاپیک
    مواد لازم:
    فرمول دایره) x^2 + y^2 = r^2
    انتخاب یک مبدأ) برای رسم هر نموداری، یک نقطه به عنوان مبدأ مختصات نیاز است.
    Timer) حرکت در بستر زمان انجام می گیرد.

    روش کار:
    ما می خوایم روی یه نیم دایره راه بریم. اگه نیمه بالایی دایره مسیر مورد نظر ما باشه، با انتخاب یه شعاع ( r ) مناسب و انتخاب مقادیری بین r- و r برای x می تونیم y رو بدست بیاریم. برای پیدا کردن مابقی نقاط مسیر کافیه از یه حلقه استفاده کنی که برای مقادیر x از r- تا r تکرار بشه. این روش پیدا کردن مسیره.
    حالا ما این مسیر رو پیدا کردیم، چطور بکشیمش؟ برای رسمش باید یه مبدأ انتخاب کنیم. مختصات مبدأ (0,0) در نظر گرفته می شه ولی لزوماً مکان مبدأ نقطه (0,0) فرم ما نیست! بهتره بگم ما یه مختصات مجازی داریم که مثلاً نقطه ای با فاصله 300 از سمت چپ فرم و 200 از بالای فرم یعنی (300,200) به عنوان نقطه (0,0) در نظر گرفته می شه. بنا بر این همه نقاط نمودار ما باید به اندازه 200 واحد از بالا و 300 واحد از چپ فاصله بگیرن. مبدأ باید طوری انتخاب بشه که شکل ما توی تمام مسیر حرکتش قابل مشاهده باشه. ما مرکز دایره رو به عنوان مبدأ مختصاتمون انتخاب می کنیم. به این ترتیب اگه همون نقطه (300,200) رو به عنوان مبدأ در نظر گرفتی باید خصوصیت left تمام نقاط مسیر حرکت رو (از دید برنامه نویسی) 300 تا و خصوصیت right شون رو 200 تا افزایش بدی. حالا چطور این کار رو انجام بدیم؟ توضیح می دم.
    قراره که حرکت کنیم. برای نمایش حرکت، باید تعداد مشخصی frame در واحد زمان نمایش داده بشه. توی هر frame اون شیئی (object) که می خوای حرکت کنه باید به نقطه بعدی انتقال پیدا کنه. چطور؟ r رو که داریم ، x رو هم که داریم؛ توی فرمول دایره می ذاریم y پیدا می شه؛ مختصات مجازی رو بدست میاریم و شیئ رو با دادن مقادیر جدید left و top جابجا می کنیم. اگه مختصات مبدأمون رو با O نشون بدیم، left نهایی که باید بدست بیاریم برابر میشه با O.x+x و top نهایی هم برابر می شه با O.y-y (تفریق به علت اینه که توی دلفی فاصله از بالای فرم یعنی "top" محاسبه می شه نه از پایین).
    حالا این مقدار دهی کجا انجام می شه؟ اگه خاطرت باشه توی مواد لازم یه دونه timer هم بود. توی OnTimer برای timer مونه که این جابجایی انجام می شه. هر بار ، مقدار x به اندازه دلخواه افزایش پیدا می کنه، left برابر x و top برابر top-y می شه، تا وقتی که x برابر r بشه. وقتی x برابر یا بزرگتر از r شد timer باید از کار بیفته. یعنی یه چیزی مثل این:
      if x>r then
    timer1.Enabled:= False
    else
    // کد جابجایی
    // ...
    // ...
    فراموش نکن که r, x و y باید خارج از تابع OnTimer و به شکل عمومی تعریف بشن و x و به تبع اون y توی OnTimer به میزان دلخواه (مثلاً x:= x + 10 ) افزایش پیدا کنن.
    موفق باشی.
    شما خیلی قشنگ و مفصل یاد دادین
    ولی من اصلا دلفی رو نخوندم میشه گفت 0
    میتونین کدش رو برام بنویسید؟
    ممنون میشم

  4. #4
    آقا کسی نیست کمک کنه؟

  5. #5
    ولی من اصلا دلفی رو نخوندم میشه گفت 0
    میتونین کدش رو برام بنویسید؟
    برای همچین کارهایی به انجمن برنامه نویسی مراجعه نمی کنند، بلکه به سایت هایی مثل GetAFreelancer مراجعه می کنند. اینجا برای رفع اشکال هست!


    وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
    و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.

  6. #6
    نقل قول نوشته شده توسط علی کشاورز مشاهده تاپیک
    برای همچین کارهایی به انجمن برنامه نویسی مراجعه نمی کنند، بلکه به سایت هایی مثل GetAFreelancer مراجعه می کنند. اینجا برای رفع اشکال هست!
    والله ما نمیدونستیم این مدلیه سایت شما
    فکر کردیم بچه ها مرام دارن جواب میدن

    در هر صورت ببخشید
    ولی اگه میتونین خوب کمکم کنین

  7. #7

    نقل قول: چرخش 180 درجه ای object

    unit Unit1;
    interface
    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls, Buttons, ExtCtrls;
    type
    TForm1 = class(TForm)
    Image1: TImage;
    BitBtn1: TBitBtn;
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;
    var
    Form1: TForm1;
    R:integer;
    X,Y:integer;
    H,L:integer;
    implementation
    {$R *.dfm}

    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    R:=100;
    H:=200;
    L:=300;
    For X:=-R to R do Begin
    Y:=Trunc(Sqrt((R*R)-(X*X)))+H;
    Image1.Left:=X+L;
    Image1.Top:=Y;
    Refresh;
    end;
    For X:=+R Downto -R do Begin
    Y:=-(Trunc(Sqrt((R*R)-(X*X))))+H;
    Image1.Left:=X+L;
    Image1.Top:=Y;
    Refresh;
    end;

    end;
    end.

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •