Fast integer-only scan-conversion using midpoints, decision variables, and incremental East/North-East steps
25 min read
Created ২ সেপ, ২০২৬
Bresenham’s Line Drawing Algorithm (ব্রেসেনহ্যামস লাইন অ্যালগরিদম)
১৯৬২ সালে আইবিএম (IBM)-এ কাজ করার সময় কম্পিউটার বিজ্ঞানী জ্যাক এলটন ব্রেসেনহ্যাম (Jack Elton Bresenham) এমন একটি লাইন অ্যালগরিদম আবিষ্কার করেন যা গ্রাফিক্স রেন্ডারিংয়ের ইতিহাস বদলে দেয়। মৌলিক সমীকরণ পদ্ধতি কিংবা DDA অ্যালগরিদমে যেখানে ফ্র্যাকশন (ফ্ল্লোটিং-পয়েন্ট নম্বর) ও রাউন্ডিংয়ের প্রয়োজন হতো, Bresenham’s Algorithm সেখানে ১০০% নিখুঁত পূর্ণসংখ্যা (Pure Integer Arithmetic) দিয়ে লাইন আঁকতে সক্ষম।
ব্রেসেনহ্যাম অ্যালগরিদম পরীক্ষা করে যে প্রকৃত জ্যামিতিক লাইনটি মিডপয়েন্ট M-এর ওপর দিয়ে গেছে নাকি নিচ দিয়ে গেছে।
বাস্তব জীবনের গল্প: ১৯৬২ সালে জ্যাক ব্রেসেনহ্যাম ও আইবিএম প্লটার
১৯৬২ সালে আইবিএম-এ কাজ করার সময় জ্যাক ব্রেসেনহ্যাম যান্ত্রিক ড্রম প্লটার দিয়ে নকশা আঁকার দায়িত্বে ছিলেন। প্লটারের মোটরগুলো কেবল নির্দিষ্ট ঘর ডানে, ওপরে বা কোণাকুণি চলতে পারত। ১৯৬০ দশকের ঢিমেতাল কম্পিউটারে ভগ্নাংশের হিসাব (y=mx+b) চালাতে গিয়ে প্রিন্টিং মোটরগুলো থেমে থেমে স্লো হয়ে যেত।
ব্রেসেনহ্যাম তখন Midpoint Decision Test আবিষ্কার করেন: মনে করুন আপনি সীমানা বেড়ার ওপর দিয়ে হাঁটছেন এবং প্রতিটি মোড়ে বেড়ার ঠিক মাঝের মিডপয়েন্ট দেখে সিদ্ধান্ত নিচ্ছেন আপনি কোন দিকে পা ফেলবেন। ভগ্নাংশ ছাড়া কেবল পূর্ণসংখ্যার যোগ-বিয়োগের এই লজিকটি এত দ্রুত কাজ করেছিল যে আজও বিশ্বের সকল GPU চিপে সরাসরি ব্রেসেনহ্যাম অ্যালগরিদম হার্ডওয়্যারে বসানো থাকে!
Efficient Line Drawing Using Incremental Integer Calculations (ইনটিজার গণনার দক্ষতা)
আগের DDA অ্যালগরিদমে প্রতি ধাপে ফ্ল্লোটিং-পয়েন্ট যোগ (y=y+m) এবং রাউন্ডিং করতে হতো (round(y))।
কেন পূর্ণসংখ্যার হিসাব এত দ্রুতগতির?
কম্পিউটার হার্ডওয়্যারে (বিশেষ করে GPU প্রসেসরে):
পূর্ণসংখ্যার যোগ ও বিট-শিফটিং: প্রসেসরের মাত্র ১টি ক্লক সাইকেলে সম্পন্ন হয়।
ফ্ল্লোটিং-পয়েন্ট যোগ ও ভাগ: চালাতে প্রসেসরের FPU (Floating Point Unit) লাগে, যা ধীরগতির এবং লম্বা লাইনে ভগ্নাংশের ভুল জমতে জমতে লাইন সরে যায় (Drift ঘটে)।
ব্রেসেনহ্যামের অনন্য আবিষ্কার ছিল: লাইনের গাণিতিক সমীকরণকে এমনভাবে সাজানো যাতে পরবর্তী পিক্সেল নির্বাচন করার পুরো প্রক্রিয়াটি কেবল একটি পূর্ণসংখ্যা সিদ্ধান্ত ভেরিয়েবলের (dk) চিহ্ন (+ বা -) দিয়ে নির্ধারণ করা যায়!
Basic Idea: Unit X-Interval Movement & Candidate Pixels (মূল আইডিয়া)
ধরি, লাইনটি (x1,y1) থেকে শুরু হয়ে (x2,y2) বিন্দুতে শেষ হয় এবং এর ঢাল হালকা:
0≤m≤1(Δx≥Δy>0)
১. প্রধান অক্ষ ধরে ১ একক এগিয়ে যাওয়া:
যেহেতু 0≤m≤1, তাই X-অক্ষ বরাবর মান দ্রুত বাড়ে। আমরা প্রতি ধাপে X-কে ১ একক করে বাড়াই:
xp+1=xp+1
২. দুটি সম্ভাব্য পিক্সেল নির্বাচন (East বনাম North-East):
বর্তমান পিক্সেল P=(xp,yp) প্লট করার পর, xp+1 স্থানে আসল জ্যামিতিক রেখাটি দুটি সম্ভাব্য পিক্সেলের মাঝখান দিয়ে যায়:
East (E): ঠিক ডানপাশের পিক্সেল:
E=(xp+1,yp)
North-East (NE): ডানপাশের এক ঘর উপরের পিক্সেল:
NE=(xp+1,yp+1)
text
Pixel Selection Based on the Midpoint (মিডপয়েন্ট ভিত্তি)
E নাকি NE — কোন পিক্সেলটি আসল রেখার বেশি কাছে অবস্থিত, তা জানার জন্য আমরা E এবং NE-এর ঠিক মাঝের বিন্দু মিডপয়েন্ট (M) পরীক্ষা করি।
মিডপয়েন্টের স্থানাঙ্ক
M=(xp+1,yp+21)
ইমপ্লিসিট লাইনের সমীকরণ
সরলরেখার সমীকরণ y=ΔxΔyx+b-কে আমরা সাধারণ সমীকরণ F(x,y)=0 আকারে সাজাতে পারি:
মিডপয়েন্ট M-এর মান ইমপ্লিসিট সমীকরণে বসিয়ে যে সিদ্ধান্ত ভেরিয়েবল dk পাওয়া যায়, তাকে ২ দিয়ে গুণ করে ভগ্নাংশ মুক্ত করা হয়:
dk=2⋅F(M)=2⋅F(xp+1,yp+21)
২ দিয়ে গুণ করার ফলে 21 ভগ্নাংশটি চলে যায় এবং dk একটি নিখুঁত পূর্ণসংখ্যা (Integer) হয়ে যায়!
পিক্সেল নির্বাচনের সিদ্ধান্ত নিয়ম
যদি dk<0 হয়: মিডপয়েন্ট M আসল লাইনের উপরে অবস্থিত। অর্থাৎ আসল লাইনটি East (E) পিক্সেলের বেশি কাছে। ⟹East (E) পছন্দ করুন⟹(xp+1,yp)।
যদি dk≥0 হয়: মিডপয়েন্ট M আসল লাইনের নিচে বা ওপর অবস্থিত। অর্থাৎ আসল লাইনটি North-East (NE) পিক্সেলের বেশি কাছে। ⟹North-East (NE) পছন্দ করুন⟹(xp+1,yp+1)।
Calculate the Initial Decision Variable (d0) (প্রাথমিক সিদ্ধান্ত মান)
প্রথম পিক্সেল (x1,y1) আঁকার পর প্রথম মিডপয়েন্ট M0=(x1+1,y1+0.5)-এ প্রাথমিক সিদ্ধান্ত ভেরিয়েবল d0 পাওয়া যায়:
d0=2⋅F(x1+1,y1+21)
d0=2Δy−Δx
যেহেতু Δx এবং Δy পিক্সেলের বিয়োগফল (পূর্ণসংখ্যা), তাই d0 একটি পূর্ণসংখ্যা!
Update d Incrementally After Choosing E or NE (ইনক্রিমেন্টাল আপডেট)
প্রতি ধাপে নতুন করে F(M) হিসাব না করে, পূর্বের সিদ্ধান্ত মান dk-এর সাথে ইনক্রিমেন্ট যোগ করে পরবর্তী dk+1 বের করা হয়।
ব্রেসেনহ্যামের সম্পূর্ণ পূর্ণসংখ্যা ভিত্তিক সিদ্ধান্ত লজিক ধাপে ধাপে পরীক্ষা করুন। মিডপয়েন্ট M, সিদ্ধান্ত ভেরিয়েবল d_k, East ও North-East পিক্সেল নির্বাচন সরাসরি দেখুন।
Interactive Bresenham's Line Scan-Conversion Explorer
পিক্সেল স্থানাঙ্ক হয় (xp+1,yp+1) (Y মান ১ বাড়ে)।
পরবর্তী সিদ্ধান্ত মান:
dk+1=dk+ΔNEΔNE=2⋅(Δy−Δx)
Execution Flow for East (E) and North-East (NE) Moves (ধাপের সারণী)
East এবং North-East মুভের এক্সিকিউশন তুলনা
প্যারামিটার / স্টেট
East (E) মুভ
North-East (NE) মুভ
ট্রিগার শর্ত
dk<0 (মিডপয়েন্ট লাইনের উপরে)
dkge0 (মিডপয়েন্ট লাইনের নিচে বা ওপরে)
পরবর্তী X স্থানাঙ্ক
xk+1=xk+1
xk+1=xk+1
পরবর্তী Y স্থানাঙ্ক
yk+1=yk (অপরিবর্তিত)
yk+1=yk+1 (১ বৃদ্ধি)
সিদ্ধান্ত ইনক্রিমেন্ট
যোগ করুন DeltaE=2Deltay
যোগ করুন DeltaNE=2(Deltay−Deltax)
হার্ডওয়্যার অপারেশন
১টি ইনটিজার যোগ (d+DeltaE)
১টি ইনটিজার যোগ (d+DeltaNE)
Bresenham’s Line Algorithm & Pseudocode (সিউডোকোড)
ব্রেসেনহ্যাম অ্যালগরিদমে লুপের আগে কন্সট্যান্ট dx, dy, d, incE, এবং incNE হিসাব করে রাখা হয় যাতে লুপে সর্বোচ্চ স্পিড পাওয়া যায়।
স্ট্যান্ডার্ড সিউডোকোড (0≤m≤1)
text
সমস্ত ঢাল ও কোণায় প্রয়োগ (All Slopes & Octants)
যদি লাইনটি খাড়া হয় (m>1 বা Δy>Δx), তবে Y-অক্ষকে মূল অক্ষ ধরে X ও Y-এর ভূমিকা অদলবদল করা হয়। নেগেটিভ ঢালের ক্ষেত্রে +1-এর বদলে step-এর মান −1 করা হয়।
বিশ্ববিদ্যালয়ের পরীক্ষার প্রশ্নোত্তর ও পূর্ণাঙ্গ গাণিতিক সমাধান (University Exam Questions & Solutions)
কম্পিউটার গ্রাফিক্স ও অ্যানিমেশন কোর্সের ফাইনাল পরীক্ষায় ব্রেসেনহ্যাম অ্যালগরিদম থেকে যেভাবে উত্তর লিখতে হয় তার পূর্ণাঙ্গ ও গোছানো উপস্থাপনা:
১. থিওরিটিক্যাল প্রশ্ন ও উত্তর (Theoretical Questions & Answers)
প্রশ্ন ১: ব্রেসেনহ্যাম লাইন অ্যালগরিদমের প্রাথমিক সিদ্ধান্ত ভেরিয়েবল d0 = 2Δy - Δx প্রতিপাদন করো।
উত্তর:(x1,y1) এবং (x2,y2) বিন্দুগামী সরলরেখার ইমপ্লিসিট সমীকরণ:
F(x,y)=Δy⋅x−Δx⋅y+C=0
যেখানে F(x1,y1)=0 হওয়ায় C=Δx⋅y1−Δy⋅x1।
প্রথম ধাপ x=x1+1-এ, দুটি সম্ভাব্য পিক্সেল E(x1+1,y1) এবং NE(x1+1,y1+1)-এর মধ্যবিন্দু M0:
M0=(x1+1,y1+21)
ভগ্নাংশ দূর করতে সিদ্ধান্ত প্যারামিটার d0=2⋅F(M0) সংজ্ঞায়িত করা হয়:
d0=2⋅[Δy(x1+1)−Δx(y1+21)+C]d0=2[Δy⋅x1−Δx⋅y1+C]+2Δy−Δx
যেহেতু Δy⋅x1−Δx⋅y1+C=F(x1,y1)=0, সুতরাং:
d0=2Δy−Δx
প্রশ্ন ২: ব্রেসেনহ্যাম অ্যালগরিদমের ইনক্রিমেন্টাল সিদ্ধান্ত মান (ΔE ও ΔNE) প্রতিপাদন করো।
উত্তর:
ধরি ধাপ k-তে সিদ্ধান্ত মান dk=2F(xk+1,yk+21) এবং পরবর্তী ধাপ k+1-এ dk+1=2F(xk+1+1,yk+1+21)।
বিয়োগ করলে: Δd=dk+1−dk=2Δy(xk+1−xk)−2Δx(yk+1−yk)।
যেহেতু সর্বদা xk+1=xk+1, তাই (xk+1−xk)=1:
East (E) নির্বাচিত হলে (dk<0):yk+1=yk⟹yk+1−yk=0ΔE=2Δy(1)−2Δx(0)=2Δy⟹dk+1=dk+2Δy
North-East (NE) নির্বাচিত হলে (dk≥0):yk+1=yk+1⟹yk+1−yk=1ΔNE=2Δy(1)−2Δx(1)=2(Δy−Δx)⟹dk+1=dk+2(Δy−Δx)
প্রশ্ন ৩: DDA এবং Bresenham লাইন অ্যালগরিদমের মধ্যে পার্থক্য লিখো।
উত্তর:
হিসাবের ধরন: DDA প্রতি ধাপে ফ্র্যাকশন বা দশমিক যোগ (y=y+m) এবং round(y) ব্যবহার করে; ব্রেসেনহ্যাম ১০০% পূর্ণসংখ্যা (Pure Integer Arithmetic) ব্যবহার করে।
হার্ডওয়্যার স্পিড: ব্রেসেনহ্যামে কেবল পূর্ণসংখ্যার যোগ, বিয়োগ ও বিট-শিফট (2Δy=Δy≪1) ব্যবহৃত হয়, যা হার্ডওয়্যারে মাত্র ১ ক্লক সাইকেলে সম্পন্ন হয়।
প্রশ্ন ৪: ব্রেসেনহ্যাম অ্যালগরিদমে কেন মিডপয়েন্ট ফাংশনকে ২ দ্বারা গুণ করা হয়?
উত্তর:
মিডপয়েন্ট M=(xk+1,yk+0.5)-এ ভগ্নাংশ 0.5=1/2 থাকে। ফলে F(M)-এর মান বের করার সময় −21Δx তৈরি হয়।
পুরো সমীকরণকে ২ দ্বারা গুণ (dk=2⋅F(M)) করলে চিহ্নের (+ বা -) কোনো পরিবর্তন ছাড়াই ভগ্নাংশ সম্পূর্ণরূপে দূর হয়ে যায় এবং সকল ভেরিয়েবল খাঁটি পূর্ণসংখ্যায় রূপান্তরিত হয়।
২. বিশ্ববিদ্যালয় ফাইনাল পরীক্ষার গাণিতিক সমস্যা ও পূর্ণাঙ্গ সমাধান
সমস্যা: প্রান্তবিন্দু (20, 10) এবং (30, 18) [১০ম ব্যাচ ফাইনাল পরীক্ষা (10th Batch)]
পরীক্ষার প্রশ্ন [নম্বর: ৪ + ১]
প্রশ্ন: Calculate the intermediate points for the line with end points (20,10) and (30,18) using Bresenham line drawing algorithm and draw the line.
(ব্রেসেনহ্যাম লাইন ড্রয়িং অ্যালগরিদম ব্যবহার করে (20,10) এবং (30,18) প্রান্তবিন্দুর মধ্যবর্তী পয়েন্টসমূহ গণনা করো এবং লাইনটি অঙ্কন করো।)
ধাপে ধাপে পরীক্ষার সমাধান:
১. প্রদত্ত উপাত্ত (Given Data):
শুরুর প্রান্তবিন্দু: (x1,y1)=(20,10)
শেষের প্রান্তবিন্দু: (x2,y2)=(30,18)
২. ঢাল ও মূল অক্ষ নির্ধারণ (Slope Calculation):
Δx=x2−x1=30−20=10
Δy=y2−y1=18−10=8
ঢাল (Slope):
m=ΔxΔy=108=0.8
যেহেতু 0≤m≤1 এবং x1<x2, তাই প্রতি ধাপে x বরাবর ১ একক বৃদ্ধি পাবে (xk+1=xk+1)।
৩. প্রাথমিক সিদ্ধান্ত প্যারামিটার ও ধ্রুবক নির্ণয় (Initial Parameters):
প্রাথমিক সিদ্ধান্ত প্যারামিটার (d0):d0=2Δy−Δx=2(8)−10=16−10=6
East (E) মুভের জন্য ধ্রুবক:ΔE=2Δy=2×8=16
North-East (NE) মুভের জন্য ধ্রুবক:ΔNE=2Δy−2Δx=2(8)−2(10)=16−20=−4
৫. মধ্যবর্তী বিন্দুসমূহ (Intermediate Points):(20,10) এবং (30,18) প্রান্তবিন্দুর মধ্যবর্তী নির্ণেয় পয়েন্টসমূহ হলো:
(21,11),(22,12),(23,12),(24,13),(25,14),(26,15),(27,16),(28,16),(29,17)
৬. পিক্সেল গ্রিডে লাইনের চিত্রাঙ্কন (Draw the Line):
সমস্যা ২: মিডপয়েন্ট লাইন অ্যালগরিদম ব্যাখ্যা ও (3, 5) থেকে (7, 9) বিন্দুর ট্রেস [১১তম ব্যাচ ফাইনাল পরীক্ষা (11th Batch)]
পরীক্ষার প্রশ্ন [নম্বর: ৭]
প্রশ্ন: Explain the Midpoint line drawing algorithm and trace the algorithm for the given points (3,5) to (7,9).
(মিডপয়েন্ট লাইন ড্রয়িং অ্যালগরিদম ব্যাখ্যা করো এবং প্রদত্ত বিন্দু (3,5) থেকে (7,9) এর জন্য অ্যালগরিদমটি ট্রেস করো।)
ধাপে ধাপে পরীক্ষার সমাধান:
১ম অংশ: মিডপয়েন্ট লাইন অ্যালগরিদমের তাত্ত্বিক ব্যাখ্যা [৩.৫ নম্বর]
১. মূল জ্যামিতিক ধারণা:0≤m≤1 ঢালের ক্ষেত্রে প্রধান X-অক্ষ বরাবর প্রতি ধাপে ১ একক বৃদ্ধি পায় (xk+1=xk+1)।
বর্তমান পিক্সেল Pk(xk,yk) প্লট করার পর পরবর্তী ধাপে আসল জ্যামিতিক রেখাটি দুটি সম্ভাব্য পিক্সেলের মাঝ দিয়ে যায়:
East (E):(xk+1,yk)
North-East (NE):(xk+1,yk+1)
২. মিডপয়েন্ট টেস্ট:E ও NE-এর ঠিক মাঝের মিডপয়েন্ট (M) বিবেচনা করা হয়:
M=(xk+1,yk+21)
সরলরেখার ইমপ্লিসিট সমীকরণ F(x,y)=Δy⋅x−Δx⋅y+C=0-এ M-কে বসিয়ে পূর্ণসংখ্যা সিদ্ধান্ত ভেরিয়েবল dk=2⋅F(M) সংজ্ঞায়িত করা হয়।
৩. সিদ্ধান্ত ও পিক্সেল নির্বাচন বিধি:
যদি dk<0 হয়: মিডপয়েন্ট M আসল রেখার উপরে অবস্থিত ⟹ রেখাটি E পিক্সেলের বেশি কাছে ⟹E(xk+1,yk) নির্বাচিত হবে এবং dk+1=dk+2Δy।
যদি dk≥0 হয়: মিডপয়েন্ট M আসল রেখার নিচে বা ওপরে অবস্থিত ⟹ রেখাটি NE পিক্সেলের বেশি কাছে ⟹NE(xk+1,yk+1) নির্বাচিত হবে এবং dk+1=dk+2(Δy−Δx)।
৪. সূচনা মান: প্রারম্ভিক বিন্দু (x1,y1) থেকে প্রাথমিক সিদ্ধান্ত মান d0=2Δy−Δx।
২য় অংশ: (3, 5) থেকে (7, 9) বিন্দুর জন্য গাণিতিক স্টেট ট্রেস [৩.৫ নম্বর]
১. প্রদত্ত উপাত্ত:
শুরুর প্রান্তবিন্দু: (x1,y1)=(3,5)
শেষের প্রান্তবিন্দু: (x2,y2)=(7,9)
২. ডেল্টা ও ঢাল নির্ণয়:
Δx=x2−x1=7−3=4
Δy=y2−y1=9−5=4
ঢাল:
m=ΔxΔy=44=1.0
যেহেতু 0≤m≤1, তাই প্রতি ধাপে x বরাবর ১ একক বাড়বে (xk+1=xk+1)।
৩. প্রাথমিক প্যারামিটার ও ইনক্রিমেন্ট ধ্রুবক:
প্রাথমিক সিদ্ধান্ত প্যারামিটার (d0):d0=2Δy−Δx=2(4)−4=8−4=4