বেজিয়ে বক্ররেখা

থাম্ব|কেন্দ্র|300px|ত্রিঘাতী বেজিয়ে বক্ররেখা
গণিতে **বেজিয়ে বক্ররেখা** () এক ধরনের পরামিতিক বক্ররেখা। কম্পিউটার গ্রাফিক্‌সে গুরুত্বপূর্ণ এই বক্ররেখাটি বহুল ব্যবহৃত হয়। বেজিয়ে বক্ররেখাকে উচ্চ মাত্রায় সাধারণীকরণ করে বেজিয়ে তল পাওয়া যায়। এর মধ্যে বেজিয়ে ত্রিভুজ একটি বিশেষ ধরনের তল।

১৯৬২ সালে ফরাসি প্রকৌশলী পিয়ের বেজিয়ে এই বক্ররেখার ধারণা জনপ্রিয় করেন। তিনি গাড়ির কাঠামো নকশা করার জন্য এগুলো ব্যবহার করেছিলেন। তবে এই রেখাগুলো প্রথম উদ্ভাবন করেন ১৯৫৯ সালে পল দ্য কাস্তেলিও, তার বিখ্যাত দ্য কাস্তেলিওর অ্যালগোরিদম ব্যবহার করে। এই অ্যালগোরিদমটি বেজিয়ে বক্ররেখার বিভিন্ন মান নির্ণয়ের জন্য একটি সাংখ্যিকভাবে স্থিতিশীল পদ্ধতি।

## বিভিন্ন বেজিয়ে বক্ররেখা
### রৈখিক বেজিয়ে বক্ররেখা
যদি দুটি বিন্দু **P**0 ও **P**1 দেয়া থাকে, তাহলে রৈখিক বেজিয়ে বক্ররেখা হচ্ছে দুইবিন্দুগামী একটি সরল রেখা। এর সমীকরণ নিম্নরূপঃ

:\mathbf{B}(t)=\mathbf{P}_0 + (\mathbf{P}_1-\mathbf{P}_0)t=(1-t)\mathbf{P}_0 + t\mathbf{P}_1 \mbox{ , } t \in [0,1]
এবং এটি রৈখিক ইন্টারপোলেশন এর সমতুল্য।

### দ্বিমাত্রিক বেজিয়ে বক্ররেখা
একটি দ্বিমাত্রিক বেজিয়ে বক্ররেখার সমীকরণ বের করতে চাইলে তিনটি বিন্দুর দেয়া থাকতে হবে। যদি তিনটি বিন্দু **P**0, **P**1, ও **P**2 দেয়া থাকে তবে দ্বিমাত্রিক বেজিয়ে বক্ররেখা **B**(*t*) ফাংশনের মাধ্যমে প্রকাশ করা যায় এভাবেঃ
: \mathbf{B}(t) = (1 - t)^{2}\mathbf{P}_0 + 2t(1 - t)\mathbf{P}_1 + t^{2}\mathbf{P}_2 \mbox{ , } t \in [0,1].

**ট্রুটাইপ ফন্ট** কয়েকটি দ্বিমাত্রিক বেজিয়ে বক্ররেখার সমন্বয়ে গঠিত বেজিয়ে স্‌প্লাইন দ্বারা গঠিত।

### ঘনক/ত্রিমাত্রিক বেজিয়ে বক্ররেখা
ত্রিমাত্রিক তলে চারটি বিন্দু **P**0, **P**1, **P**2 ও **P**3 দিয়ে ত্রিমাত্রিক/ঘনক বেজিয়ে বক্ররেখা সংজ্ঞায়িত করা যায়।

বক্ররেখাটির সূচনা হয় **P**0 বিন্দুতে এবং এটি **P**1 বিন্দুর দিকে যেয়ে **P**3 বিন্দুতে মিলিত হয়। শেষবিন্দুতে রেখাটি **P**2 বিন্দুর দিক থেকে আসে। সাধারণত রেখাটি **P**1 অথবা **P**2 বিন্দু দিয়ে যায় না। এই দুটি বিন্দু দেয়া থাকে বেজিয়ে বক্ররেখার আকার দেয়ার জন্য যাতে বেজিয়ে বক্ররেখার দিক নিয়ন্ত্রণ করা যায়। **P**0 থেকে **P**1 বরাবর দূরত্ব নির্ধারণ করে রেখাটি **P**3 বিন্দুতে মিলিত হওয়ার আগে **P**2 বিন্দুর দিকে কতটুকু যাবে।

বক্ররেখার পরামিতিক সমীকরণ হচ্ছে:

:\mathbf{B}(t)=(1-t)^3\mathbf{P}_0+3t(1-t)^2\mathbf{P}_1+3t^2(1-t)\mathbf{P}_2+t^3\mathbf{P}_3 \mbox{ , } t \in [0,1].

আধুনিক চিত্র অঙ্কনের প্রোগ্রাম যেমন *পোস্টস্ক্রিপ্ট*, *অ্যাসিম্পটোট* ও *মেটাফন্ট* বিভিন্ন রেখা আঁকার জন্য ত্রিমাত্রিক বেজিয়ে বক্ররেখা ব্যবহার করে।

## সাধারণীকরণ
যে কোন মাত্রা n সংবলিত বেজিয়ে বক্ররেখা নিচের উপায়ে সাধারণীকরণ করা যাবে। ধরি, বিন্দু দেয়া আছে **P**0, **P**1,..., **P**n, তাহলে বেজিয়ে বক্ররেখা হচ্ছেঃ

:\mathbf{B}(t)=\sum_{i=0}^n {n\choose i}\mathbf{P}_i(1-t)^{n-i}t^i =\mathbf{P}_0(1-t)^n+{n\choose 1}\mathbf{P}_1(1-t)^{n-1}t+\cdots+\mathbf{P}_nt^n \mbox{ , } t \in [0,1].

উদাহরণ স্বরূপ, n=5 এর জন্য:
:\mathbf{B}(t)=\mathbf{P}_0(1-t)^5+5\mathbf{P}_1t(1-t)^4+10\mathbf{P}_2t^2(1-t)^3+10\mathbf{P}_3t^3(1-t)^2+5\mathbf{P}_4t^4(1-t)+\mathbf{P}_5t^5 \mbox{ , } t \in [0,1].

এই সূত্রকে পৌনঃপুনিক/পুনরাবৃত্তি আকারে লেখা যায়:
ধরি \mathbf{B}_{\mathbf{P}_0\mathbf{P}_1\ldots\mathbf{P}_n} বেজিয়ে বক্ররেখা নির্দেশ করে যা **P**0, **P**1,..., **P**n বিন্দুগুলোর সমন্বয়ে গঠিত। তাহলে

:\mathbf{B}(t) = \mathbf{B}_{\mathbf{P}_0\mathbf{P}_1\ldots\mathbf{P}_n}(t) = (1-t)\mathbf{B}_{\mathbf{P}_0\mathbf{P}_1\ldots\mathbf{P}_{n-1}}(t) + t\mathbf{B}_{\mathbf{P}_1\mathbf{P}_2\ldots\mathbf{P}_n}(t)

অন্য কথায়, n ডিগ্রীর বেজিয়ে বক্ররেখা দুটি n-1 ডিগ্রির বেজিয়ে বক্ররেখার রৈখিক ইন্টারপোলেশন।

### বিভিন্ন সংজ্ঞা
পরামিতিক বক্ররেখার সাথে সংশ্লিষ্ট কিছু সংজ্ঞা দেয়া হল। আমরা জানি
:\mathbf{B}(t) = \sum_{i=0}^n \mathbf{P}_i\mathbf{b}_{i,n}(t),\quad t\in[0,1]
যেখানে
:\mathbf{b}_{i,n}(t) = {n\choose i} t^i (1-t)^{n-i},\quad i=0,\ldots n
রাশিমালা *n* ডিগ্রির বার্নস্টেইন পলিনোমিয়াল হিসেবে পরিচিত। এখানে t0 = 1 and (1 - t)0 = 1।

**P***i* বিন্দুগুলোকে বলা হয় বেজিয়ে বক্ররেখার *নিয়ন্ত্রক বিন্দু*। **P**0 থেকে শুরু এবং **P***n* এ শেষ হওয়া বেজিয়ে বিন্দুগুলো নিয়ে গঠিত বহুভুজকে *বেজিয়ে বহুভুজ* (*নিয়ন্ত্রক বহুভুজ*) বলা হয়। বেজিয়ে বহুভুজের উত্তল অংশ বেজিয়ে বক্ররেখাকে ধারণ করে।

### টুকিটাকি
* রেখাটি শুরু হয় **P**0 বিন্দুতে এবং শেষ হয় **P**n বিন্দুতে; এই ধর্মকে বলে *প্রান্তবিন্দু ইন্টারপোলেশন*।
* যদি সকল নিয়ন্ত্রক বিন্দু একই রেখায় থাকে তবে বেজিয়ে বক্ররেখা একটি সরলরেখা। অনুরুপভাবে বেজিয়ে বক্ররেখা একটি সরল রেখা যদি এর সকল বিনু কোলিনিয়ার হয়।
* বেজিয়ে বক্ররেখার শুরুর বিন্দুতে (শেষ বিন্দু) স্পর্শক হচ্ছে বেজিয়ে বহুভুজের প্রথম (শেষ) বাহু।
* একটি বক্ররেখাকে একাধিক বক্ররেখায় ভাগ করা যায় যার প্রত্যেকেই একটি বেজিয়ে বক্ররেখা হবে।
* কিছু কিছু আপাতদৃষ্টিতে সাধারণ রেখা, যেমন বৃত্তকে বেজিয়ে বক্ররেখার মাধ্যমে পুরোপুরিভাবে প্রকাশ করা যায় না। চারভাগে বিভক্ত চারটি বেজিয়ে বক্ররেখা দিয়ে বৃত্তের প্রায় সমতুল্য রেখা আঁকা যায়।
* বেজিয়ে বক্ররেখার সমান্তরাল কোন প্রকৃত রেখা আঁকা যায় না। তবে কিছু আপাতকরণ প্রক্রিয়ার মাধ্যমে প্রায় সমান্তরাল রেখা আঁকা হয়।

## বেজিয়ে বক্ররেখা গঠন
### রৈখিক বক্ররেখা

বেজিয়ে বক্ররেখার সমীকরণে *t* কে চিন্তা করা যেতে পারে **P**0 থেকে **P**1 বিন্দু পর্যন্ত **B**(*t*) এর দূরত্ব হিসেবে। উদাহরণস্বরুপ যখন *t=0.25*, **B**(*t*) তখন **P**0 থেকে **P**1 এক-চতুর্থাংশ দূরত্বে অবস্থিত। *t* 0 থেকে 1 পর্যন্ত বাড়লে, **B**(*t*) **P**0 থেকে **P**1 পর্যন্ত একটি সরলরেখা নির্দেশ করে।

### দ্বিমাত্রিক বক্ররেখা
দ্বিমাত্রিক বেজিয়ে বক্ররেখার সমীকরণের জন্য দুটি মাধ্যমিক বিন্দু **Q**0 ও **Q**1 এর সঞ্চারপথ বের করতে হবে যেখানে *t* এর মান 0 থেকে 1 এর মধ্যে পরিবর্তিত হয়:
* **Q**0 বিন্দুটি **P**0 থেকে **P**1 পর্যন্ত পরিবর্তিত হয়, যা একটি রৈখিক বেজিয়ে বক্ররেখা নির্দেশ করে।
* **Q**1 বিন্দুটি **P**1 থেকে **P**2 পর্যন্ত পরিবর্তিত হয়, যা একটি রৈখিক বেজিয়ে বক্ররেখা নির্দেশ করে।
* **B**(*t*) বিন্দুটি **Q**0 থেকে **Q**1 পর্যন্ত পরিবর্তিত হয় এবং একটি দ্বিমাত্রিক বেজিয়ে বক্ররেখা নির্দেশ করে।




### উচ্চ-মাত্রার বক্ররেখা
উচ্চ মাত্রার বক্ররেখা গঠনের জন্য আরো বেশি মাধ্যমিক বিন্দু লাগবে। ঘনক বক্ররেখার জন্য তিনটি মাধ্যমিক বিন্দু **Q**0, **Q**1 ও **Q**2 নেয়া যায়, যা তিনটি রৈখিক বেজিয়ে বক্ররেখা নির্দেশ করে এবং দুটি মাধ্যমিক বিন্দু **R**0 ও **R**1 নেয়া যায় যেগুলো দুটি দ্বিমাত্রিক বেজিয়ে বক্ররেখা নির্দেশ করে:




চার-মাত্রার বক্ররেখার জন্য চারটি মাধ্যমিক বিন্দু **Q**0, **Q**1, **Q**2 ও **Q**3 নিয়ে চারটি রৈখিক বেজিয়ে বক্ররেখা, **R**0, **R**1 ও **R**2 বিন্দু নিয়ে তিনটি দ্বিমাত্রিক বেজিয়ে বক্ররেখা ও **S**0 ও **S**1 নিয়ে দুটি ঘনক বেজিয়ে বক্ররেখা লাগবে:




## বহুপদী আকার
অনেকসময় বেজিয়ে বক্ররেখাকে বহুপদী আকারে প্রকাশ করা **বার্নষ্টাইন বহুপদীর** তুলনায় সহজ হয় এবং অপেক্ষাকৃত সরল আকারে দেখানো যায়। দ্বিপদী উপপাদ্য ব্যবহার করে বেজিয়ে রাশিমালাকে সরলীকরন করলে পাওয়া যাবে:

:
\mathbf{B}(t) = \sum_{j = 0}^n \mathbf{C}_j t^j


যেখানে

:
\mathbf{C}_j = \frac{n!}{(n - j)!} \sum_{i = 0}^j \frac{\mathbf{P}_i (-1)^{i + j}}{i! (j - i)!} = 
\prod_{m = 0}^{j - 1} (n - m) \sum_{i = 0}^j \frac{\mathbf{P}_i (-1)^{i + j}}{i! (j - i)!}
.

যদি \mathbf{B}(t) এর অনেক মান বের করার আগেই \mathbf{C}_j এর মান বের করা সম্ভব হয় তাহলে এই সমীকরণটি বাস্তব ব্যবহারের জন্য বেশি উপযোগী। তবে উচ্চ মাত্রার সমীকরণের জন্য দ্য ক্যাস্তেলিও অ্যালগোরিদম বেশি উপযোগী। উল্লেখ্য এখানে কোন সংখ্যার গুণফল 1 হবে না।

## আরও দেখুন
* :en:de Casteljau's algorithm
* :en:Spline (mathematics)
* :en:NURBS
* :en:string art - Bézier curves are also formed by many common forms of string art, where strings are looped across a frame of nails.
* :en:Hermite curve

## তথ্যসূত্র

* Paul Bourke: *Bézier curves*, https://web.archive.org/web/20060708162825/http://astronomy.swin.edu.au/%7Epbourke/curves/bezier/
* ডোনাল্ড কানুথ: *Metafont: the Program*, Addison-Wesley 1986, pp.&nbsp;123–131. Excellent discussion of implementation details; available for free as part of the TeX distribution.
* Dr Thomas Sederberg, BYU *Bézier curves*, https://web.archive.org/web/20060221000535/http://www.tsplines.com/resources/class_notes/Bezier_curves.pdf
* J.D. Foley *et al.*: *Computer Graphics: Principles and Practice in C* (2nd ed., Addison Wesley, 1992)

## বহিঃসংযোগ
* Bezier Curves interactive applet
* 3rd order Bezier Curves applet
* Living Math Bézier applet
* Living Math Bézier applets of different spline types, JAVA programming of splines in An Interactive Introduction to Splines
* Don Lancaster's Cubic Spline Library describes how to approximate a circle (or a circular arc, or a hyperbola) by a Bézier curve; using cubic splines for image interpolation, and an explanation of the math behind these curves.
* 
* Module for Bezier Curves by John H. Mathews
* Quadratic Bezier Curve Construction - An interactive applet showing how to construct a quadratic Bezier curve geometrically. (Requires Java.)
* Cubic Bezier Curve Construction - An interactive applet showing how to construct a cubic Bezier curve geometrically. (Requires Java.)
* Bezier / Parabola - An interactive applet showing the relationship between the quadratic Bezier curve and the parabola. (Requires Java.)
* PolyBezier - The Microsoft Win32 GDI API function, which draws Bezier curves in Windows graphic applications, like MS Paint.
* Finding All Intersections of Two Bezier Curves. - Locating all the intersections between two Bezier curves is a difficult general problem, because of the variety of degenerate cases. By Richard J. Kinch.
* SketchPad - A small program written in C and Win32 that implements the functionality to create and edit Bezier curves. Demonstrates also the use of de Casteljau's algorithm to split a Bezier curve.
বিষয়শ্রেণী:বক্ররেখা
বিষয়শ্রেণী:চিত্রলৈখিক নকশা প্রণয়ন
বিষয়শ্রেণী:অন্তঃপাতন
বিষয়শ্রেণী:স্‌প্লাইন
বিষয়শ্রেণী:নকশা প্রণয়ন