logo

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

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

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

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

تعليم جافا للمبتدئين

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



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


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

الدائرة 2' loading='lazy' title=


ويمكن تحديد ذلك باستخدام معلمة القرار 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; } 

الإخراج: 
 

الدائرة' loading='lazy' title=

jvm في جافا


المزايا  

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

العيوب  

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