PDA

View Full Version : دوران خط



rozegar21
یک شنبه 03 آبان 1388, 15:22 عصر
چطورمیشه توی سی شارپ یک خطی رو که رسم کردیم دوباره همون خط رو با زاویه داده شده و ثابت نسبت به X یا Y رسم کنیم

mostafa_shaeri_tj
یک شنبه 03 آبان 1388, 17:21 عصر
اگه یه سرچی میزدی تاپیک فراوون بود.:متفکر:

http://barnamenevis.org/forum/showthread.php?t=182661

rozegar21
یک شنبه 03 آبان 1388, 22:05 عصر
این لینک رو دیدم اما من چیزی ازش متوجه نمی شم ,توضیحاتی که استاد ما دادن با این چیزا فرق میکرد و مشکل دیکه ام اینه که توضیحات زیادی ندادین اگه لطف کنید ممنون میشم

Saeed.Masoumi
جمعه 08 آبان 1388, 03:31 صبح
سلام
با ابنکه به نظر خودم پست قبل کامل بود اما دوباره اینجا براتون یک توضیحات بیشتری می دم امیدوارم مشکلتون حل شود:
هدف:دوران خط قرمز حول مبداء مختصات به صورت پاد ساعت گرد
طول خط برابر با 50 (فرض) -- زاویه برابر با 0 تا 365 درجه
نکته 1:


Y=Hypotenuse*Sin(θ) & X=Hypotenuse*Cos(θ)
نکته 2: تبدیل درجه به رادیان:


private double DegreeToRadian(double angle)
{
return Math.PI * angle / 180.0;
}



حالا می ریم برنامه رو بنویسیم:
1- دو عدد Label رو فرمت اضافه کن اسمشون رو تغییر نده
2-یک عدد Button رو فرمت قرار بده اسمش رو تغییر نده
3-یک پانل 300 * 300 روی فرمت قرار بده اسمش رو تغییر نده
4-یک تایمر رو فرمت بزار اسمش رو تغییر نده
5-تو کد برنامه این متغییر ها رو اضافه کن:



private double ANG = 0;
private PointF point1;
private PointF point2;
private int Lenght = 50;
private Graphics G;
private double ang;
private double YLength = 0;
private double x = 0;

6-توی کد مربوط به رویداد کلیک از Button این کد رو قرار بده:



G = panel1.CreateGraphics();
Pen P=new Pen(Color.Red,2);
point1=new PointF(panel1.Width/2,panel1.Height/2);
point2 = new PointF(point1.X + Lenght, point1.Y);
G.DrawLine(P, point1, point2);
timer1.Enabled = true;
P.Dispose();

7-تو کد مربوط به رویداد تایمرت این کد رو قرار بده:



Pen p = new Pen(Color.Cyan);
ANG += 10;
if (ANG >= 360) { timer1.Enabled = false; }
ang = DegreeToRadian(ANG);
label2.Text = ANG.ToString();
YLength = Lenght * Math.Sin(ang);
x = Lenght * Math.Cos(ang);
point2 = new PointF((float)(point1.X + x), (float)(point1.Y - YLength));
G.DrawLine(p, point1, point2);
p.Dispose();

8-برنامه رو اجرا کن روی دکمه کلیک کن یک خط برات رسم می شه بعد حول مبداء مختصات به صورت پاد ساعت گرد 10 درجه 10 درجه دوران پیدا می کنه

سوال:برای دوران حول یک نقطه دیگه بجز مبدا چه باید کرد؟
جواب:مبدا مختصات را به آن نقطه انتقال می دهیم
سوال : برای دوران حول(نه نسبت به) محور ها چه باید کرد؟
جواب:محیط رسم ما 2 بعدی است لذا این کار امکان پذیر نیست
نکته خیلی مهم:
اصولی ترین روش برای یک مهندس نرم افزار که سعی در نوشتن برنامه های گرافیکی با محاسبات ریاضی دارد استفاده از ماتریس هاست چرا؟
چون شما برای دوران یک خط نیاز دارید نقطه انتهای آن را با جای دیگری انتقال دهید این کار به سادگی با استفاده از قابلیت Rotate از ماتریس ها قابل عمل است
دلیل دوم شما اگه نیاز داشته باشید مبدا مختصات رو انتقال بدید به سادگی با استفاده از Transform می توانید این کار را بکنید
دلیل سوم شما اگه نیاز دارید طول خط را نیز تغییر دهید تنها از با استفاده از خاصیت Scale می توانید این کار را بکنید
در ضمن این مطالب تنها در مورد رسم خط نیست همه موارد هندسی را شامل می شود و نیز تنها مربوط به محیط 2 بعدی نیست در محیط 3 بعدی نیز قابل استفاده است
فرض کنید بخواهید در فضای 3 بعدی خطی را حول نقطه ای دوران دهید آیا عاقلانه است از روش Cos,Sin,.... نسبتهای مثلثاتی که در بالا اشاره شد استفاده کنیم؟

اَرژنگ
جمعه 08 آبان 1388, 05:51 صبح
این لینک رو دیدم اما من چیزی ازش متوجه نمی شم ,توضیحاتی که استاد ما دادن با این چیزا فرق میکرد و مشکل دیکه ام اینه که توضیحات زیادی ندادین اگه لطف کنید ممنون میشم
توضیحات استاد شما چی بود؟ :متفکر:
توضیحات جناب معصومی کافی نبود؟:متعجب: به ندرتاً با اینمقدار توضیحات کامل و درست میشه برخورد، اگر ممکن است دقیقتر بگید که چی توضیح بیشتر لازم دارد. :لبخندساده:

rozegar21
جمعه 08 آبان 1388, 22:22 عصر
از لطفتون ممنونم جناب معصومی خیلی کمکم کردین
مرسیییییییییییییی:تشویق: