تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
[مثال] رسم ساعة بعقارب كتطبيق على رسم خط يصنع زاوية
#1
Lightbulb 
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته اعضاء المنتدى الكرام

فكرت من باب التطبيق على الرسم باستخدام مكتبات 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 وكذلك تحريك الساعة بالماوس
كود رسم الساعة معتمد على الدالة بشكل كامل تقريبا وقمت بشرح الكود داخل ملف البرنامج قدر المستطاع
اتمنى التوفيق للجميع وبانتظار الاسئلة والتعليقات والاقتراحات.


الملفات المرفقة
.zip   clock.zip (الحجم : 17.11 ك ب / التحميلات : 3)
الرد


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  ساعة مودرن بالغرافيك ابراهيم ايبو 6 576 04-04-20, 08:03 PM
آخر رد: ابراهيم ايبو
  عداد تصاعدي - تنازلي -ساعة زمنية ابراهيم ايبو 1 339 10-03-20, 10:21 AM
آخر رد: الوايلي
  مشروع ساعة بشكل جميل + حالة الطقس ودرجة الحرارة Rabeea Qbaha 3 1,399 18-06-19, 04:19 AM
آخر رد: Rabeea Qbaha
  [مشروع] ساعة تناظرية ربيع 7 3,097 09-07-15, 03:56 PM
آخر رد: ربيع

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم