ليس من السهل عرض قوس سلس مستمر على شاشة الكمبيوتر حيث أن شاشة الكمبيوتر الخاصة بنا مصنوعة من وحدات البكسل المنظمة في شكل مصفوفة. لذا، لرسم دائرة على شاشة الكمبيوتر، يجب علينا دائمًا اختيار أقرب وحدات البكسل من البكسل المطبوع حتى تتمكن من تشكيل قوس. هناك خوارزميتان للقيام بذلك:
- خوارزمية رسم دائرة منتصف النقطة
- خوارزمية رسم الدائرة لبريسنهام
لقد ناقشنا بالفعل خوارزمية رسم دائرة منتصف النقطة في منشورنا السابق. في هذا المنشور سنناقش خوارزمية رسم دائرة بريسنهام.
تعليم جافا للمبتدئين
تستخدم كلتا الخوارزميتين الميزة الرئيسية للدائرة وهي أنها متماثلة للغاية. لذا، بالنسبة للدائرة الكاملة التي تبلغ 360 درجة، سنقسمها إلى 8 أجزاء كل منها ثماني 45 درجة. وللقيام بذلك سوف نستخدم خوارزمية دائرة بريسنهام لحساب مواقع وحدات البكسل في الثماني الأول من 45 درجة. يفترض أن الدائرة مركزها نقطة الأصل. لذلك لكل بكسل (x y) يتم حسابه، نرسم بكسل في كل من الثماني الثمانية للدائرة كما هو موضح أدناه:
بالنسبة للبيكسل (xy) جميع وحدات البكسل الممكنة في 8 أوكتانات
سنرى الآن كيفية حساب موقع البكسل التالي من موقع بكسل معروف مسبقًا (x y). في خوارزمية بريسنهام عند أي نقطة (x y) لدينا خياران إما اختيار البكسل التالي في الشرق أي (x+1 y) أو في الجنوب الشرقي أي (x+1 y-1).
ويمكن تحديد ذلك باستخدام معلمة القرار 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
الآن لكل بكسل سنقوم بالعمليات التالية:
- قم بتعيين القيم الأولية لـ (xc yc) و (x y).
- قم بتعيين معلمة القرار d إلى d = 3 – (2 * r).
- استدعاء الدالة drawCircle(int xc int yc int x int y).
- كرر الخطوات التالية حتى 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; }
الإخراج:

jvm في جافا
المزايا
- إنها خوارزمية بسيطة.
- يمكن تنفيذه بسهولة
- يعتمد كليًا على معادلة الدائرة، أي x2+ص2= ص2
العيوب
- هناك مشكلة في الدقة أثناء توليد النقاط.
- هذه الخوارزمية غير مناسبة للصور الرسومية المعقدة والعالية.