PDA

View Full Version : چرخش 180 درجه ای object



r2_irooni
پنج شنبه 22 فروردین 1387, 20:32 عصر
من می خوام ببینم چطوری میشه یه شیئ مثلا یه دایره رو مثل طلوع و غروب خورشید
مثل پایین : از نقطه x به y با یه حرکت نیم دایره انتقال بدیم؟




X Y

ms_mohaghegh
جمعه 23 فروردین 1387, 10:01 صبح
مواد لازم:
فرمول دایره) 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 ) افزایش پیدا کنن.
موفق باشی.

r2_irooni
جمعه 23 فروردین 1387, 19:50 عصر
مواد لازم:
فرمول دایره) 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
میتونین کدش رو برام بنویسید؟
ممنون میشم:لبخندساده:

r2_irooni
شنبه 24 فروردین 1387, 19:47 عصر
آقا کسی نیست کمک کنه؟

vcldeveloper
یک شنبه 25 فروردین 1387, 03:12 صبح
ولی من اصلا دلفی رو نخوندم میشه گفت 0
میتونین کدش رو برام بنویسید؟برای همچین کارهایی به انجمن برنامه نویسی مراجعه نمی کنند، بلکه به سایت هایی مثل GetAFreelancer (http://www.getafreelancer.com) مراجعه می کنند. اینجا برای رفع اشکال هست!

r2_irooni
یک شنبه 25 فروردین 1387, 11:55 صبح
برای همچین کارهایی به انجمن برنامه نویسی مراجعه نمی کنند، بلکه به سایت هایی مثل GetAFreelancer (http://www.getafreelancer.com) مراجعه می کنند. اینجا برای رفع اشکال هست!
والله ما نمیدونستیم این مدلیه سایت شما
فکر کردیم بچه ها مرام دارن جواب میدن
:لبخندساده:
در هر صورت ببخشید
ولی اگه میتونین خوب کمکم کنین:ناراحت:

Habe_Angour
سه شنبه 05 خرداد 1388, 18:15 عصر
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.