كيفية حساب منحنى بيزير مع نقاط البدء والنهاية فقط؟

StackOverflow https://stackoverflow.com/questions/4034013

  •  26-09-2019
  •  | 
  •  

سؤال

لقد نشرت في الأصل سؤالًا أبسط (وأقل فائدة) ، وقمت بتحرير هذا الأمر ليكون أكثر تحديداً.

تُظهر هذه الرسوم المتحركة من ويكيبيديا بشكل أساسي ما أريد إنجازه ، ومع ذلك - آمل أن تقلبها ، حيث تبدأ في التقدم أكثر نحو الوجهة و "UP" (في هذه الصورة) ، ثم الأقواس مباشرة إلى النهاية نقطة. ومع ذلك ، لا يمكنني سوى الوصول إلى نقطة انطلاق ونقطة نهاية ، ما آمل أن أفعل القوس يذهب في الواقع.http://en.wikipedia.org/wiki/file:bezier_3_big.png (لا يمكن نشر الصورة بسبب انخفاض مندوب)

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

المساعدة أو الاتجاه سيكون موضع تقدير.

هل كانت مفيدة؟

المحلول

بدون فقدان عمومية ، لنفترض أن نقطة النهاية موجودة على المحور X ونقطة البداية أعلاه وإلى يسار نقطة النهاية.

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

يبدو أن هذا المنحنى له الخصائص التي تريدها. يبدأ الضحلة ثم يزيد نحو العمودي مع تسارع الكرة.

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

هل يناسب هذا المنحنى احتياجاتك؟ العثور على هذا المنحنى مشكلة فيزياء أساسية جدا.

نصائح أخرى

لقد انتهيت من مدونة لحساب زاوية منحنى بيزير وتحديد نقاطها المختلفة في مدونتي http://johnexalt.wordpress.com/2011/05/21/bezier-curve-angle-calculation-silverlight/

يوضح الرمز أدناه كيفية حساب نقاط منحنى Bezier بأي قيمة معينة من T (حيث تتراوح T من 0 إلى 100 ٪ ويتم تمثيلها في 0- 1.

x = ((1 - t) * (1 - t) * p0.x) + (2 * t * (1 - t) * p1.x) + (t * t * p2.x) ؛ // يستخدم هذا البيان لتحديد إحداثيات X للمنحنى.

y = ((1 - t) * (1 - t) * p0.Y) + (2 * t * (1 - t) * p1.Y) + (t * t * p2.Y);
//this statement is used to determine the y coordinate of the curve. 

x = Math.Round(x, 3);
y = Math.Round(y, 3);
angle = Math.Round(Angle(xold, yold, x, y), 3);

كان هناك مقالة سابقة قدمها كارلوس فيمير والتي تساعد في حساب الزاوية بين نقطتين. http://www.carlosfemmer.com/post/2006/02/calculate-angle-between-2-points-using-c.aspx.

يبدو أن هناك آلية في .NET يمكن أن تساعدك:Graphics.drawcurve

يرسم خطًا أساسيًا من خلال مجموعة محددة من هياكل النقطة

أيضا ، وجد بحث Google سريع هذه

أنت تريد بشكل أساسي منحنى بيزير مع ثلاث نقاط تحكم - نقطة البداية ، نقطة النهاية ونقطة أخرى في مكان ما بينهما.

إذا كانت نقطة البداية 1 ( x1, y1 ) والنقطة النهائية 2 ( x2, y2 ) ثم المتجه من النقطة 1 إلى النقطة 2 ( dx = x2-x1, dy = y2-y1 ).

نقطة على طول الخط بمبلغ along بين الصفر والآخر ( x1 + along * dx, y1 + along * dy ).

المتجه ( -dy, dx ) هو في الزوايا الصحيحة للخط ، لذلك إذا كنت تريد الخروج من الخط بمقدار above ثم ستكون النقطة الوسط ( x1 + along * dx - above * dy, y1 + along * dy + above * dx).

تغيير قيم على طول وفوق حتى تجد نوع المنحنى المنحرف الذي تريده.

بصرف النظر عن نقطة البدء ونقطة النهاية ، تحتاج إلى وصف "الزاوية" أو انحناء القوس. يمكن أن يكون منحنى Bezier جيدًا ولكن يتم تنفيذه عادةً مع تسلسل أطول من النقاط (حيث يتم تعريف انحناء القوس بواسطة النقاط الأخرى في الخط). القي نظرة على http://en.wikipedia.org/wiki/b٪C3٪A9Zier_Curve ، في الأسفل ، يمكنك العثور على بعض المعلومات حول "المنحنيات التربيعية". أراهن أن بحث Google السريع سيمنحك بعض أمثلة التنفيذ.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top