29/09/2012 - 23:20
मैंने यहाँ एक git रेपो बनाया:
https://github.com/ArthurWulfWhite/Bezier-Distion/
वहाँ से ज़िप के रूप में स्रोत फ़ाइलों को डाउनलोड करने के लिए आपका स्वागत है। इसमें एक डेमो भी शामिल है जिसे आप FlashDevelop का उपयोग करके संकलित कर सकते हैं। डेमो का उपयोग करने के लिए, फ़्लैश डेवलपमेंट में प्रोजेक्ट खोलें और 'टेस्ट प्रोजेक्ट' पर क्लिक करें। डेमो चलाते समय, एक नए बेज़ियर वक्र और एक नए सर्किल को यादृच्छिक बनाने के लिए LMB पर क्लिक करें।
सौभाग्य!
ज़िप लिंक को देखना मुश्किल है - बस Ctrl + F का उपयोग करें और ज़िप टाइप करें। यह स्रोत कुछ हफ्तों के पुन: खोज और प्रोग्रामिंग का प्रतिनिधित्व करता है, मुझे उम्मीद है कि आप इसका आनंद लेंगे।
यदि आप बीज़ियर को पुन: खंडों में विभाजित करने और उनके साथ टकराव की जाँच करने की योजना बनाते हैं, तो मैं सुझाव देता हूं कि 100,100 सरणी (ग्रिड) बनाएं और प्रत्येक खंड को चार निकटतम वर्गों में रखें, इसलिए आपको केवल 4 या 10,000 के साथ टकराव की जाँच करनी होगी। प्रत्येक फ्रेम खंड।
मुझे लगता है कि आप एक प्रोग्रामर के रूप में और एक गेम निर्माता के रूप में दोनों बॉक्स 2 डी से लाभान्वित होंगे, क्योंकि एक 'सरल' भौतिकी इंजन बनाने में बहुत सी छिपी हुई छोटी बाधाएं हैं जो गति को थोड़ा ऊबड़ और कम द्रव लगता है तो यह हो सकता है।
पुराना उत्तर: शुद्ध तरीका।
आप वास्तव में देख सकते हैं कि क्या वृत्त के केंद्र के बीच की दूरी और वक्र पर निकटतम बिंदु के बीच की दूरी की जांच करके, एक वृत्त बेजियर वक्र से टकरा रहा है।
दूरी के लिए समीकरण (सामान्य रूप में)
व्याख्या की:
बेजियर समीकरण:
q(t) = (1-t) * ((1-t) * start.(x,y) + t * control.(x,y)) + t*(t * control.(x,y) + (1 - t) * end.(x,y))
इसे (कुछ बीजगणित के साथ) के लिए संक्षेपित किया जा सकता है - मैं पठनीयता के लिए (x, y) छोड़ दूंगा (वे अभी भी अंक हैं, एक संख्या नहीं)
q(t) = (start -2 * cont + end) t^2 + (-2 * start + 2 * control) + start
बिंदु से दूरी (x, y) है:
sqrt ((q(t).x - point.x)^2 + (q(t).y - point.y)^2)
गेंद पर बेज़ियर पर निकटतम बिंदु को खोजने के लिए, आपको उन सभी बिंदुओं को प्राप्त करने और खोजने की आवश्यकता है जहां व्युत्पन्न शून्य (मूल) के बराबर है। यह तीसरी डिग्री का एक बहुपद है, इसलिए आप एक बंद सूत्र का उपयोग कर सकते हैं, लेकिन यह अविश्वसनीय हो सकता है क्योंकि कंप्यूटर फ्लोटिंग पॉइंट की सटीकता का प्रतिनिधित्व किया गया अंश पर्याप्त नहीं हो सकता है। न्यूटन या उस प्रकृति की किसी चीज़ का उपयोग करना कहीं बेहतर है।
व्युत्पन्न के लिए आपको जड़ों को ढूंढना होगा:
मान लें: a = start b = control c = end d = cirlce केंद्र बिंदु
मुश्किल हिस्सा इस बिंदु को बढ़ा रहा है, आपको डॉट उत्पाद का उपयोग करना होगा।
यदि आप चाहें, तो मेरे पास इसके लिए कोड है और मैं इसे एक फ़ंक्शन के रूप में यहां साझा कर सकता हूं जो बस टक्कर देता है या नहीं और टक्कर का कोण होता है। कुछ समस्याएं टकराव के इंजन के भोले क्रियान्वयन में दिखाई दे सकती हैं, उदाहरण के लिए एक तेज चलती गेंद को दो घटों के बीच पकड़ा जा सकता है।
मैं इसे अभी के लिए टालने की सलाह देता हूं, बस एक्स अक्ष के लिए गुणांक और y अक्ष के लिए योग करें और उन्हें जोड़ दें।
जड़ों को खोजने के लिए आप न्यूटन की तरह किसी भी विश्वसनीय विधि का उपयोग कर सकते हैं, बेज़ियर पर रूट बिंदुओं से दूरी की जांच करें, सर्कल सेंटर के लिए 0 <= t <= 1 और सर्कल के दो सिरों के लिए दूरी की जांच करें (शुरुआत) और अंत) सर्कल सेंटर में, जो भी निकटतम है, आपको बताएगा कि क्या कोई टक्कर है।
यदि त्रिज्या न्यूनतम दूरी से छोटी है, तो टकराव होता है।
कोण लगभग चक्र के केंद्र और बीज़ियर पर निकटतम बिंदु के बीच एक है।
कहा जा रहा है, यदि आप वास्तव में टक्कर भौतिकी के साथ एक खेल बनाने की इच्छा रखते हैं, तो मैं आपको सुझाव देता हूं कि आप बेजियर पर बस पुनरावृति करें
q(t) = (1-t) * ((1-t) * start.(x,y) + t * control.(x,y)) + t*(t * control.(x,y) + (1 - t) * end.(x,y))
बीच में प्रत्येक टुकड़े को पुनरावर्ती रूप से विभाजित करें जब तक कि यह काफी छोटा न हो, 10 पिक्सेल या उससे कम का कहना है, तो बक्सों से मोटे तौर पर निर्माण करें और भौतिकी के लिए Box2d का उपयोग करें क्योंकि यह संभव है कि यह सभी टकराव पहचान कोड लिखना एक महान साबित होगा। टाइम सिंक जो कि गेमप्ले को ज्यादा नहीं बढ़ाता है। Box2d का उपयोग अतीत में अनगिनत परियोजनाओं में खुद को साबित किया है।