خوارزمية خط بريسنهام
خوارزمية بريسنهام للخطوط هي خوارزمية لرسم الخطوط ، تُحدد النقاط التي يجب اختيارها في صورة نقطية متعددة الأبعاد (n- dimensional) لرسم خط مستقيم تقريبًا بين نقطتين . تُستخدم هذه الخوارزمية عادةً لرسم الخطوط الأساسية في الصور النقطية (مثل شاشة الحاسوب )، لأنها تعتمد فقط على عمليات الجمع والطرح وإزاحة البتات ، وهي عمليات بسيطة للغاية في بنى الحواسيب التقليدية. تُصنف هذه الخوارزمية ضمن خوارزميات الخطأ التزايدي ، وهي من أوائل الخوارزميات التي طُورت في مجال رسومات الحاسوب . ويمكن استخدام امتداد للخوارزمية الأصلية، يُسمى خوارزمية دائرة نقطة المنتصف، لرسم الدوائر .
على الرغم من شيوع استخدام خوارزميات مثل خوارزمية وو في رسومات الحاسوب الحديثة لدعمها تقنية منع التعرج ، إلا أن خوارزمية بريسنهام للخطوط لا تزال ذات أهمية بالغة لسرعتها وبساطتها. تُستخدم هذه الخوارزمية في أجهزة مثل الراسمات وفي رقائق الرسومات في بطاقات الرسومات الحديثة ، كما أنها موجودة في العديد من مكتبات برامج الرسومات . ونظرًا لبساطتها، غالبًا ما تُدمج في البرامج الثابتة أو في مكونات الرسومات في بطاقات الرسومات الحديثة .
يُستخدم مصطلح "Bresenham" اليوم للإشارة إلى مجموعة من الخوارزميات التي توسع أو تعدل خوارزمية Bresenham الأصلية.
تاريخ
سُميت خوارزمية بريسنهام للخطوط نسبةً إلى جاك إلتون بريسنهام الذي طورها عام 1962 في شركة آي بي إم . وفي عام 2001 كتب بريسنهام: [ 1 ]
كنت أعمل في مختبر الحوسبة بمختبر تطوير IBM في سان خوسيه. كان جهاز رسم Calcomp موصولًا بجهاز IBM 1401 عبر وحدة تحكم الآلة الكاتبة 1407. كانت الخوارزمية قيد الاستخدام الفعلي بحلول صيف عام 1962، وربما قبل ذلك بشهر تقريبًا. في ذلك الوقت، كانت البرامج تُتبادل بحرية بين الشركات، لذا كان لدى Calcomp (جيم نيولاند وكالفن هيفت) نسخ منها. عندما عدت إلى جامعة ستانفورد في خريف عام 1962، وضعت نسخة في مكتبة مركز الحوسبة بالجامعة. قُبل وصف روتين رسم الخطوط للعرض في المؤتمر الوطني لجمعية ACM لعام 1963 في دنفر، كولورادو. كان ذلك عامًا لم تُنشر فيه أي وقائع، بل نُشر فقط جدول أعمال المتحدثين والمواضيع في عدد من مجلة Communications of the ACM. بعد عرضي، سألني أحد العاملين في مجلة IBM Systems Journal عما إذا كان بإمكانهم نشر الورقة. وافقتُ بكل سرور، وقاموا بنشرها عام 1965.
طريقة

سيتم تطبيق الاتفاقيات التالية:
- النقطة العلوية اليسرى هي (0,0) بحيث تزداد إحداثيات البكسل في الاتجاهين الأيمن والسفلي (على سبيل المثال، البكسل عند (7,4) يقع مباشرة فوق البكسل عند (7,5))، و
- مراكز البكسل لها إحداثيات عددية صحيحة.
تمثل البكسلات الموجودة عند نقطتي نهاية الخطو، حيث يمثل الإحداثي الأول في الزوج العمود، ويمثل الإحداثي الثاني الصف.
سيتم عرض الخوارزمية مبدئيًا فقط للجزء الثُمن الذي يتجه فيه الجزء لأسفل ولليمين (و)، وإسقاطها الأفقيأطول من الإسقاط الرأسي(الخط له ميل موجب أقل من 1). في هذا الثمن، لكل عمود x بينويوجد صف واحد فقط y (محسوب بواسطة الخوارزمية) يحتوي على بكسل من الخط، بينما كل صف بينوقد تحتوي على عدة وحدات بكسل مُرَسَّمة.
تختار خوارزمية بريسنهام العدد الصحيح y المقابل لمركز البكسل الأقرب إلى قيمة y المثالية (الكسرية) لنفس قيمة x ؛ في الأعمدة المتتالية، يمكن أن تظل قيمة y كما هي أو تزيد بمقدار 1. المعادلة العامة للخط المستقيم المار بنقطتي النهاية هي:
- .
بما أننا نعرف العمود، x ، فإن صف البكسل، y ، يُعطى بتقريب هذه الكمية إلى أقرب عدد صحيح:
- .
المنحدريعتمد على إحداثيات نقطة النهاية فقط ويمكن حسابه مسبقًا، ويمكن حساب قيمة y المثالية لقيم x الصحيحة المتتالية بدءًا منوإضافة الميل بشكل متكرر.
عمليًا، لا تتتبع الخوارزمية إحداثي y، الذي يزداد بمقدار m = ∆y/∆x في كل مرة تزداد فيها قيمة x بمقدار واحد؛ بل تحتفظ بحد خطأ في كل مرحلة، يمثل معكوس المسافة من (أ) النقطة التي يخرج عندها الخط من البكسل إلى (ب) الحافة العلوية للبكسل. تُضبط هذه القيمة أولًا على(بسبب استخدام إحداثيات مركز البكسل)، ويتم زيادتها بمقدار m في كل مرة يتم فيها زيادة الإحداثي x بمقدار واحد. إذا أصبح الخطأ أكبر من 0.5 ، فإننا نعلم أن الخط قد تحرك لأعلى بمقدار بكسل واحد، وأنه يجب علينا زيادة الإحداثي y وإعادة ضبط الخطأ لتمثيل المسافة من أعلى البكسل الجديد - ويتم ذلك عن طريق طرح واحد من الخطأ. [ 2 ]
الاشتقاق
لاستخلاص خوارزمية بريسنهام، يجب اتخاذ خطوتين: الأولى هي تحويل معادلة الخط من شكل الميل والمقطع النموذجي إلى معادلة ضمنية بمعاملات صحيحة، والثانية هي استخدام هذه المعادلة الجديدة لرسم خط بناءً على فكرة تراكم الخطأ.
معادلة الخط


يُكتب معادلة الخط المستقيم بصيغة الميل والمقطع كما يلي:
أينهو الميل وهو نقطة تقاطع المحور الصادي . لأن هذه دالة لـلا يمكنها تمثيل خط عمودي. لذلك، سيكون من المفيد كتابة هذه المعادلة كدالة لكليهما.والقدرة على رسم خطوط بأي زاوية. يمكن التعبير عن زاوية (أو ميل) الخط بـ "الارتفاع على الامتداد الأفقي"، أوثم، باستخدام التلاعب الجبري،
بجعل هذه المعادلة الأخيرة دالة لـو، ويمكن كتابتها على النحو التالي
حيث الثوابت هي
ثم يتم تعريف الخط لبعض الثوابت،، وفي أي مكانأي، بالنسبة لأيليس على الخط،لا يتضمن هذا الشكل إلا الأعداد الصحيحة إذاوهي أعداد صحيحة، لأن الثوابت،، ويتم تعريفها على أنها أعداد صحيحة.
على سبيل المثال، السطرويمكن كتابة ذلك على النحو التاليالنقطة (2،2) تقع على الخط
والنقطة (2،3) ليست على الخط
ولا النقطة (2,1)
لاحظ أن النقطتين (2،1) و(2،3) تقعان على جانبين متقابلين من الخط وتكون قيمتها موجبة أو سالبة. يقسم الخط المستوى إلى نصفين، ويكون النصف الذي يحمل قيمة سالبة هو النصف الذي يحمل قيمة سالبة.يمكن تسمية النصف الأول بالنصف السالب من المستوى، والنصف الآخر بالنصف الموجب. هذه الملاحظة بالغة الأهمية في بقية الاشتقاق.
الخوارزمية
نقطة البداية على الخط
فقط لأن الخط محدد ليبدأ وينتهي عند إحداثيات عددية صحيحة (على الرغم من أنه من المعقول تمامًا الرغبة في رسم خط بنقاط نهاية غير عددية صحيحة).

مع الأخذ في الاعتبار أن الميل هو على الأكثر، والمشكلة الآن تكمن في ما إذا كان ينبغي أن تكون النقطة التالية عندأوربما يكون من البديهي اختيار النقطة بناءً على النقطة الأقرب إلى الخط عندإذا كانت النقطة أقرب إلى الأولى، فأدرج الأولى على الخط، وإذا كانت الثانية، فأدرج الثانية. وللإجابة على هذا السؤال، احسب دالة الخط عند نقطة المنتصف بين هاتين النقطتين:
إذا كانت قيمة هذا موجبة، فإن الخط المثالي يقع أسفل نقطة المنتصف وأقرب إلى النقطة المرشحة.أي أن الإحداثي y يجب أن يزداد. وإلا، فإن الخط المثالي يمر عبر نقطة المنتصف أو فوقها، ويجب أن يبقى الإحداثي y كما هو؛ وفي هذه الحالة تكون النقطةيتم اختيارها. قيمة دالة الخط عند نقطة المنتصف هذه هي المحدد الوحيد للنقطة التي يجب اختيارها.
تُظهر الصورة المجاورة النقطة الزرقاء (2،2) التي تم اختيارها لتكون على الخط مع نقطتين مرشحتين باللون الأخضر (3،2) و(3،3). أما النقطة السوداء (3، 2.5) فهي نقطة المنتصف بين النقطتين المرشحتين.
خوارزمية لحساب الأعداد الصحيحة
بدلاً من ذلك، يمكن استخدام الفرق بين النقاط بدلاً من حساب قيمة f(x,y) عند منتصف المسافة. تتيح هذه الطريقة البديلة إجراء العمليات الحسابية على الأعداد الصحيحة فقط، وهي أسرع عمومًا من استخدام العمليات الحسابية على الأعداد العشرية . لاستنتاج الطريقة الأخرى، نُعرّف الفرق كما يلي:
بالنسبة للقرار الأول، فإن هذه الصيغة تعادل طريقة نقطة المنتصف لأنعند نقطة البداية. بتبسيط هذا التعبير نحصل على:
كما هو الحال مع طريقة نقطة المنتصف، إذاإذا كانت النتيجة موجبة، فاختروإلا فاختر.
لويتم اختياره، والتغيير فيسيكون:
لويتم اختيار التغيير فيسيكون:
إذا كانت قيمة D الجديدة موجبة،يتم اختياره، وإلايمكن تعميم هذا القرار من خلال تراكم الخطأ في كل نقطة لاحقة.

تم إنجاز جميع اشتقاقات الخوارزمية. إحدى مشكلات الأداء هي العامل 1/2 في القيمة الأولية لـ D. بما أن كل هذا يتعلق بإشارة الفرق المتراكم، فيمكن ضرب كل شيء في 2 دون أي تأثير.
ينتج عن ذلك خوارزمية تستخدم فقط العمليات الحسابية للأعداد الصحيحة.
plotLine(x0, y0, x1, y1) dx = x1 - x0 dy = y1 - y0 D = 2*dy - dx y = y0 لكل قيمة x من x0 إلى x1 plot(x, y) إذا كانت D > 0 ص = ص + 1 D = D + (2 * (dy - dx)) آخر D = D + 2*dy نهاية الشرط
تشغيل هذه الخوارزمية لـينتج عن الانتقال من (0,1) إلى (6,4) الفروق التالية مع dx=6 و dy=3:
D=2*3-6=0 كرر من 0 إلى 6 * x=0: plot(0, 1) , D≤0: D=0+6=6 * x=1: plot(1, 1) , D>0: D=6-12=-6, y=1+1=2, D=-6+6=0 * x=2: plot(2, 2) , D≤0: D=0+6=6 * x=3: plot(3, 2) , D>0: D=6-12=-6, y=2+1=3, D=-6+6=0 * x=4: plot(4, 3) , D≤0: D=0+6=6 * x=5: plot(5, 3) , D>0: D=6-12=-6, y=3+1=4, D=-6+6=0 * x=6: plot(6, 4) , D≤0: D=0+6=6
تظهر نتيجة هذا الرسم البياني على اليمين. يمكن عرض الرسم البياني إما بتحديد نقاط تقاطع الخطوط (الدوائر الزرقاء) أو بتعبئة مربعات البكسل (المربعات الصفراء). في كلتا الحالتين، يبقى الرسم البياني كما هو.
جميع الحالات
ومع ذلك، كما ذكر أعلاه، فإن هذا يعمل فقط بالنسبة للثمانية الصفرية، أي الخطوط التي تبدأ من نقطة الأصل بميل بين 0 و 1 حيث تزداد قيمة x بمقدار 1 بالضبط لكل تكرار وتزداد قيمة y بمقدار 0 أو 1.
يمكن توسيع الخوارزمية لتغطية المنحدرات بين 0 و -1 عن طريق التحقق مما إذا كان y بحاجة إلى الزيادة أو النقصان (أي dy < 0).
plotLineLow(x0, y0, x1, y1) dx = x1 - x0 dy = y1 - y0 yi = 1 إذا كانت قيمة dy أقل من 0 yi = -1 dy = -dy نهاية الشرط D = (2 * dy) - dx y = y0 لكل قيمة x من x0 إلى x1 plot(x, y) إذا كانت D > 0 ص = ص + صي D = D + (2 * (dy - dx)) آخر D = D + 2*dy نهاية الشرط
عن طريق تبديل المحورين السيني والصادي، يمكن كتابة تطبيق للمنحدرات الحادة الموجبة أو السالبة على النحو التالي
plotLineHigh(x0, y0, x1, y1) dx = x1 - x0 dy = y1 - y0 xi = 1 إذا كانت dx < 0 xi = -1 dx = -dx نهاية الشرط D = (2 * dx) - dy x = x0 لكل قيمة y من y0 إلى y1 plot(x, y) إذا كانت D > 0 x = x + xi D = D + (2 * (dx - dy)) آخر D = D + 2*dx نهاية الشرط
يتطلب الحل الكامل تحديد ما إذا كانت x1 > x0 أو y1 > y0 وعكس إحداثيات الإدخال قبل الرسم، وبالتالي
ارسم الخط (x0، y0، x1، y1) إذا كانت القيمة المطلقة لـ (y1 - y0) أقل من القيمة المطلقة لـ (x1 - x0) إذا كانت x0 أكبر من x1 plotLineLow(x1, y1, x0, y0) آخر plotLineLow(x0, y0, x1, y1) نهاية الشرط، وإلا إذا كان y0 > y1 plotLineHigh(x1, y1, x0, y0) آخر plotLineHigh(x0, y0, x1, y1) نهاية الشرط نهاية الشرط
في التطبيقات منخفضة المستوى التي تصل إلى ذاكرة الفيديو مباشرة، سيكون من المعتاد معالجة الحالات الخاصة للخطوط الرأسية والأفقية بشكل منفصل حيث يمكن تحسينها بشكل كبير.
تستخدم بعض الإصدارات مبادئ بريسنهام للخطأ التزايدي الصحيح لإجراء جميع عمليات رسم الخطوط الثمانية، مع موازنة الخطأ الموجب والسالب بين إحداثيات x و y. [ 3 ]
plotLine(x0, y0, x1, y1) dx = abs(x1 - x0) sx = x0 < x1 ؟ 1 : -1 dy = -abs(y1 - y0) sy = y0 < y1 ? 1 : -1 الخطأ = dx + dy صحيح plot(x0, y0) e2 = 2 * الخطأ إذا كان e2 >= dy، وإذا كان x0 == x1، فتوقف. الخطأ = الخطأ + dy x0 = x0 + sx إذا كان e2 ≤ dx، وإذا كان y0 ≥ y1 ، فاخرج من الحلقة. الخطأ = الخطأ + dx y0 = y0 + sy نهاية الشرط نهاية الحلقة
خوارزميات مماثلة
يمكن تفسير خوارزمية بريسنهام على أنها محلل تفاضلي رقمي معدل قليلاً (باستخدام 0.5 كعتبة خطأ بدلاً من 0، وهو أمر مطلوب لرسم المضلعات غير المتداخلة).
يُستخدم مبدأ استخدام الخطأ التزايدي بدلاً من عمليات القسمة في تطبيقات أخرى في مجال الرسومات. فمن الممكن استخدام هذه التقنية لحساب إحداثيات U وV أثناء المسح النقطي للمضلعات ذات الخرائط النسيجية. [ 4 ] كما تستخدم محركات عرض خرائط الارتفاعات ثلاثية الأبعاد (فوكسل) المستخدمة في بعض ألعاب الحاسوب الشخصي هذا المبدأ.
نشر بريسنهام أيضًا خوارزمية حسابية تعتمد على تقنية Run-Slice: فبينما تُجري خوارزمية Run-Length المذكورة أعلاه حلقةً على المحور الرئيسي، تُجري خوارزمية Run-Slice حلقةً في الاتجاه المعاكس. [ 5 ] وقد تم توثيق هذه الطريقة في عدد من براءات الاختراع الأمريكية.
- براءة الاختراع الأمريكية رقم 5815163 ، "طريقة وجهاز لرسم شرائح خطية أثناء الحساب"
- براءة الاختراع الأمريكية رقم 5740345 ، "طريقة وجهاز لعرض بيانات رسومات الحاسوب المخزنة بتنسيق مضغوط مع نظام فهرسة ألوان فعال"
- براءة الاختراع الأمريكية رقم 5657435 ، "تشغيل محرك رسم خطوط الشرائح مع إمكانيات التحجيم غير الخطي"
- براءة الاختراع الأمريكية رقم 5627957 ، "تشغيل محرك رسم خطوط الشرائح بقدرات معالجة محسّنة"
- براءة الاختراع الأمريكية رقم 5627956 ، "تشغيل محرك رسم خطوط الشرائح مع إمكانيات التمديد"
- براءة الاختراع الأمريكية رقم 5617524 ، "تشغيل محرك رسم خطوط القطع مع إمكانيات التظليل"
- براءة الاختراع الأمريكية رقم 5611029 ، "تشغيل محرك رسم خطوط القطع مع إمكانيات التظليل غير الخطي"
- براءة الاختراع الأمريكية رقم 5604852 ، "طريقة وجهاز لعرض منحنى بارامتري على شاشة عرض فيديو"
- براءة الاختراع الأمريكية رقم 5600769 ، "تشغيل محرك رسم خطوط القطع بتقنيات قص محسّنة"
تم توسيع نطاق الخوارزمية لتشمل:
- رسم خطوط بسمك عشوائي، وهي خوارزمية ابتكرها آلان مورفي في شركة IBM. [ 6 ]
- ارسم أنواعًا متعددة من المنحنيات (الدوائر، والقطع الناقصة، والمنحنيات التكعيبية، والمنحنيات التربيعية، والمنحنيات النسبية بيزير ) والخطوط والمنحنيات المضادة للتشويش؛ مجموعة من الخوارزميات من تأليف ألويس زينجل. [ 3 ]
انظر أيضاً
- محلل تفاضلي رقمي (خوارزمية رسومية) ، طريقة بسيطة وعامة لتحويل الخطوط والمثلثات إلى صور نقطية
- خوارزمية الخطوط الخاصة بـ Xiaolin Wu ، وهي طريقة سريعة مماثلة لرسم الخطوط مع خاصية منع التعرج.
- خوارزمية دائرة نقطة المنتصف ، وهي خوارزمية مشابهة لرسم الدوائر
ملحوظات
- ↑ بول إي. بلاك. قاموس الخوارزميات وهياكل البيانات، المعهد الوطني للمعايير والتكنولوجيا (NIST ). https://xlinux.nist.gov/dads/HTML/bresenham.html
- ↑ جوي، كينيث. "خوارزمية بريسنهام" (ملف PDF) . مجموعة أبحاث التصور والرسومات، قسم علوم الحاسوب، جامعة كاليفورنيا، ديفيس . تم الاطلاع عليه بتاريخ 20 ديسمبر 2016 .
- 1 2 زينجل، ألويس (2016) [نُشر سابقًا في عام 2012]. خوارزمية تحويل المنحنيات إلى صور نقطية (ملف PDF) (تقرير).ملخص وعرض توضيحي بصيغة HTML: زينجل، ألويس (2020) [نُشر سابقًا في 2012]. "جمال خوارزمية بريسنهام" . zingl.github.io .
- ↑ براءة الاختراع الأمريكية رقم 5739818 ، سباكمان، جون نيل، "جهاز وطريقة لإجراء استيفاء صحيح منظورياً في رسومات الحاسوب"، نُشرت في 14 أبريل 1998، مُسجلة باسم شركة كانون المحدودة.
- ↑ "كتاب مايكل أبرش الأسود لبرمجة الرسومات - الطبعة الخاصة: الجيد والسيئ والمُجزأ" . www.phatcode.net . تاريخ الاطلاع: 13 فبراير 2024 .؛
- ↑ "خوارزمية خط بريسنهام المعدلة لمورفي" . homepages.enterprise.net . تم الاطلاع عليه بتاريخ 9 يونيو 2018 .('زيادة سمك الخط عن طريق تعديل خوارزمية بريسنهام' في نشرة الإفصاح الفني لشركة IBM المجلد 20 العدد 12 مايو 1978 الصفحات 5358-5366.)
مراجع
- بريسنهام، جيه إي (1965). "خوارزمية للتحكم الحاسوبي في الراسمة الرقمية" (ملف PDF) . مجلة أنظمة آي بي إم . 4 (1): 25-30 . doi : 10.1147/sj.41.0025 . مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 28 مايو 2008.
- "خوارزمية بريسنهام لرسم الخطوط" ، بقلم كولين فلانغان
- أبرش، مايكل (1997). كتاب مايكل أبرش الأسود في برمجة الرسومات . ألباني، نيويورك: كوريوليس. الصفحات 654-678 . ISBN 978-1-57610-174-2.نسخة محسّنة للغاية من الخوارزمية مكتوبة بلغة C ولغة التجميع، مُخصصة للاستخدام في ألعاب الفيديو، مع تفاصيل كاملة عن آليات عملها الداخلية.
- زينجل، ألويس (2016) [2012]. "خوارزمية تحويل الصور النقطية لرسم المنحنيات" (PDF) .جمال خوارزميات بريسنهام
للمزيد من القراءة
- أطروحة باتريك جيلسباندا ، التي تتضمن امتدادًا لخوارزمية بريسنهام لرسم الخطوط لإجراء إزالة الخطوط المخفية ثلاثية الأبعاد
- نُشر أيضًا في وقائع مؤتمر MICAD '87 حول التصميم بمساعدة الحاسوب/التصنيع بمساعدة الحاسوب ورسومات الحاسوب، صفحة 591 - ISBN 2-86601-084-1.
- زيادة سمك الخط عن طريق تعديل خوارزمية بريسنهام ، إيه إس مورفي، نشرة الإفصاح الفني لشركة آي بي إم، المجلد 20، العدد 12، مايو 1978.
- بريسنهام، جاك (فبراير 1977). "خوارزمية خطية للعرض الرقمي التزايدي للأقواس الدائرية". اتصالات رابطة آلات الحوسبة . 20 (2): 100-106 . doi : 10.1145/359423.359432 .– وأيضًا التقرير الفني 1964 يناير-27 -11- خوارزمية الدائرة TR-02-286 مختبر آي بي إم سان خوسيه
روابط خارجية
- كتاب مايكل أبرش الخاص في برمجة الرسومات: الفصل 35: بريسنهام سريع، والسرعة جيدة
- خوارزمية بريسنهام لرسم الخطوط من تأليف كولين فلانغان
- صفحة المعهد الوطني للمعايير والتكنولوجيا حول خوارزمية بريسنهام
- معلومات عن الراسمة التزايدية Calcomp 563
- خوارزمية بريسنهام في العديد من لغات البرمجة
- جمال خوارزمية بريسنهام - تطبيق بسيط لرسم الخطوط والدوائر والأهليجات ومنحنيات بيزير
- خوارزميات رسومات الحاسوب
- الهندسة الرقمية
