PDA

View Full Version : شبیه ساز حرکت فنر



me.enik
سه شنبه 27 تیر 1391, 17:58 عصر
سلام.

توضیحات خلاصه :
برنامه شبیه ساز حرکت فنر, که آماده دانلود میباشد.


توضیحات تکمیلی :
راستش خودم چند روز پیش تصمیم گرفتم یه پروزه شبیه سازی برای اولین بار توی زندگیم انجام بدم. :لبخند:
بعدش یه سری اتفاقات افتاد که تصمیم گرفتم حرکت فنر را شبیه سازی کنم.
به این صورت که یه سری ورودی میگیره, و یه خروجی به شما نمایش میده ( نه بابا!! ).

ورودی ها عبارت اند از:
k = مقاومت فنر
m = جرم فنر
x = مقدار کشش فنر که ما آن را میکشیم
v = سرعت اولیه که شاید به فنر یه شوتی هم زدیم که تندتر برود :لبخند:

زبان نوشته شده دلفی ایکس ای 2 هستش, در صورتی هم که استقبال بشه ( که بعید میدونم :چشمک: ), و در صورت درخواست عزیزان,
سورس کد برنامه را هم همینجا قرار میدم.
اگر چه میدونم شما ها خودتون اوستا هستین. :لبخند:

راستی, حتما برنامه ایراداتی هم داره, ممنون میشوم اونا رو ذکر کنید, راستش قراره کم کم بروم سراغ شبیه ساز توپ که به در و دیوار میخوره و ...,
برای همین بهش احتیاج دارم که جایی مشکلی نداشته باشه.
نظر, انتقاد, پیشنهاد هم فراموش نشه.

89881


89882

Ananas
سه شنبه 27 تیر 1391, 18:27 عصر
سلام.
کار خیلی خوبیه. منم تو فکر حرکت ماشینم. ولی اینکه ساختی درست نمایش نمیده! مگه ریل تایم عمل نمیکنه؟ اگه بتونی پارامتراشو با استفاده از Trackbar بگیری و خود فنر رو هم با تصویر بهتر نمایش بدی خیلی بهتره. چون برای کسایی مثل من که فرمول فنر رو یادشون رفته بیشتر ویژوال باشه بهتره تا عدد. من یک نمونه ساخته بودم که فایلشو پیدا کردم با سورسش براتون آپلود میکنم.
کلا من از این قبیل برنامه ها دوست دارم و با کد نویسی برای فرمولای فیزیکی خیلی موافقم. دوست داشتم یه قسمتی مخصوص برنامه نویسی فیزیک و ریاضی ایجاد میشد و بیشتر رو این موارد کار میشد. متاسفانه دانشجوهای فیزیک ما اکثرا به برنامه نویسی بها نمیدن و فقط میخوان به عنوان واحد درسی اونو رد کنن و برنامه نویسامونم تو این خطا نیستن. ولی من از شبیه سازی خیلی خوشم میاد (متاسفانه فرمولای فیزیکیش رو نمی دونم).

me.enik
سه شنبه 27 تیر 1391, 20:07 عصر
سلام.
ممنون از نظرتون.

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

منظورتون رو درباره ماشین نفهمیدم, یعنی مثلا یه ماشینی بسازیم که با فنر کار کنه و جلو عقب بره!!؟ :متفکر: :لبخند:

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

SAASTN
سه شنبه 27 تیر 1391, 20:54 عصر
بهتره برای اینجور برنامه ها واحد مقادیر ورودی رو توی فرم نمایش بدی و یه مقدار پیشفرض هم براش بذاری. روی ویژال قضیه هم بیشتر کار کنی خوبه. هم میتونی خود فنر در حال حرکت رو نمایش بدی هم یه نمودار که موقعیت x جرم یا طول فنر رو نمایش بده. اگه انرژی از دست رفته فنر تو هر تناوب رو هم بگیری که دیگه تکمیله:چشمک:

Ananas
سه شنبه 27 تیر 1391, 21:13 عصر
برای همین زیاد روی حالت گرافیکی اون کار نکردم و یه چیزی ساختم که فقط نشون بده که داره چه اتفاقاتی می افته.
توسیستم من قشنگ اجرا نمیشه! شما چه عددهایی رو برای اجرای بهتر پیشنهاد میکنی؟ نکته ی دیگه اینکه اعداد اعشاری رو قبول نمیکنه و فنر به جای کاهش دامنه ی حرکتی بعد از گدشت زمان، دامنه ی حرکتش بیشتر و بیشتر میشه! چرا؟


منظورتون رو درباره ماشین نفهمیدم, یعنی مثلا یه ماشینی بسازیم که با فنر کار کنه و جلو عقب بره!!؟ :متفکر: :لبخند:

منظورم بازی ماشین هست و حرکت در فضای سه بعدی با 4 تا فنر و محاسبات وزن و نیرو و ... .

me.enik
چهارشنبه 28 تیر 1391, 09:22 صبح
سلام.
این هم سورس کدی که دوستان درخواست داده بودند.
سورس اتچ شده است, میتوانید استفاده کنید.
میخواستم اینجا آپلود کنم, ارور داد, نشد, مجبور شدم خارج از سایت آپلود بکنمش.

دانلود سورس
(http://wdl.persiangig.com/pages/download/?dl=http://hfkh77.persiangig.com/fanar%20source.rar)

me.enik
چهارشنبه 28 تیر 1391, 09:50 صبح
توسیستم من قشنگ اجرا نمیشه! شما چه عددهایی رو برای اجرای بهتر پیشنهاد میکنی؟ نکته ی دیگه اینکه اعداد اعشاری رو قبول نمیکنه و فنر به جای کاهش دامنه ی حرکتی بعد از گدشت زمان، دامنه ی حرکتش بیشتر و بیشتر میشه! چرا؟از قشنگ اجرا نشدن, منظورتون چیه؟
یعنی از لحاظ گرافیکی مشکلی رو میبینین؟
یا اون تیکه ای رو که از فنر پاک نمیشه را دارید اشاره میکنید!!؟

در مورد عدد ها هم, باشه, اون مشکل را سعی میکنم درست کنم که عدد اعشاری هم بگیره.

اصطکاک هم نداره که بخواد سرعتش کم بشود, ولی فکر نکنم که دامنه نوسانش بیشتر بشه, اگر هم اینطوری بشه, خب شبیه ساز هستش دیگه,
چیزهایی را که فکرش را نمیکنیم را باید دید. :دی

me.enik
چهارشنبه 28 تیر 1391, 10:01 صبح
از همه ی دوستان متشکرم.

اما هدف از طراحی این برنامه, این بوده است که در آخر تبدیل به یه توپ بشود که مثلا به در و دیوار برخورد بکند, و بعد به این سمت و آن سمت برود و ... .
میخواستم بدونم کسی میتونه یه ایده ای, روشی, راهکاری, چیزی پیشنهاد بده که کمک کنه؟
ممنون میشوم.

Ananas
چهارشنبه 28 تیر 1391, 14:28 عصر
با استفاده ازین کد خیلی راحت می تونی فنر رو ترسیم کنی. فقط کد های فنر خودت رو باید جایگزین کنی من فقط تو یک تایمر برای تست یه نمونه از حرکت فنر رو نوشتم.

procedure DrawSpring(Canvase_ : TCanvas; const Start_, End_, Frequanc_, Scale_, Offset_ : Single);
var
points : array of TPoint;
i: Integer;
begin
SetLength(points, Trunc(Frequanc_ * 8));
for i := 0 to High(points) do
begin
points[i] := Point(
Trunc(Start_ + (End_ - Start_) * i / High(points)),
Trunc(Offset_ + Scale_ * Sin(Frequanc_ * 2.0 * Pi * i / High(points)))
);
end;
Canvase_.Polyline(points);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
(Sender as TTimer).Interval := 1;
Self.Canvas.Rectangle(0, 0, Self.ClientWidth, Self.ClientHeight);
DrawSpring(Self.Canvas, 10, 100 + 50 * Sin(Now * 86400 * 2 * Pi), 10, 20, 50);
end;


در مورد توپ هم بعدا نظرم رو میگم فعلا وقت نیست.

پست رو ویرایش کردم و Frequnc رو باید در 2 تا pi ضرب می کردم. 2 رو یادم رفته بود. بابت تشکر ممنون.

me.enik
چهارشنبه 28 تیر 1391, 16:00 عصر
باشه, خیلی ممنون از کدی که گذاشتی.
اما فقط یه مشکلی برای من به شخصه وجود داره که نمیدونم سینوس چی هستش که توی کدی که نوشتی وجود داره.
دلیل اصلی اش هم این هستش که هنوز نخواندیمش.
ولی به هر حال, ممنون. :چشمک:


منتظر نظرت درباره ی توپ هم هستم.

Ananas
پنج شنبه 29 تیر 1391, 02:41 صبح
باشه, خیلی ممنون از کدی که گذاشتی.
زنده باشی.

اما فقط یه مشکلی برای من به شخصه وجود داره که نمیدونم سینوس چی هستش که توی کدی که نوشتی وجود داره.
در مثلثات (http://fa.wikipedia.org/wiki/%D9%85%D8%AB%D9%84%D8%AB%D8%A7%D8%AA)، سینوس (http://fa.wikipedia.org/wiki/%D8%B3%DB%8C%D9%86%D9%88%D8%B3_%28%D8%B1%DB%8C%D8% A7%D8%B6%DB%8C%D8%A7%D8%AA%29) یک زاویه به معنی نسبت ضلع مقابل زاویه به وتر در مثلث قائم الزاویه است. (ویکیپدیا)
من برای حرکت نوسانی (رفت و برگشتی) فنر نسبت به زمان و همچنین رسم خود فنر از تابع سینوس استفاده کردم. اگه دقت کنید وقتی یک دوک نخ (اونهایی که از بالا به پایین می پیچن بعد دوباره از پایین برمیگردن بالا و ...) و یا فنر و یا هر چیزی که روی یک استوانه بالا و یا پایین بره رو از کنار نگاه می کنید یک نمودار سینوسی رو می بینید که برای ترسیمش از ضریبی از سینوس استفاده کردم و برای انیمیشن هم که مشخصه حرکت رفت و برگشتی نسبت به زمان هست که با سینوس و یا کسینوس میشه پیاده کرد.


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


منتظر نظرت درباره ی توپ هم هستم.
شما باید از Reflect (بازتاب) برای برخورد توپ به دیوار استفاده کنی. یعنی یک بردار (جهت حرکت توپ) داره با زاویه ای به یک سطح صاف (دیوار) برخورد میکنه. حالا بعد از برخورد هم باید زاویه 180 منهای همون زاویه رو با دیوار داشته باشه. شما می تونید این فرمولارو دستی بنویسید و یا اینکه از ماتریس 2 در 2 دوران که سینوس و کسینوس داره استفاده کنید. کتاب هندسه سوم ریاضی ماتریس دوران رو صفحه رو گفته. اگه اشتباه نکنم فرمول نهایی اش به این شکله :


x' = x * cos(a) - y * sin(a)
y' = x * sin(a) + y * cos(a)

تو این فرمول x , y جدید که از دوران x, y قدیم ، با زاویه ی دوران a بدست میاد رو داریم. حالا شما باید اون رو نسبت به نقطه ی برخورد به دیوار دوران بدید (بردار برخورد رو نسبت به نقطه ی برخورد با زاویه ی 180 منهای زاویه اولیه نسبت به دیوار دوران بدید). برای این کار باید ابتدا نقطه ی برخورد رو به مرکز مختصات انتقال بدید از طریق عمل تفریق (برداری)، بعد عمل دوران رو انجام بدید، بعد از دوران، نتیجه رو دوباره به محل برخورد انتقال بدید با عمل جمع (برداری). زاویه دوران رو هم باید با ArcTan2 و یا هر فرمول Arc دیگه بدست بیارید (تابع ArcSin عمل عکس Sin هست و اگه سینوس یک زاویه رو داشته باشید می تونید زاویه ی معادل اش رو با ArcSin بدست بیارید و اگه هم سینوس و هم کسینوس یک زاویه رو داشته باشید با ArcTan2 میتونید دوتا ورودی به تابع بدید و مقدار زاویه ی معادل رو دقیق تر (به دلیل یکسان بودن بعضی روابط مثلثاتی بین زوایای قرینه نسبت به محور های x و یا y) بدست بیارید) بعد دوباره سینوس و کسینوس بگیرید از 180 منهای زاویه اولیه و بردار بازتاب بدست بیاد . که البته احتمالا بشه با یکمی دودوتاچارتا مستقیما بردار برخورد رو بدون عملیات دوران، به بردار بازتاب تبدیل کنید. (یکمی فکر لازم داره که الان رو مدش نیستم ولی راه راحت و مطمئنش البته با سرعت اجرای کمتر (کمی محاسبات بیشتر برای cpu) همون دوران هست).
اگه بخواید برای توپ شعاع تعریف کنید مسئله یکمی پیچیده تر میشه ولی اصل بازتاب وجود داره که میشه فرمولشو بدست آورد. اما برای سرعتش و شتاب و این چیزا هم باید دستوری باشه که با برخورد به دیوار یکمی از سرعتش کم بشه و کلا نسبت به زمان سرعت کم بشه که واقعی تر بشه وگرنه تا بینهایت زمانی حرکت میکنه.
ببخشید طولانی شد، توضیحات بیشتر خواستی بگو.

me.enik
پنج شنبه 29 تیر 1391, 10:16 صبح
خیلی ممنون از توضیحات کاملی که دادید.
روش کار دستم اومدش.
یعنی الآن تقریبا میدونم که باید چی کار بکنم.
مرسی.

در مورد سنم هم امسال تازه میرم اول دبیرستان.
به خاطر همین هم هستش که نمیدونم سینوس و کسینوس و اینجور چیزا چی هستش !! :دی

پس در حالت کلی باید با زاویه ای که میاد, دوباره بره, بعدش هم اون وسطا هم یه نیرویی ازش کم بشود که طبیعی به نظر بیاد.
باشه, ممنون.

Ananas
جمعه 30 تیر 1391, 21:37 عصر
برنامه ای که گفته بودم برای فنر نوشته بودم :
90018
روی فرم کلیک کرده و با نگه داشتن کلید چپ موس، موس رو حرکت بدید، بچرخونید و تند تند به اطراف بکشید.
تو این کد یک کلاس تعریف کردم که مجموعه ای از کسینوس ها رو تو یک آرایه همراه زمان شروع هر کدوم (به عنوان یک نیروی) ذخیره می کنه و طر زمان دامنه ی نوسان رو (نسبت به زمان شروع) کاهش میده. با هر حرکت و تغییر جدید که با موس ایجاد میشه یکی ازین کسینوس ها اضافه میشه و با کوچیک شدن دامنه ی نوسان (نزدیک صفر) اون شی از لیست کسینوس ها حذف میشه که محاسبات اضافی انجام نشه و برای مشخص کردن وضعیت فعلی هم مجموع برایند این چند تا کسینوس محاسبه میشن. منظورم از کسینوس، در اینجا نوسان کردن در طی زمان و کم شدن دامنه ی نوسان با گذشت زمان هست. یکمی پیچیدس دپرس نشی یکمی هم شلوغه چون موقع نوشتن تجربه ی کمتری داشتم. ولی برای نمونه شاید مفید باشه.