डी कैस्टेलजौ का एल्गोरिदम: Difference between revisions

From Vigyanwiki
(Created page with "संख्यात्मक विश्लेषण के गणित क्षेत्र में, डी कास्टेलजौ का एल्गोर...")
 
No edit summary
Line 1: Line 1:
[[संख्यात्मक विश्लेषण]] के गणित क्षेत्र में, डी कास्टेलजौ का एल्गोरिदम [[बर्नस्टीन फॉर्म]] या बेज़ियर वक्रों में बहुपदों का मूल्यांकन करने के लिए एक पुनरावर्ती विधि है, जिसका नाम इसके आविष्कारक [[पॉल डी कास्टेलजौ]] के नाम पर रखा गया है। डी कास्टेलजौ के एल्गोरिदम का उपयोग एक बेज़ियर वक्र को एक मनमाना पैरामीटर मान पर दो बेज़ियर वक्रों में विभाजित करने के लिए भी किया जा सकता है।
[[संख्यात्मक विश्लेषण]] के गणित क्षेत्र में, डी कास्टेलजौ का एल्गोरिदम [[बर्नस्टीन फॉर्म]] या बेज़ियर वक्रों में बहुपदों का मूल्यांकन करने के लिए पुनरावर्ती विधि है, जिसका नाम इसके आविष्कारक [[पॉल डी कास्टेलजौ]] के नाम पर रखा गया है। डी कास्टेलजौ के एल्गोरिदम का उपयोग बेज़ियर वक्र को मनमाना पैरामीटर मान पर दो बेज़ियर वक्रों में विभाजित करने के लिए भी किया जा सकता है।


यद्यपि प्रत्यक्ष दृष्टिकोण की तुलना में अधिकांश आर्किटेक्चर के लिए एल्गोरिदम धीमा है, यह संख्यात्मक रूप से अधिक स्थिर है।{{Citation needed|date=May 2023}}
यद्यपि प्रत्यक्ष दृष्टिकोण की तुलना में अधिकांश आर्किटेक्चर के लिए एल्गोरिदम धीमा है, यह संख्यात्मक रूप से अधिक स्थिर है।


== परिभाषा ==
== परिभाषा ==
Line 7: Line 7:


:<math>B(t) = \sum_{i=0}^{n}\beta_{i}b_{i,n}(t),</math>
:<math>B(t) = \sum_{i=0}^{n}\beta_{i}b_{i,n}(t),</math>
कहाँ <math>b</math> एक [[बर्नस्टीन बहुपद]] है
कहाँ <math>b</math> [[बर्नस्टीन बहुपद]] है


:<math>b_{i,n}(t) = {n \choose i}(1-t)^{n-i}t^i.</math>
:<math>b_{i,n}(t) = {n \choose i}(1-t)^{n-i}t^i.</math>
Line 25: Line 25:
डी कास्टेलजौ के एल्गोरिदम की ज्यामितीय व्याख्या सीधी है।
डी कास्टेलजौ के एल्गोरिदम की ज्यामितीय व्याख्या सीधी है।
*नियंत्रण बिंदुओं वाले बेज़ियर वक्र पर विचार करें <math>P_0,...,P_n</math>. लगातार बिंदुओं को जोड़कर हम वक्र का नियंत्रण बहुभुज बनाते हैं।
*नियंत्रण बिंदुओं वाले बेज़ियर वक्र पर विचार करें <math>P_0,...,P_n</math>. लगातार बिंदुओं को जोड़कर हम वक्र का नियंत्रण बहुभुज बनाते हैं।
*अब इस बहुभुज के प्रत्येक रेखाखंड को अनुपात के साथ उप-विभाजित करें <math>t : (1-t)</math> और जो अंक मिले उन्हें जोड़ दें। इस तरह आप एक कम खंड वाले नए बहुभुज पर पहुंचते हैं।
*अब इस बहुभुज के प्रत्येक रेखाखंड को अनुपात के साथ उप-विभाजित करें <math>t : (1-t)</math> और जो अंक मिले उन्हें जोड़ दें। इस तरह आप कम खंड वाले नए बहुभुज पर पहुंचते हैं।
*प्रक्रिया को तब तक दोहराएँ जब तक आप एकल बिंदु पर न पहुँच जाएँ - यह पैरामीटर के अनुरूप वक्र का बिंदु है <math>t</math>.
*प्रक्रिया को तब तक दोहराएँ जब तक आप एकल बिंदु पर न पहुँच जाएँ - यह पैरामीटर के अनुरूप वक्र का बिंदु है <math>t</math>.
निम्नलिखित चित्र घन बेज़ियर वक्र के लिए इस प्रक्रिया को दर्शाता है:
निम्नलिखित चित्र घन बेज़ियर वक्र के लिए इस प्रक्रिया को दर्शाता है:
Line 31: Line 31:
:[[Image:DeCasteljau1.svg]]ध्यान दें कि जिन मध्यवर्ती बिंदुओं का निर्माण किया गया था वे वास्तव में दो नए बेज़ियर वक्रों के लिए नियंत्रण बिंदु हैं, दोनों बिल्कुल पुराने के साथ मेल खाते हैं। यह एल्गोरिदम न केवल वक्र का मूल्यांकन करता है <math>t</math>, लेकिन वक्र को दो टुकड़ों में विभाजित करता है <math>t</math>, और बेज़ियर रूप में दो उप-वक्रों के समीकरण प्रदान करता है।
:[[Image:DeCasteljau1.svg]]ध्यान दें कि जिन मध्यवर्ती बिंदुओं का निर्माण किया गया था वे वास्तव में दो नए बेज़ियर वक्रों के लिए नियंत्रण बिंदु हैं, दोनों बिल्कुल पुराने के साथ मेल खाते हैं। यह एल्गोरिदम न केवल वक्र का मूल्यांकन करता है <math>t</math>, लेकिन वक्र को दो टुकड़ों में विभाजित करता है <math>t</math>, और बेज़ियर रूप में दो उप-वक्रों के समीकरण प्रदान करता है।


ऊपर दी गई व्याख्या एक गैर-तर्कसंगत बेज़ियर वक्र के लिए मान्य है। एक तर्कसंगत बेज़ियर वक्र का मूल्यांकन करने के लिए <math>\mathbf{R}^n</math>, हम इस बिंदु को प्रक्षेपित कर सकते हैं <math>\mathbf{R}^{n+1}</math>; उदाहरण के लिए, तीन आयामों में एक वक्र के अपने नियंत्रण बिंदु हो सकते हैं <math>\{(x_i, y_i, z_i)\}</math> और वजन <math>\{w_i\}</math> भारित नियंत्रण बिंदुओं पर प्रक्षेपित किया गया <math>\{(w_ix_i, w_iy_i, w_iz_i, w_i)\}</math>. फिर एल्गोरिदम सामान्य रूप से आगे बढ़ता है, इंटरपोलेशन करता है <math>\mathbf{R}^4</math>. परिणामी चार-आयामी बिंदुओं को एक [[परिप्रेक्ष्य विभाजन]] के साथ तीन-स्थान में वापस प्रक्षेपित किया जा सकता है।
ऊपर दी गई व्याख्या गैर-तर्कसंगत बेज़ियर वक्र के लिए मान्य है। तर्कसंगत बेज़ियर वक्र का मूल्यांकन करने के लिए <math>\mathbf{R}^n</math>, हम इस बिंदु को प्रक्षेपित कर सकते हैं <math>\mathbf{R}^{n+1}</math>; उदाहरण के लिए, तीन आयामों में वक्र के अपने नियंत्रण बिंदु हो सकते हैं <math>\{(x_i, y_i, z_i)\}</math> और वजन <math>\{w_i\}</math> भारित नियंत्रण बिंदुओं पर प्रक्षेपित किया गया <math>\{(w_ix_i, w_iy_i, w_iz_i, w_i)\}</math>. फिर एल्गोरिदम सामान्य रूप से आगे बढ़ता है, इंटरपोलेशन करता है <math>\mathbf{R}^4</math>. परिणामी चार-आयामी बिंदुओं को [[परिप्रेक्ष्य विभाजन]] के साथ तीन-स्थान में वापस प्रक्षेपित किया जा सकता है।


सामान्य तौर पर, एक तर्कसंगत वक्र (या सतह) पर संचालन एक [[प्रक्षेप्य स्थान]] में एक गैर-तर्कसंगत वक्र पर संचालन के बराबर होता है। तर्कसंगत वक्रों का मूल्यांकन करते समय भारित नियंत्रण बिंदुओं और वज़न के रूप में यह प्रतिनिधित्व अक्सर सुविधाजनक होता है।
सामान्य तौर पर, तर्कसंगत वक्र (या सतह) पर संचालन [[प्रक्षेप्य स्थान]] में गैर-तर्कसंगत वक्र पर संचालन के बराबर होता है। तर्कसंगत वक्रों का मूल्यांकन करते समय भारित नियंत्रण बिंदुओं और वज़न के रूप में यह प्रतिनिधित्व अक्सर सुविधाजनक होता है।


=== संकेतन ===
=== संकेतन ===
Line 97: Line 97:
जो घात 2 का अपेक्षित बर्नस्टीन बहुपद है।
जो घात 2 का अपेक्षित बर्नस्टीन बहुपद है।


== कार्यान्वयन{{anchor|Example implementation}}==
== कार्यान्वयन==
यहां विभिन्न प्रोग्रामिंग भाषाओं में डी कैस्टेलजाउ के एल्गोरिदम के उदाहरण कार्यान्वयन दिए गए हैं।
यहां विभिन्न प्रोग्रामिंग भाषाओं में डी कैस्टेलजाउ के एल्गोरिदम के उदाहरण कार्यान्वयन दिए गए हैं।


Line 125: Line 125:


=== [[जावास्क्रिप्ट]] ===
=== [[जावास्क्रिप्ट]] ===
निम्नलिखित फ़ंक्शन डी कास्टेलजौ के एल्गोरिदम को एक सरणी पर लागू करता है {{var|{{code|points}}}}, अतिरिक्त गुणों के साथ अंतिम मध्यबिंदु को हल करना {{code|in}} और {{code|out}} (क्रमशः मध्यबिंदु के अंदर और बाहर स्पर्शरेखाओं के लिए)।
निम्नलिखित फ़ंक्शन डी कास्टेलजौ के एल्गोरिदम को सरणी पर लागू करता है {{var|{{code|points}}}}, अतिरिक्त गुणों के साथ अंतिम मध्यबिंदु को हल करना {{code|in}} और {{code|out}} (क्रमशः मध्यबिंदु के अंदर और बाहर स्पर्शरेखाओं के लिए)।


<syntaxhighlight lang="javascript" line>
<syntaxhighlight lang="javascript" line>
Line 167: Line 167:


==संदर्भ==
==संदर्भ==
*Farin, Gerald & [[Dianne Hansford|Hansford, Dianne]] (2000). ''The Essentials of CAGD''. Natic, MA: A K Peters, Ltd. {{ISBN|1-56881-123-3}}
*Farin, Gerald & [[Dianne Hansford|Hansford, Dianne]] (2000). ''The Essentials of CAGD''. Natic, MA: A K Peters, Ltd. {{ISBN|1-56881-123-3}}




==बाहरी संबंध==
==बाहरी संबंध==
* [http://hcklbrrfnn.wordpress.com/2012/08/20/piecewise-linear-approximation-of-bezier-curves/ Piecewise linear approximation of Bézier curves] – description of De Casteljau's algorithm, including a criterion to determine when to stop the recursion
* [http://hcklbrrfnn.wordpress.com/2012/08/20/piecewise-linear-approximation-of-bezier-curves/ Piecewise linear approximation of Bézier curves] – description of De Casteljau's algorithm, including a criterion to determine when to stop the recursion
* [http://jeremykun.com/2013/05/11/bezier-curves-and-picasso/ Bezier Curves and Picasso ] — Description and illustration of De Casteljau's algorithm applied to cubic Bézier curves.
* [http://jeremykun.com/2013/05/11/bezier-curves-and-picasso/ Bezier Curves and Picasso] — Description and illustration of De Casteljau's algorithm applied to cubic Bézier curves.
* [https://pomax.github.io/bezierinfo/#decasteljau de Casteljau's algorithm] - Implementation help and interactive demonstration of the algorithm.
* [https://pomax.github.io/bezierinfo/#decasteljau de Casteljau's algorithm] - Implementation help and interactive demonstration of the algorithm.
[[Category: स्प्लिंस (गणित)]] [[Category: संख्यात्मक विश्लेषण]] [[Category: उदाहरण हास्केल कोड वाले लेख]]  
[[Category: स्प्लिंस (गणित)]] [[Category: संख्यात्मक विश्लेषण]] [[Category: उदाहरण हास्केल कोड वाले लेख]]  

Revision as of 17:16, 21 July 2023

संख्यात्मक विश्लेषण के गणित क्षेत्र में, डी कास्टेलजौ का एल्गोरिदम बर्नस्टीन फॉर्म या बेज़ियर वक्रों में बहुपदों का मूल्यांकन करने के लिए पुनरावर्ती विधि है, जिसका नाम इसके आविष्कारक पॉल डी कास्टेलजौ के नाम पर रखा गया है। डी कास्टेलजौ के एल्गोरिदम का उपयोग बेज़ियर वक्र को मनमाना पैरामीटर मान पर दो बेज़ियर वक्रों में विभाजित करने के लिए भी किया जा सकता है।

यद्यपि प्रत्यक्ष दृष्टिकोण की तुलना में अधिकांश आर्किटेक्चर के लिए एल्गोरिदम धीमा है, यह संख्यात्मक रूप से अधिक स्थिर है।

परिभाषा

एक बेज़ियर वक्र (डिग्री का , नियंत्रण बिंदुओं के साथ ) को बर्नस्टीन रूप में इस प्रकार लिखा जा सकता है

कहाँ बर्नस्टीन बहुपद है

बिंदु पर वक्र पुनरावृत्ति संबंध के साथ मूल्यांकन किया जा सकता है

फिर, का मूल्यांकन बिंदु पर में मूल्यांकन किया जा सकता है परिचालन. परिणाम द्वारा दिया गया है

इसके अलावा, बेज़ियर वक्र बिंदु पर विभाजित किया जा सकता है संबंधित नियंत्रण बिंदुओं के साथ दो वक्रों में:


ज्यामितीय व्याख्या

डी कास्टेलजौ के एल्गोरिदम की ज्यामितीय व्याख्या सीधी है।

  • नियंत्रण बिंदुओं वाले बेज़ियर वक्र पर विचार करें . लगातार बिंदुओं को जोड़कर हम वक्र का नियंत्रण बहुभुज बनाते हैं।
  • अब इस बहुभुज के प्रत्येक रेखाखंड को अनुपात के साथ उप-विभाजित करें और जो अंक मिले उन्हें जोड़ दें। इस तरह आप कम खंड वाले नए बहुभुज पर पहुंचते हैं।
  • प्रक्रिया को तब तक दोहराएँ जब तक आप एकल बिंदु पर न पहुँच जाएँ - यह पैरामीटर के अनुरूप वक्र का बिंदु है .

निम्नलिखित चित्र घन बेज़ियर वक्र के लिए इस प्रक्रिया को दर्शाता है:

DeCasteljau1.svgध्यान दें कि जिन मध्यवर्ती बिंदुओं का निर्माण किया गया था वे वास्तव में दो नए बेज़ियर वक्रों के लिए नियंत्रण बिंदु हैं, दोनों बिल्कुल पुराने के साथ मेल खाते हैं। यह एल्गोरिदम न केवल वक्र का मूल्यांकन करता है , लेकिन वक्र को दो टुकड़ों में विभाजित करता है , और बेज़ियर रूप में दो उप-वक्रों के समीकरण प्रदान करता है।

ऊपर दी गई व्याख्या गैर-तर्कसंगत बेज़ियर वक्र के लिए मान्य है। तर्कसंगत बेज़ियर वक्र का मूल्यांकन करने के लिए , हम इस बिंदु को प्रक्षेपित कर सकते हैं ; उदाहरण के लिए, तीन आयामों में वक्र के अपने नियंत्रण बिंदु हो सकते हैं और वजन भारित नियंत्रण बिंदुओं पर प्रक्षेपित किया गया . फिर एल्गोरिदम सामान्य रूप से आगे बढ़ता है, इंटरपोलेशन करता है . परिणामी चार-आयामी बिंदुओं को परिप्रेक्ष्य विभाजन के साथ तीन-स्थान में वापस प्रक्षेपित किया जा सकता है।

सामान्य तौर पर, तर्कसंगत वक्र (या सतह) पर संचालन प्रक्षेप्य स्थान में गैर-तर्कसंगत वक्र पर संचालन के बराबर होता है। तर्कसंगत वक्रों का मूल्यांकन करते समय भारित नियंत्रण बिंदुओं और वज़न के रूप में यह प्रतिनिधित्व अक्सर सुविधाजनक होता है।

संकेतन

हाथ से गणना करते समय गुणांकों को त्रिभुज योजना में लिखना उपयोगी होता है

एक बिंदु चुनते समय टी0 बर्नस्टीन बहुपद का मूल्यांकन करने के लिए हम बहुपद का विभाजन बनाने के लिए त्रिभुज योजना के दो विकर्णों का उपयोग कर सकते हैं

में

और


बेज़ियर वक्र

एक बेज़ियर वक्र

n + 1 नियंत्रण बिंदु 'पी' के साथ 3-आयामी अंतरिक्ष में डिग्री एन के बेज़ियर वक्र का मूल्यांकन करते समयi

साथ

हमने बेज़ियर वक्र को तीन अलग-अलग समीकरणों में विभाजित किया है

जिसका मूल्यांकन हम डी कैस्टेलजाउ के एल्गोरिदम का उपयोग करके व्यक्तिगत रूप से करते हैं।

उदाहरण

हम बर्नस्टीन गुणांक के साथ डिग्री 2 के बर्नस्टीन बहुपद का मूल्यांकन करना चाहते हैं

बिंदु पर टी0.

हम पुनरावृत्ति प्रारंभ करते हैं

और दूसरे पुनरावृत्ति के साथ पुनरावर्तन रुक जाता है

जो घात 2 का अपेक्षित बर्नस्टीन बहुपद है।

कार्यान्वयन

यहां विभिन्न प्रोग्रामिंग भाषाओं में डी कैस्टेलजाउ के एल्गोरिदम के उदाहरण कार्यान्वयन दिए गए हैं।

हास्केल (प्रोग्रामिंग भाषा)

deCasteljau :: Double -> [(Double, Double)] -> (Double, Double)
deCasteljau t [b] = b
deCasteljau t coefs = deCasteljau t reduced
  where
    reduced = zipWith (lerpP t) coefs (tail coefs)
    lerpP t (x0, y0) (x1, y1) = (lerp t x0 x1, lerp t y0 y1)
    lerp t a b = t * b + (1 - t) * a


पायथन (प्रोग्रामिंग भाषा)

def de_casteljau(t, coefs):
    beta = [c for c in coefs] # values in this list are overridden
    n = len(beta)
    for j in range(1, n):
        for k in range(n - j):
            beta[k] = beta[k] * (1 - t) + beta[k + 1] * t
    return beta[0]


जावास्क्रिप्ट

निम्नलिखित फ़ंक्शन डी कास्टेलजौ के एल्गोरिदम को सरणी पर लागू करता है points, अतिरिक्त गुणों के साथ अंतिम मध्यबिंदु को हल करना in और out (क्रमशः मध्यबिंदु के अंदर और बाहर स्पर्शरेखाओं के लिए)।

function deCasteljau(points, position = 0.5){
	let a, b, midpoints = [];
	while(points.length > 1){
		const num = points.length - 1;
		for(let i = 0; i < num; ++i){
			a = points[i];
			b = points[i+1];
			midpoints.push([
				a[0] + ((b[0] - a[0]) * position),
				a[1] + ((b[1] - a[1]) * position),
			]);
		}
		points = midpoints;
		midpoints = [];
	}
	return Object.assign(points[0], {in: a, out: b});
}

निम्नलिखित उदाहरण इस फ़ंक्शन को कॉल करता हैgreen नीचे बिंदु, वक्र के बिल्कुल आधे रास्ते पर। परिणामी निर्देशांक बराबर होने चाहिए , या सबसे केंद्र की स्थितिred बिंदु।

निकटवर्ती बिंदुओं पर रैखिक प्रक्षेप को पुनरावर्ती रूप से लागू करके मध्यवर्ती रेखा खंड प्राप्त किए जाते हैं।
{
	/* Definition of deCasteljau() function omitted for brevity */
	const nodes = window.document.querySelectorAll("circle.n0-point");
	const points = Array.from(nodes).map(({cx, cy}) => [cx.baseVal.value, cy.baseVal.value]);
	deCasteljau(points); // Result: [192, 32]
}


यह भी देखें

संदर्भ

  • Farin, Gerald & Hansford, Dianne (2000). The Essentials of CAGD. Natic, MA: A K Peters, Ltd. ISBN 1-56881-123-3


बाहरी संबंध