خوارزمية رسم الدائرة لبريسنهام

خوارزمية رسم الدائرة لبريسنهام

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

  1. خوارزمية رسم دائرة منتصف النقطة
  2. خوارزمية رسم الدائرة لبريسنهام

لقد ناقشنا بالفعل خوارزمية رسم دائرة منتصف النقطة في منشورنا السابق. في هذا المنشور سنناقش خوارزمية رسم دائرة بريسنهام. 

تستخدم كلتا الخوارزميتين الميزة الرئيسية للدائرة وهي أنها متماثلة للغاية. لذا، بالنسبة للدائرة الكاملة التي تبلغ 360 درجة، سنقسمها إلى 8 أجزاء كل منها ثماني 45 درجة. وللقيام بذلك سوف نستخدم خوارزمية دائرة بريسنهام لحساب مواقع وحدات البكسل في الثماني الأول من 45 درجة. يفترض أن الدائرة مركزها نقطة الأصل. لذلك لكل بكسل (x y) يتم حسابه، نرسم بكسل في كل من الثماني الثمانية للدائرة كما هو موضح أدناه: 

بالنسبة للبيكسل (xy) جميع وحدات البكسل الممكنة في 8 أوكتاناتبالنسبة للبيكسل (xy) جميع وحدات البكسل الممكنة في 8 أوكتانات


سنرى الآن كيفية حساب موقع البكسل التالي من موقع بكسل معروف مسبقًا (x y). في خوارزمية بريسنهام عند أي نقطة (x y) لدينا خياران إما اختيار البكسل التالي في الشرق أي (x+1 y) أو في الجنوب الشرقي أي (x+1 y-1).
 

الدائرة 2


ويمكن تحديد ذلك باستخدام معلمة القرار d على النحو التالي: 
 

  • إذا كانت d > 0، فسيتم اختيار (x+1 y-1) لتكون البكسل التالي لأنه سيكون أقرب إلى القوس.
  • آخر (x+1 y) سيتم اختياره ليكون البكسل التالي.


الآن لرسم دائرة نصف قطرها 'r' ومركزها (xc yc) سنبدأ من (0 r) ونتحرك في الربع الأول حتى x=y (أي 45 درجة). يجب أن نبدأ من الحالة الأولية المذكورة: 
 

 d = 3 - (2 * r)   
x = 0
y = r

الآن لكل بكسل سنقوم بالعمليات التالية:  

  1. قم بتعيين القيم الأولية لـ (xc yc) و (x y).
  2. قم بتعيين معلمة القرار d إلى d = 3 – (2 * r).
  3. استدعاء الدالة drawCircle(int xc int yc int x int y).
  4. كرر الخطوات التالية حتى x <= y:
    • إذا د < 0 set d = d + (4 * x) + 6.
    • وإلا قم بتعيين d = d + 4 * (x - y) + 10 وإنقاص y بمقدار 1.
    • قم بزيادة قيمة x.
    • استدعاء الدالة drawCircle(int xc int yc int x int y).

وظيفة رسم الدائرة ():  

CPP
   // function to draw all other 7 pixels   // present at symmetric position   drawCircle  (  int     xc       int     yc       int     x       int     y  )   {      putpixel  (  xc  +  x       yc  +  y       RED  );      putpixel  (  xc  -  x       yc  +  y       RED  );      putpixel  (  xc  +  x       yc  -  y       RED  );      putpixel  (  xc  -  x       yc  -  y       RED  );      putpixel  (  xc  +  y       yc  +  x       RED  );      putpixel  (  xc  -  y       yc  +  x       RED  );      putpixel  (  xc  +  y       yc  -  x       RED  );      putpixel  (  xc  -  y       yc  -  x       RED  );   }   

فيما يلي تنفيذ C للنهج أعلاه. 

CPP
   // C-program for circle drawing   // using Bresenham’s Algorithm   // in computer-graphics   #include         #include         #include         // Function to put pixels   // at subsequence points   void     drawCircle  (  int     xc       int     yc       int     x       int     y  ){      putpixel  (  xc  +  x       yc  +  y       RED  );      putpixel  (  xc  -  x       yc  +  y       RED  );      putpixel  (  xc  +  x       yc  -  y       RED  );      putpixel  (  xc  -  x       yc  -  y       RED  );      putpixel  (  xc  +  y       yc  +  x       RED  );      putpixel  (  xc  -  y       yc  +  x       RED  );      putpixel  (  xc  +  y       yc  -  x       RED  );      putpixel  (  xc  -  y       yc  -  x       RED  );   }   // Function for circle-generation   // using Bresenham's algorithm   void     circleBres  (  int     xc       int     yc       int     r  ){      int     x     =     0       y     =     r  ;      int     d     =     3     -     2     *     r  ;      drawCircle  (  xc       yc       x       y  );      while     (  y     >=     x  ){          // check for decision parameter      // and correspondingly       // update d y      if     (  d     >     0  )     {      y  --  ;         d     =     d     +     4     *     (  x     -     y  )     +     10  ;      }      else      d     =     d     +     4     *     x     +     6  ;      // Increment x after updating decision parameter      x  ++  ;          // Draw the circle using the new coordinates      drawCircle  (  xc       yc       x       y  );      delay  (  50  );      }   }   int     main  ()   {      int     xc     =     50       yc     =     50       r     =     30  ;      int     gd     =     DETECT       gm  ;      initgraph  (  &  gd       &  gm       ''  );     // initialize graph      circleBres  (  xc       yc       r  );     // function call      return     0  ;   }   

الإخراج: 
 

الدائرة


المزايا  

  • إنها خوارزمية بسيطة.
  • يمكن تنفيذه بسهولة
  • يعتمد كليًا على معادلة الدائرة، أي x 2 2 = ص 2

العيوب  

  • هناك مشكلة في الدقة أثناء توليد النقاط.
  • هذه الخوارزمية غير مناسبة للصور الرسومية المعقدة والعالية.
إنشاء اختبار