تقنية

منحنى بيزييه: احسب نقطة وقسّم المسار بخوارزمية دي كاستلجو

طبقات المثال من P إلى Q ثم R ونقطة B عند t يساوي ربعًا
اخترنا أربع نقاط لإنتاج قوس، ثم حسبنا النقاط الملونة بالترتيب. الحروف تقابل جدول الحساب أدناه؛ الرسم مولد من القيم نفسها.

يتحدد مقطع بيزييه التكعيبي بنقطة بداية ونقطة نهاية ونقطتي تحكم. في SVG يرسمه الأمر C بهذه البيانات. [3] سنحسب مقطعًا كاملًا من أربع نقاط نختارها، ثم نقسمه عند نقطة معلومة ونفحص بقاء المسار نفسه.

الخلاصة السريعة

  • نقاط مثالنا هي P0=(0,0)، وP1=(0,8)، وP2=(12,8)، وP3=(12,0).
  • عند t=1/4 تنتهي ثلاث طبقات حساب إلى B=(1.875,4.5).
  • نقطة الفصل تصبح نهاية الجزء الأول وبداية الجزء الثاني، مع مجموعتين جديدتين للتحكم.
  • عند زيادات متساوية في t، أعطى مثالنا مسافات مختلفة بين النقاط المتتابعة.
  • تحققنا بكسور دقيقة من 900 حالة و20709 اختبارات، منها مطابقة القطعتين للأصل بعد تحويل المعامل.

ابدأ بأربع نقاط مرتبة

ارسم محور x أفقيًا ومحور y إلى أعلى. ضع P0 وP3 على الخط y=0، وباعد بينهما 12 وحدة. ضع P1 فوق P0 بثماني وحدات، وP2 فوق P3 بالمقدار نفسه. وصل النقاط الأربع بخط متقطع ليظهر ترتيب المدخل، ثم اترك هذا المضلع ظاهرًا عند رسم القوس.

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

احسب النقطة بتكرار الاستيفاء

تمزج خوارزمية دي كاستلجو كل نقطتين متجاورتين بالعلاقة L(A,D,t)=(1−t)A+tD. تعيد العملية على الصف الناتج حتى تبقى نقطة واحدة، مع استعمال t نفسه في جميع الصفوف. [1]

نختار t=1/4، فتصبح العملية ثلاثة أرباع النقطة الأولى وربع الثانية. نحسبها على x وy منفصلين. مثلًا Q1 يأتي من P1 وP2: إحداثيه الأفقي 3/4×0+1/4×12=3، وإحداثيه الرأسي 3/4×8+1/4×8=8. بقاؤه على الخط y=8 نتيجة الحساب، وليس قيدًا أضفناه لاحقًا.

كل طبقة تستعمل سابقتها
النقطةالمدخلان(x,y)
Q0P0, P1(0,2)
Q1P1, P2(3,8)
Q2P2, P3(12,6)
R0Q0, Q1(0.75,3.5)
R1Q1, Q2(5.25,7.5)
BR0, R1(1.875,4.5)

في الخطوة الأخيرة، x=3/4×0.75+1/4×5.25=1.875، وy=3/4×3.5+1/4×7.5=4.5. عدد النقاط ينخفض من أربع إلى ثلاث ثم اثنتين ثم واحدة. إذا وجدت أربع نقاط في الصف الثاني، فقد خلطت بين الاحتفاظ بنقطة قديمة وتوليد نقطة جديدة.

تحقق بصيغة مستقلة عن الجدول

بتوسيع عمليات المزج الثلاث في مثالنا نحصل على x(t)=36t²−24t³ وy(t)=24t−24t². نعوض 1/4: الأفقي 36/16−24/64=15/8، والرأسي 6−1.5=4.5. هذه النتيجة توافق آخر صف دون استعمال Q وR من الجدول.

التعويض بصفر يعطي (0,0)، وبواحد يعطي (12,0)، وبنصف يعطي (6,6). كذلك y=24t(1−t)=6−24(t−1/2)²، فلا يتجاوز 6 في هذا المثال. لذلك نقطتا التحكم اللتان تقعان عند y=8 لا تقعان على القوس المختار. فرق الارتفاع يظهر في الرسم والحساب معًا.

استخرج القطعتين من حافتي الحساب

للتقسيم نأخذ أول نقطة من كل صف بالترتيب، ثم آخر نقطة من كل صف بالترتيب المعكوس. المجموعتان هما نقاط التحكم للجزأين قبل موضع الفصل وبعده. [2]

في حسابنا مجموعة اليسار هي P0، Q0، R0، B: أي (0,0)، (0,2)، (0.75,3.5)، (1.875,4.5). مجموعة اليمين هي B، R1، Q2، P3: أي (1.875,4.5)، (5.25,7.5)، (12,6)، (12,0). كلمة اليسار هنا اسم الجزء السابق في ترتيب المسار؛ لا نعتمد عليها قاعدة مكانية لأي قوس آخر.

الجزء السابق باللون الأخضر والجزء اللاحق بالبرتقالي مع نقاط تحكم كل منهما
نقطة B مشتركة بين الجزأين. الخطوط المتقطعة هي مضلعات التحكم الجديدة؛ الألوان تقسّم القوس نفسه دون فراغ بين القطعتين.

نعطي كل قطعة معاملًا محليًا u بين صفر وواحد. نتحقق من الجزء الأول عند t=u/4، ومن الثاني عند t=1/4+3u/4. مثلًا u=1/2 في الأول يقابل t=1/8 في الأصل، لا t=1/2. اختبرنا العلاقتين بقيم كسرية في البرنامج؛ المقارنة المباشرة بين u وt بلا تحويل كانت ستقارن نقطتين مختلفتين.

اكتب القوس نفسه في SVG

الأمر M يحدد البداية، ثم يستقبل C نقطتي التحكم والنهاية. الحروف الكبيرة تستعمل إحداثيات مطلقة. [3] نعرض مسارنا بالإحداثيات التعليمية نفسها، ونقلب اتجاه y في مجموعة الرسم حتى يبقى الأعلى موجبًا.

<svg xmlns="http://www.w3.org/2000/svg"
     viewBox="-1 -1 14 10">
  <g transform="translate(0 8) scale(1 -1)">
    <path d="M0 0 C0 8 12 8 12 0"
          fill="none" stroke="teal" stroke-width="0.08"/>
  </g>
</svg>

إذا رسمت القيم دون تحويل المحور داخل نافذة SVG المعتادة، سيظهر اتجاه القوس مقلوبًا عمّا رسمناه على الورق. لا تصلح هذا بتغيير قيم نقاط التحكم في جدول الحساب؛ اختر أولًا اتفاق المحاور الذي تريد عرضه. احتفظنا بالقيم نفسها واستعملنا تحويل العرض فقط.

هل ربع المعامل يعني ربع المسافة؟

نأخذ t بالقيم 0، 1/4، 1/2، 3/4، 1. النقاط الناتجة هي (0,0)، (1.875,4.5)، (6,6)، (10.125,4.5)، (12,0). المسافة المستقيمة بين أول نقطتين 4.875، وبين الثانية والثالثة نحو 4.3893. الزيادتان في t متساويتان، لكن القفزتين المرسومتين ليستا متساويتين.

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

ما الذي تحققنا منه؟

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

استعملت المقارنات كسورًا دقيقة لتجنب حسم النتيجة بتسامح عشري. واجتاز مثال بأربع نقاط متطابقة فحص البقاء عند (2,3). هذه اختبارات حسابية فعلية للنموذج المرفق؛ لا تجعل صورة محدودة البكسلات رسمًا بدقة لا نهائية. يستطيع القارئ إعادة جدول ربع المعامل أولًا، ثم تغيير نقطة واحدة وملاحظة ما يتغير.

المصادر

  1. Michigan Tech: خوارزمية دي كاستلجو
  2. Michigan Tech: تقسيم منحنى بيزييه
  3. W3C: أوامر المسارات في SVG

أُعد هذا المقال بمساعدة الذكاء الاصطناعي، مع اختبارات حسابية ومراجعة داخلية بالأداة. لا ينسب إلى مراجع بشري مستقل.