logo

خوارزمية خط بريسنهام

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

في هذه الطريقة، البكسل التالي المحدد هو البكسل الذي لديه أقل مسافة من الخط الحقيقي.

الطريقة تعمل كالتالي:

افترض بكسل P1'(خ1'،و1')، ثم حدد وحدات البكسل اللاحقة أثناء عملنا حتى الليل، موضع بكسل واحد في كل مرة في الاتجاه الأفقي نحو P2'(خ2'،و2').

بمجرد اختيار بكسل في أي خطوة

قم بإيقاف تشغيل وضع المطور

البكسل التالي هو

  1. إما الذي على يمينه (الحد الأدنى للخط)
  2. واحد أعلى يمينه وأعلى (الحد العلوي للخط)

يتم تقريب الخط بشكل أفضل بواسطة وحدات البكسل التي تقع على أقل مسافة من المسار بين P1'، ص2'.

بريسنهام

لاختيار البيكسل التالي بين البكسل السفلي S والبكسل العلوي T.
إذا تم اختيار S
لدينا سأنا+1أنا+1 و صأنا+1=yأنا
إذا تم اختيار T
لدينا سأنا+1أنا+1 و صأنا+1=yأنا+1

إحداثيات y الفعلية للخط عند x = xأنا+1يكون
ص=مكسأنا+1

بريسنهام

المسافة من S إلى الخط الفعلي في اتجاه y
ق = ص-صأنا

المسافة من T إلى الخط الفعلي في اتجاه y
ر = (صأنا+1)-ص

الآن فكر في الفرق بين قيمتي المسافة هاتين
شارع

عندما (ق-ر)<0 ⟹ s < t< p>

أقرب بكسل هو S

عندما (s-t) ≧0 ⟹ ث

أقرب بكسل هو T

هذا الفرق
s-t = (y-yi)-[(yi+1)-y]
= 2y - 2yi -1

بريسنهام

استبدال م ب بريسنهاموإدخال متغير القرار
دأنا=△x (s-t)
دأنا=△س (2 بريسنهام(xأنا+1)+2b-2yأنا-1)
=2△xyأنا-2△y-1△x.2b-2yأنا△س-△س
دأنا=2△y.xأنا-2△x.yأنا

حيث ج= 2△ص+△س (2ب-1)

يمكننا كتابة متغير القرار دأنا+1للانزلاق التالي
دأنا+1=2△y.xأنا+1-2△x.yأنا+1
دأنا+1أنا=2△ص.(سأنا+1-xأنا)- 2△x(صأنا+1أنا)

بما أن x_(i+1)=xأنا+1، لدينا
دأنا+1أنا=2△ص.(سأنا+1-سأنا)- 2△x(صأنا+1أنا)

حالات خاصة

إذا كان البكسل المختار في أعلى البكسل T (أي dأنا≧0)⟹ وأنا+1=yأنا+1
دأنا+1أنا+2△ص-2△س

إذا كان البكسل المختار موجودًا في البكسل السفلي T (أي dأنا<0)⟹ yأنا+1=صأنا
دأنا+1أنا+2△ص

وأخيراً نحسب د1
د1=△س[2م(س1+1)+2b-2y1-1]
د1=△س[2(مكس1+ب-ذ1)+2m-1]

منذ م1+ب-ذأنا=0 و م = ، لدينا
د1=2△ص-△س

ميزة:

1. إنها تتضمن فقط العمليات الحسابية الصحيحة، لذا فهي بسيطة.

2. يتجنب توليد النقاط المكررة.

3. يمكن تنفيذها باستخدام الأجهزة لأنها لا تستخدم الضرب والقسمة.

4. إنه أسرع بالمقارنة مع DDA (المحلل التفاضلي الرقمي) لأنه لا يتضمن حسابات الفاصلة العائمة مثل خوارزمية DDA.

العيب:

1. هذه الخوارزمية مخصصة لرسم الخطوط الأساسية فقط. التهيئة ليست جزءًا من خوارزمية خط بريسنهام. لذا، لرسم خطوط ناعمة، يجب أن تبحث في خوارزمية مختلفة.

خوارزمية خط بريسنهام:

الخطوة 1: بدء الخوارزمية

الخطوة 2: أعلن المتغير x1،x2،و1،و2، د، ط1،أنا2،دكس،دي

الخطوه 3: أدخل قيمة x1،و1،x2،و2
حيث س1،و1هي إحداثيات نقطة البداية
وx2،و2هي إحداثيات نقطة النهاية

الخطوة 4: احسب دكس = س2-x1
احسب دى = ص21
احسب ط1=2*أنت
احسب ط2=2*(دي-دكس)
احسب د=ط1-dx

الخطوة 5: اعتبر (x، y) كنقطة بداية وxنهايةأقصى قيمة ممكنة لـ x.
إذا دي إكس<0
ثم س = س2
ص = ص2
سنهاية1
إذا كان dx> 0
ثم س = س1
ص = ص1
سنهاية2

الخطوة 6: إنشاء نقطة عند الإحداثيات (x,y).

الخطوة 7: تحقق مما إذا تم إنشاء الخط بأكمله.
إذا س > = سنهاية
قف.

الخطوة 8: حساب إحداثيات البكسل التالي
إذا د<0
ثم د = د + ط1
إذا د ≧ 0
ثم د = د + ط2
زيادة ص = ص + 1

الخطوة 9: الزيادة س = س + 1

الخطوة 10: ارسم نقطة بأحدث الإحداثيات (x، y).

الخطوة 11: انتقل إلى الخطوة 7

جافا العودية

الخطوة 12: نهاية الخوارزمية

مثال: موضع البداية والنهاية للخط هو (1، 1) و (8، 5). البحث عن نقاط وسيطة.

حل: س1=1
و1=1
س2=8
و2=5
دكس = س2-x1=8-1=7
أنت=ص21=5-1=4
أنا1=2* ∆ص=2*4=8
أنا2=2*(∆y-∆x)=2*(4-7)=-6
د = أنا1-∆س=8-7=1

س و د=د+أنا1أو أنا2
1 1 د + أنا2=1+(-6)=-5
2 2 د + أنا1=-5+8=3
3 2 د + أنا2=3+(-6)=-3
4 3 د + أنا1=-3+8=5
5 3 د + أنا2=5+(-6)=-1
6 4 د + أنا1=-1+8=7
7 4 د + أنا2=7+(-6)=1
8 5

برنامج لتنفيذ خوارزمية بريسنهام لرسم الخط:

 #include #include void drawline(int x0, int y0, int x1, int y1) { int dx, dy, p, x, y; dx=x1-x0; dy=y1-y0; x=x0; y=y0; p=2*dy-dx; while(x=0) { putpixel(x,y,7); y=y+1; p=p+2*dy-2*dx; } else { putpixel(x,y,7); p=p+2*dy;} x=x+1; } } int main() { int gdriver=DETECT, gmode, error, x0, y0, x1, y1; initgraph(&amp;gdriver, &amp;gmode, &apos;c:\turboc3\bgi&apos;); printf(&apos;Enter co-ordinates of first point: &apos;); scanf(&apos;%d%d&apos;, &amp;x0, &amp;y0); printf(&apos;Enter co-ordinates of second point: &apos;); scanf(&apos;%d%d&apos;, &amp;x1, &amp;y1); drawline(x0, y0, x1, y1); return 0; } 

انتاج:


الفرق بين خوارزمية DDA وخوارزمية خط بريسنهام:

خوارزمية DDA خوارزمية خط بريسنهام
1. تستخدم خوارزمية DDA النقطة العائمة، أي الحساب الحقيقي. 1. تستخدم خوارزمية خط بريسنهام النقطة الثابتة، أي حساب الأعداد الصحيحة
2. تستخدم خوارزميات DDA الضرب والقسمة في عملها 2. تستخدم خوارزمية خط بريسنهام عمليات الطرح والجمع فقط
3. خوارزمية DDA أبطأ من خوارزمية Bresenham Line في الرسم الخطي لأنها تستخدم الحساب الحقيقي (عملية النقطة العائمة) 3. خوارزمية بريسنهام أسرع من خوارزمية DDA في الخط لأنها تتضمن الجمع والطرح فقط في حساباتها وتستخدم فقط حساب الأعداد الصحيحة.
4. خوارزمية DDA ليست دقيقة وفعالة مثل خوارزمية خط بريسنهام. 4. تعد خوارزمية خط Bresenham أكثر دقة وكفاءة في خوارزمية DDA.
5. يمكن لخوارزمية DDA رسم دوائر ومنحنيات ولكنها ليست دقيقة مثل خوارزمية خط Bresenham 5. يمكن لخوارزمية خط بريسنهام رسم الدوائر والمنحنيات بدقة أكبر من خوارزمية DDA.