خوارزمية دي كاستيلجو

في مجال التحليل العددي الرياضي ، تُعدّ خوارزمية دي كاستيلجو طريقةً تكراريةً لتقييم كثيرات الحدود في صيغة برنشتاين أو منحنيات بيزير ، وقد سُمّيت نسبةً إلى مخترعها بول دي كاستيلجو . كما يُمكن استخدام خوارزمية دي كاستيلجو لتقسيم منحنى بيزير واحد إلى منحنيين عند قيمة مُعامل اختيارية.

تتميز الخوارزمية بالاستقرار العددي [ 1 ] عند مقارنتها بالتقييم المباشر لكثيرات الحدود. ويبلغ التعقيد الحسابي لهذه الخوارزميةيا(دن2){\displaystyle O(dn^{2})}حيث يمثل d عدد الأبعاد، و n عدد نقاط التحكم. توجد بدائل أسرع. [ 2 ] [ 3 ]

تعريف

منحنى بيزيرب{\displaystyle B}(درجة)ن{\displaystyle n}، مع نقاط تحكمβ0،...،βن{\displaystyle \beta _{0},\ldots ,\beta _{n}}يمكن كتابة ) بصيغة برنشتاين على النحو التالي ب(ت)=أنا=0نβأنابأنا،ن(ت)،{\displaystyle B(t)=\sum _{i=0}^{n}\beta _{i}b_{i,n}(t),} أينب{\displaystyle b}هي متعددة حدود أساس برنشتاينبأنا،ن(ت)=(نأنا)(1-ت)ن-أناتأنا.{\displaystyle b_{i,n}(t)={n \choose i}(1-t)^{ni}t^{i}.} المنحنى عند النقطةت0{\displaystyle t_{0}}يمكن تقييمها باستخدام علاقة التكرارβأنا(0):=βأنا،أنا=0،...،نβأنا(ج):=βأنا(ج-1)(1-ت0)+βأنا+1(ج-1)ت0،أنا=0،...،ن-ج،  ج=1،...،ن\begin{aligned}\beta_{i}^{(0)}&:=\beta_{i},&&i=0,\ldots,n\\\beta_{i}^{(j)}&:=\beta_{i}^{(j-1)}(1-t_{0})+\beta_{i+1}^{(j-1)}t_{0},&&i=0,\ldots,nj,\ \ j=1,\ldots,n\end{aligned}}}

ثم تقييمب{\displaystyle B}عند النقطةت0{\displaystyle t_{0}}يمكن تقييمها في(ن2){\textstyle {\binom {n}{2}}}العمليات. النتيجةب(ت0){\displaystyle B(t_{0})}يُعطى بواسطة ب(ت0)=β0(ن).{\displaystyle B(t_{0})=\beta _{0}^{(n)}.}

علاوة على ذلك، منحنى بيزيرب{\displaystyle B}يمكن تقسيمها عند نقطةت0{\displaystyle t_{0}}إلى منحنيين مع نقاط تحكم خاصة بهما: β0(0)،β0(1)،...،β0(ن)β0(ن)،β1(ن-1)،...،βن(0){\displaystyle {\begin{aligned}&\beta _{0}^{(0)},\beta _{0}^{(1)},\ldots ,\beta _{0}^{(n)}\\[1ex]&\beta _{0}^{(n)},\beta _{1}^{(n-1)},\ldots ,\beta _{n}^{(0)}\end{aligned}}}

التفسير الهندسي

التفسير الهندسي لخوارزمية دي كاستيلجو واضح ومباشر.

  • لنفترض منحنى بيزير بنقاط تحكمP0،...،Pن{\displaystyle P_{0},\dots ,P_{n}}. من خلال توصيل النقاط المتتالية، نقوم بإنشاء المضلع المتحكم في المنحنى.
  • الآن، قسّم كل قطعة مستقيمة من هذا المضلع بنسبةت:(1-ت){\displaystyle t:(1-t)}ثم قم بتوصيل النقاط التي تحصل عليها. بهذه الطريقة ستصل إلى المضلع الجديد الذي يحتوي على قطعة أقل.
  • كرر العملية حتى تصل إلى نقطة واحدة - هذه هي نقطة المنحنى التي تتوافق مع المعلمةت{\displaystyle t}.

توضح الصورة التالية هذه العملية لمنحنى بيزير مكعب:

لاحظ أن النقاط الوسيطة التي تم إنشاؤها هي في الواقع نقاط تحكم لمنحنيين جديدين من منحنيات بيزير، وكلاهما يتطابق تمامًا مع المنحنى القديم. لا تقوم هذه الخوارزمية بتقييم المنحنى عندت{\displaystyle t}لكنها تقسم المنحنى إلى جزأين عندت{\displaystyle t}، ويقدم معادلات المنحنيين الفرعيين في شكل بيزير.

التفسير المذكور أعلاه صالح لمنحنى بيزير غير العقلاني. لتقييم منحنى بيزير العقلاني فيRن{\displaystyle \mathbf {R} ^{n}}، قد نسقط النقطة فيRن+1{\displaystyle \mathbf {R} ^{n+1}}على سبيل المثال، قد يكون للمنحنى في ثلاثة أبعاد نقاط تحكم خاصة به.{(xأنا،yأنا،zأنا)}{\displaystyle \{(x_{i},y_{i},z_{i})\}}والأوزان{wأنا}{\displaystyle \{w_{i}\}}تم إسقاطها على نقاط التحكم المرجحة{(wأناxأنا،wأناyأنا،wأناzأنا،wأنا)}{\displaystyle \{(w_{i}x_{i},w_{i}y_{i},w_{i}z_{i},w_{i})\}}ثم تتابع الخوارزمية عملها كالمعتاد، مع إجراء الاستيفاء فيR4{\displaystyle \mathbf {R} ^{4}}. يمكن إسقاط النقاط رباعية الأبعاد الناتجة مرة أخرى في الفضاء ثلاثي الأبعاد باستخدام تقسيم المنظور .

بشكل عام، تُكافئ العمليات على منحنى (أو سطح) كسري العمليات على منحنى غير كسري في فضاء إسقاطي . وغالبًا ما يكون هذا التمثيل، المتمثل في "نقاط التحكم الموزونة" والأوزان، مفيدًا عند تقييم المنحنيات الكسرية.

الترميز

عند إجراء الحساب يدويًا، من المفيد كتابة المعاملات في شكل مثلث كما يلي: β0=β0(0)β0(1)β1=β1(0)β0(ن)βن-1=βن-1(0)βن-1(1)βن=βن(0)\begin{matrix}\beta_{0}=\beta_{0}^{(0)}&&&\\&&\beta_{0}^{(1)}&&\\\beta_{1}=\beta_{1}^{(0)}&&&\\&&&\ddots &\\\vdots &&\vdots &&\beta_{0}^{(n)}\\&&&&\\\beta_{n-1}=\beta_{n-1}^{(0)}&&&\\&&\beta_{n-1}^{(1)}&&\\\beta_{n}=\beta_{n}^{(0)}&&&\\\end{matrix}}} عند اختيار نقطة t = 0 لتقييم متعددة حدود برنشتاين، يمكننا استخدام قطري مخطط المثلث لإنشاء قسمة متعددة الحدود. ب(ت)=أنا=0نβأنا(0)بأنا،ن(ت)،ت[0،1]{\displaystyle B(t)=\sum _{i=0}^{n}\beta _{i}^{(0)}b_{i,n}(t),\quad t\in [0,1]} داخل ب1(ت)=أنا=0نβ0(أنا)بأنا،ن(تت0)،ت[0،ت0]{\displaystyle B_{1}(t)=\sum _{i=0}^{n}\beta _{0}^{(i)}b_{i,n}\left({\frac {t}{t_{0}}}\right)\!,\quad t\in [0,t_{0}]} و ب2(ت)=أنا=0نβأنا(ن-أنا)بأنا،ن(ت-ت01-ت0)،ت[ت0،1].{\displaystyle B_{2}(t)=\sum _{i=0}^{n}\beta _{i}^{(ni)}b_{i,n}\left({\frac {t-t_{0}}{1-t_{0}}}\right)\!,\quad t\in [t_{0},1].}

منحنى بيزير

يُظهر رسم متحرك لمنحنى بيزير تربيعي طبقتين من الاستيفاء الخطي الزوجي بين النقاط الثلاث للمنحنى ثم النقاط المستوفاة، مع إيجاد الاستيفاء الثاني للنقطة على المنحنى.
منحنى بيزير من الدرجة الثانية
يُظهر رسم متحرك لمنحنى بيزير مكعب ثلاث طبقات من الاستيفاء الخطي الزوجي بين النقاط الأربع للمنحنى ثم النقاط المستوفاة المتتالية، مع إيجاد الاستيفاء الثالث للنقطة على المنحنى.
منحنى بيزير من الدرجة الثالثة
يُظهر رسم متحرك لمنحنى بيزير من الدرجة الرابعة أربع طبقات من الاستيفاء الخطي الزوجي بين النقاط الخمس للمنحنى والنقاط المستوفاة المتتالية، مع إيجاد الاستيفاء الرابع للنقطة على المنحنى.
منحنى بيزير من الدرجة الرابعة

عند تقييم منحنى بيزير من الدرجة n في فضاء ثلاثي الأبعاد مع n + 1 نقطة تحكم P iب(ت)=أنا=0نPأنابأنا،ن(ت)، ت[0،1]{\displaystyle \mathbf {B} (t)=\sum _{i=0}^{n}\mathbf {P} _{i}b_{i,n}(t),\ t\in [0,1]} مع Pأنا:=(xأناyأناzأنا)،{\displaystyle \mathbf {P} _{i}:={\begin{pmatrix}x_{i}\\y_{i}\\z_{i}\end{pmatrix}},} نقسم منحنى بيزير إلى ثلاث معادلات منفصلة ب1(ت)=أنا=0نxأنابأنا،ن(ت)،ت[0،1]ب2(ت)=أنا=0نyأنابأنا،ن(ت)،ت[0،1]ب3(ت)=أنا=0نzأنابأنا،ن(ت)،ت[0،1]{\displaystyle {\begin{aligned}B_{1}(t)&=\sum _{i=0}^{n}x_{i}b_{i,n}(t),&t\in [0,1]\\[1ex]B_{2}(t)&=\sum _{i=0}^{n}y_{i}b_{i,n}(t),&t\in [0,1]\\[1ex]B_{3}(t)&=\sum _{i=0}^{n}z_{i}b_{i,n}(t),&t\in [0,1]\end{aligned}}} والتي نقوم بتقييمها بشكل فردي باستخدام خوارزمية دي كاستيلجو.

مثال

نريد حساب قيمة متعددة حدود برنشتاين من الدرجة الثانية بمعاملات برنشتاين β0(0)=β0β1(0)=β1β2(0)=β2{\displaystyle {\begin{aligned}\beta _{0}^{(0)}&=\beta _{0}\\[1ex]\beta _{1}^{(0)}&=\beta _{1}\\[1ex]\beta _{2}^{(0)}&=\beta _{2}\end{aligned}}} عند النقطة t 0 .

نبدأ التكرار بـ β0(1)=β0(0)(1-ت0)+β1(0)ت0=β0(1-ت0)+β1ت0β1(1)=β1(0)(1-ت0)+β2(0)ت0=β1(1-ت0)+β2ت0{\displaystyle {\begin{aligned}\beta _{0}^{(1)}&&=&&\beta _{0}^{(0)}(1-t_{0})+\beta _{1}^{(0)}t_{0}&&=&&\beta _{0}(1-t_{0})+\beta _{1}t_{0}\\[1ex]\beta _{1}^{(1)}&&=&&\beta _{1}^{(0)}(1-t_{0})+\beta _{2}^{(0)}t_{0}&&=&&\beta _{1}(1-t_{0})+\beta _{2}t_{0}\end{aligned}}} ومع التكرار الثاني، يتوقف التكرار مع β0(2)=β0(1)(1-ت0)+β1(1)ت0 =β0(1-ت0)(1-ت0)+β1ت0(1-ت0)+β1(1-ت0)ت0+β2ت0ت0 =β0(1-ت0)2+β12ت0(1-ت0)+β2ت02{\displaystyle {\begin{aligned}\beta _{0}^{(2)}&=\beta _{0}^{(1)}(1-t_{0})+\beta _{1}^{(1)}t_{0}\\\ &=\beta _{0}(1-t_{0})(1-t_{0})+\beta _{1}t_{0}(1-t_{0})+\beta _{1}(1-t_{0})t_{0}+\beta _{2}t_{0}t_{0}\\\ &=\beta _{0}(1-t_{0})^{2}+\beta _{1}2t_{0}(1-t_{0})+\beta _{2}t_{0}^{2}\end{aligned}}} وهو متعدد الحدود المتوقع لبرنشتاين من الدرجة الثانية . 

التطبيقات

فيما يلي أمثلة على تطبيقات خوارزمية دي كاستيلجو في لغات برمجة مختلفة.

deCasteljau :: Double -> [( Double , Double )] -> ( Double , Double )deCasteljau t [ b ] = bمعاملات دي كاستيلجو t = دي كاستيلجو t المخفضةأينتم تقليلها = 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 : float , coefs : list [ float ]) -> float :"""خوارزمية دي كاستيلجاو."""beta = coefs.copy () # يتم استبدال القيم في هذه القائمةn = len ( beta )for j in range ( 1 , n ):لكل k في النطاق ( n - j ):بيتا [ ك ] = بيتا [ ك ] * ( 1 - ت ) + بيتا [ ك + 1 ] * تإرجاع بيتا [ 0 ]
دالة عامة مزدوجة deCasteljau ( مزدوجة t ، مزدوجة [] معاملات ) {double [] beta = المعاملات ؛int n = beta . length ;for ( int i = 1 ; i < n ; i ++ ) {for ( int j = 0 ; j < ( n - i ); j ++ ) {beta [ j ] = beta [ j ] * ( 1 - t ) + beta [ j + 1 ] * t ;}}أعد بيتا [ 0 ] ؛}

مثال برمجي بلغة جافا سكريبت

تُطبّق دالة جافا سكريبت التالية خوارزمية دي كاستيلجو على مصفوفة من نقاط التحكم أو الأقطاب ، كما سماها دي كاستيلجو في الأصل، لتقليصها واحدة تلو الأخرى حتى الوصول إلى نقطة في المنحنى عند قيمة زمنية معينة t، حيث تكون القيمة 0 للنقطة الأولى من المنحنى و1 للنقطة الأخيرة.

دالة crlPtReduceDeCasteljau ( نقاط ، t ) {let retArr = [ points . slice () ];بينما ( طول النقاط > 1 ) {let midpoints = [];for ( let i = 0 ; i + 1 < points.length ; ++ i ) {let ax = points [ i ][ 0 ];let ay = points [ i ][ 1 ];let bx = points [ i + 1 ][ 0 ];let by = points [ i + 1 ][ 1 ];// a * (1-t) + b * t = a + (b - a) * tنقاط المنتصف . دفع ([ax + ( bx - ax ) * t ,ay + ( by - ay ) * t ,]);}retArr.push ( midpoints )النقاط = نقاط المنتصف ؛}أعد retArr ؛}

على سبيل المثال،

أقطاب فار = [ [ 0 , 128 ], [ 128 , 0 ], [ 256 , 0 ], [ 384 , 128 ] ] crlPtReduceDeCasteljau ( أقطاب , .5 )

يُعيد المصفوفة

[ [ [ 0 , 128 ], [ 128 , 0 ], [ 256 , 0 ], [ 384 , 128 ] ], [ [ 64 , 64 ], [ 192 , 0 ], [ 320 , 64 ] ], [ [ 128 , 32 ], [ 256 , 32 ]], [ [ 192 , 32 ]] ]

مما ينتج عنه النقاط والقطاعات الموضحة أدناه:

قطع مستقيمة وسيطة يتم الحصول عليها عن طريق تطبيق الاستيفاء الخطي بشكل متكرر على النقاط المتجاورة
قطع مستقيمة وسيطة يتم الحصول عليها عن طريق تطبيق الاستيفاء الخطي بشكل متكرر على النقاط المتجاورة

انظر أيضاً

مراجع

  1. ديلجادو، ج.؛ ماينار، إ.؛ بينيا، ج.م. (2023-10-01). "حول دقة خوارزميات دي كاستيلجو وتمثيلات برنشتاين" . التصميم الهندسي بمساعدة الحاسوب . 106 102243. doi : 10.1016/j.cagd.2023.102243 . ISSN 0167-8396 . 
  2. ووزني، باويل؛ تشودي، فيليب (2020-01-01). "خوارزمية هندسية خطية لتقييم منحنيات بيزير" . التصميم بمساعدة الحاسوب . 118 102760. arXiv : 1803.06843 . doi : 10.1016/j.cad.2019.102760 . ISSN 0010-4485 . 
  3. فودا، كيارا؛ رامانانتوانينا، أندرياماهينينا؛ هورمان، كاي (2024). "مقارنة شاملة للخوارزميات المستخدمة في تقييم منحنيات بيزير العقلانية" . ملاحظات بحثية حول التقريب في جبال الدولوميت . 17 (9/2024): 56-78 . doi : 10.14658/PUPJ-DRNA-2024-3-9 . ISSN 2035-6803 . 
  • فارين، جيرالد إي.؛ هانسفورد، ديان (2000). أساسيات تصميم الرعاية الصحية بمساعدة الحاسوب . ناتيك، ماساتشوستس: إيه كيه بيترز. رقم ISBN 978-1-56881-123-9.