PDA

View Full Version : حرکت دایره ای line ؟



zayens
دوشنبه 03 مهر 1391, 16:23 عصر
فرض کنید یه خط رسم کردیم با کد زیر:

private void button2_Click(object sender, EventArgs e)
{
Graphics obj1;
obj1 = panel1.CreateGraphics();
obj1.DrawLine(Pens.PaleGreen, 200, 200, 95, 95);
}

یه سر این پاره خط در نقطه 200و200 شروع شده و سر دیگه ی پاره خط در مختصات 95و95 است.
چطور میشه این خط را حول مختصات یه سر پاره خط (مثلا 200و200) به چرخش در بیاریم(یه چیزی تو مایه های عقربه ساعت میخوام درست کنم)
مثلا با تایمر هر ثانیه 30 - 40 درجه(یا هر درجه ی دیگه ای) ساعتگرد یا پادساعتگرد حرکت کنه!؟
خواهشا راهنمایی کلی نکنید و لطفا نمونه کدی چیزی برام بزارین

مسعود اقدسی فام
دوشنبه 03 مهر 1391, 16:55 عصر
یه متغیر عمومی درجه تعریف کنید که اوش صفر باشه. بعد هر بار که تابع تایمر فراخوانی می شه نقطه‌ی سر دایره رو به اندازه‌ی اون درجه دوران عددی بدید (با ماتریس دوران) و از مرکز تا نقطه‌ی جدید حاصل از دوران رسم کنید.

Hajivandian
سه شنبه 04 مهر 1391, 07:08 صبح
http://en.wikipedia.org/wiki/Rotation_matrix

zayens
سه شنبه 04 مهر 1391, 14:01 عصر
جناب Hajivandian (http://barnamenevis.org/member.php?188317-Hajivandian) برنامه ی شما بسیار عالی بود و همانی بود که میخواستم و بسیار ممنونم
فقط یه نکته در این مورد:
چطور میشه همین حرکت را به همین صورت داشته باشیم ولی صفحه clear‌ نشه!؟
آخه میخوام یه بکگراند بندازم که در برنامه شما بکگراندم پاک میشه

آیا اصلا نمیشه خطی که درست شده را جور دیگه چرخوند؟ (مثلا دائم با درجه خاصی Rotate کرد برا اینکه خاموش - روشن شدن خط در حال چرخیدن از بین بره)
با روشی که شما استفاده کردید برنامه دائم صفحه را Refresh میکنه(منظورم همون پاک کردن صفحه و ساخت مجدد خط هست) و تصویر پرش داره. میخوام این مشکلم هم حل بشه.
ممنون میشم مجددا راهنمایی بشم

Hajivandian
سه شنبه 04 مهر 1391, 14:42 عصر
برای جلوگیری از Flicker یا لرزش تصویر، تکنیکی به نام Double Buffering وجود داره؛ این تکنیک به این صورت عمل میکنه که در ابتدا تمامی ترسیمات درون بافری در حافظه انجام می شود و پس از آن بافر نهایی بر روی صفحه ترسیم میگردد؛ که این کار سبب جلوگیری از لرزش میشه.

اطلاعات بیشتر:
http://msdn.microsoft.com/en-us/library/b367a457.aspx
http://geekswithblogs.net/phinoppix/archive/2006/06/14/81838.aspx
http://www.codeproject.com/Articles/12870/Don-t-Flicker-Double-Buffer

توی فایل زیر یه نمونه ساده اش رو پیاده سازی کردم.

zayens
سه شنبه 04 مهر 1391, 22:24 عصر
باز هم از شما ممنونم!
اما امان از دست این سوالات چون یکی دیگش توی ذهنمه.
جناب حاجی جون چطور میشه به حرکت خط افکت Fade داد؟!!!
میخوام خط مورد نظر هنگام حرکت، اثرش بمونه و fade بشه
مثل شکل زیر:
93268

Hajivandian
چهارشنبه 05 مهر 1391, 18:10 عصر
برای دادن افکت Fade باید از خاصیت Alpha رنگها استفاده کنید.

zayens
پنج شنبه 06 مهر 1391, 14:03 عصر
خیلی از شما ممنونم آقای حاجیونـ...(ببخشید) جناب استاد حاجیوندیان
فقط اینکه من عکس پس زمینه و طول خط را که تغییر دادم(با حجم بالاتر) اونوقت برنامم بعد از چند دقیقه اجرا error‌ داد!
توی این قسمت:
// ترسیم پس زمینه درون بافر
context.DrawImage(background, 0, 0);
با این متن:

Out of Memory
البته روی یه کامپیوتر دیگه امتحان کردم و 6 - 7 دقیقه برنامه درست کار کرد و دیدم درست کار میکنه برنامه را بستم و شاید اگر بیشتر برنامه باز میموند روی اون هم همین ارور را میداد.
به نظرم باید بافر را در آخر خالی کرد تا حافظه نترکه! درسته؟

Hajivandian
پنج شنبه 06 مهر 1391, 15:59 عصر
دوباره سلام،
آره من یادم رفته بود که منابع حافظه رو آزاد کنم. برای رهاسازی منابع حافظه تابع Dispose در نظر گرفته شده

buffer.Dispose();

zayens
پنج شنبه 06 مهر 1391, 21:03 عصر
دوباره سلام،
آره من یادم رفته بود که منابع حافظه رو آزاد کنم. برای رهاسازی منابع حافظه تابع Dispose در نظر گرفته شده


دوباره ممنون

zayens
پنج شنبه 06 مهر 1391, 21:38 عصر
راستی توی این برنامه وقتی خط در حال دوران هست من دائما درجه ای که خط قرار گرفته را توی یه تکست باکس میریزم

// PictureBox ترسیم بافر بر روی کنترل
pboxMonitor.CreateGraphics().DrawImage(buffer, 0, 0);
txtDegree.Text =string.Format("{0:###.###}",Math.Abs((double)degree * 60));
buffer.Dispose();

برعکسشم امکان پذیره؟
آیا راهی هست که بشه مثلا توی یه تکست باکس یه درجه وارد کنیم و خط بره روی اون وایسه؟
در واقع میخوام توی یه تکست باکس عدد از 1 تا 360 (هر شماره مثلا در یه ثانیه) تغییر کنه و متناسب با عدد داخل تکست باکس، خط هم در همان درجه قرار بگیره!
حاجی جون جونم اگر اینکار را هم به من یاد بدهید براتون دعا میکنم!!

Hajivandian
جمعه 07 مهر 1391, 10:07 صبح
این برنامه داره از رادیان استفاده میکنه؛ برای اینکه عقربه رو روی یک درجه خاص تنظیم کنید باید درجه مورد نظرتون رو به رادیان تبدیل کنید و متغییر اصلی برنامه که رادیان جاری رو توی خودش نگه میداره رو بروزرسانی کنید.

فرمول های تبدیلات بین درجه و رادیان

radian=degree*PI/180;
degree=radian*180/PI;