منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب
[مثال] رسم ساعة بعقارب كتطبيق على رسم خط يصنع زاوية - نسخة قابلة للطباعة

+- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb)
+-- قسم : قسم لغة السي شارب C#.NET (http://vb4arb.com/vb/forumdisplay.php?fid=175)
+--- قسم : قسم امثلة ومشاريع C#.NET (http://vb4arb.com/vb/forumdisplay.php?fid=179)
+--- الموضوع : [مثال] رسم ساعة بعقارب كتطبيق على رسم خط يصنع زاوية (/showthread.php?tid=35865)



رسم ساعة بعقارب كتطبيق على رسم خط يصنع زاوية - Anas Mahmoud - 28-07-20

بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته اعضاء المنتدى الكرام

فكرت من باب التطبيق على الرسم باستخدام مكتبات GDI+ ان اقوم بعمل ساعة تناظرية بالشكل التالي :




نلاحظ انه باستثناء الدائرة فان الساعة تتكون من خطوط مختلفة الطول ومختلفة الزوايا ، ونلاحظ ايضا ان كل هذة الخطوط مركزها نقطة واحدة
المشكلة ان Graphics.DrawLine ترسم خط بمعلومية نقطة بدايته ونقطة نهايته فقط ، لذلك نحن اولا بحاجة الى تعريف دالة خاصة لرسم تلك الخطوط.

المكشلة : 

نريد تعريف دالة يمكنها رسم خط بمعلومية التالي
1. الزاوية التي يصنعها الخط مع الافقي ( angle ) :

2. طول الخط ( length ):
3. احداثي نقطة المركز للخط المرسوم ( center ) :
4. نسبة الجزء المرسوم من الخط ( p ) :

الحل : 

اولا : نقوم بتعريف الدالة بالمدخلات التي نريدها بالاضافة الى مدخل من نوع Graphics للرسم عليه ومدخل من نوع Pen للرسم به :

كود :
public void DrawLine(Graphics gr , Pen pen, double angle, Point center, int length, double p = 1)
{}

ثانيا :لكي نستخدم Graphics.DrawLine يحب ان يكون لدينا احداثيات نقطتي البداية والنهاية للخط المرسوم، ولكي نحصل عليهما نحن بحاجة لان نحول الاحداثيات القطبية التي لدينا ( طول الخط والزاوية التي يصنعها ) الى احداثيات كرتيزينية ( x , y ) عن طريق Math.Sin و Math.Cos :
x , y التي حصلنا عليها تمثل احداثيات النقطة الحمراء والتي هيا احداثيات نقطة نهاية الخط المرسوم من نقطة الاصل (0,0) :

كود :
var EndPoint = new Point(
               (int)( Math.Cos(angle) * length),
               (int)( Math.Sin(angle) * length));

لرسم الخط من نقطة المركز المعطاه نضيف احداثيات المركز الى احداثيات الخط المرسوم :

كود :
var StartPoint = new Point(
               (int)(center.X ),
               (int)(center.Y ));

           var EndPoint = new Point(
               (int)(center.X + Math.Cos(angle) * length),
               (int)(center.Y + Math.Sin(angle) * length));

لرسم جزء بنسبة معينة من الخط نكون بحاجة لتغير نقطة البداية بالتالي :

كود :
var StartPoint = new Point(
               (int)(center.X + Math.Cos(angle) * length * (1 - p)),
               (int)(center.Y + Math.Sin(angle) * length * (1 - p)));

واخيرا نقوم برسم الخط باستخدام DrawLine :

كود :
 gr.DrawLine(pen, StartPoint, EndPoint);
يصبح كود الدالة كاملا هو :
كود :
public void DrawLine(Graphics gr , Pen pen, double angle, Point center, int length, double p = 1)
       {
           var StartPoint = new Point(
               (int)(center.X + Math.Cos(angle) * length * (1 - p)),
               (int)(center.Y + Math.Sin(angle) * length * (1 - p)));

           var EndPoint = new Point(
               (int)(center.X + Math.Cos(angle) * length),
               (int)(center.Y + Math.Sin(angle) * length));

           gr.DrawLine(pen, StartPoint, EndPoint);

       }

وكمثال على استخدام الدالة قمت بعمل مثال بسيط للساعة بالشكل التالي :

لاحظ انه يمكنك تغيير ابعاد الساعة بال slider وكذلك تحريك الساعة بالماوس
كود رسم الساعة معتمد على الدالة بشكل كامل تقريبا وقمت بشرح الكود داخل ملف البرنامج قدر المستطاع
اتمنى التوفيق للجميع وبانتظار الاسئلة والتعليقات والاقتراحات.