2012-02-29 10 views
10

पर ले जाएं, मैं अपनी छवि को बेज़ीर वक्र पथ पर ऊपर से नीचे ले जाना चाहता हूं लेकिन मुझे यह नहीं पता कि मैं इस पथ से एक्स/वाई पॉइंट्स और ढलान की गणना कैसे कर सकता हूं। मार्ग का अनुसरण छवि की तरह दिखता है:किसी ऑब्जेक्ट को बेज़ीयर वक्र पथ

enter image description here

मैं अंक, अंत अंक और दो नियंत्रण बिंदुओं शुरू की है।

Path path = new Path(); 
Point s = new Point(150, 5); 
Point cp1 = new Point(140, 125); 
Point cp2 = new Point(145, 150); 
Point e = new Point(200, 250); 
path.moveTo(s.x, s.y); 
path.cubicTo(cp1.x, cp1.y, cp2.x, cp2.y, e.x, e.y); 

उत्तर

11

यह एक घन Bézier वक्र जिसके लिए सूत्र बस [x,y]=(1–t)^3*P0+3(1–t)^2*t*P1+3(1–t)t^2*P2+t^3*P3 है। इसके साथ आप समीकरण का मूल्यांकन करके प्रत्येक बिंदु के लिए हल कर सकते हैं। जावा में इस आप इसे इस तरह कर सकता है:

/* t is time(value of 0.0f-1.0f; 0 is the start 1 is the end) */ 
Point CalculateBezierPoint(float t, Point s, Point c1, Point c2, Point e) 
{ 
    float u = 1 – t; 
    float tt = t*t; 
    float uu = u*u; 
    float uuu = uu * u; 
    float ttt = tt * t; 

    Point p = new Point(s.x * uuu, s.y * uuu); 
    p.x += 3 * uu * t * c1.x; 
    p.y += 3 * uu * t * c1.y; 
    p.x += 3 * u * tt * c2.x; 
    p.y += 3 * u * tt * c2.y; 
    p.x += ttt * e.x; 
    p.y += ttt * e.y; 

    return p; 
} 

तो अगर आप मार्ग के किनारे एक स्प्राइट जाना चाहते थे, तो आप बस 0 मान से टी मान सेट होगा - पर कितनी दूर नीचे निर्भर करता है 1 जिस मार्ग को आप बनना चाहते हैं। उदाहरण:

int percentMovedPerFrame = 1;// Will complete path in 100 frames 
int currentPercent = 0; 
update() { 
    if (currentPercent < 100) { 
     this.pos = CalculateBezierPoint(currentPercent/100.0f, this.path.s, this.path.c1, this.path.c2, this.path.e); 
     currentPercent += percentMovedPerFrame 
    } 
} 
+0

हैलो ... मैं स्थानांतरित करना चाहता हूं मैन्युअल रूप से पथ पर छवि। मेरा मतलब है कि मैं टच इवेंट पर छवि को स्थानांतरित करना चाहता हूं .. मैं इसके लिए अपना कोड कैसे संशोधित कर सकता हूं ?? –

+0

मेरा कोड उतना ही मैनुअल है जितना आप संभवतः तब तक प्राप्त कर सकते हैं जब तक कि आप उस छवि के लिए रास्टरराइजिंग रूटीन लिखना नहीं चाहते ... –

4

यदि आपके पास केवल 2 नियंत्रण बिंदु हैं, तो बेजियर वक्र एक रैखिक रेखा है।

यदि आपके पास 3 है, तो आपके पास एक वर्गबद्ध वक्र है। 4 नियंत्रण बिंदु एक घन वक्र परिभाषित करते हैं।

बेजियर वक्र कार्य हैं जो "समय" पर निर्भर करते हैं। यह 0.0 - 1.0 से चला जाता है। यदि आप समीकरण में 0 दर्ज करते हैं, तो आपको वक्र की शुरुआत में मूल्य मिलता है। यदि आप 1.0 दर्ज करते हैं, तो अंत में मूल्य।

बेजियर वक्र पहले और अंतिम नियंत्रण बिंदुओं को विभाजित करते हैं, इसलिए वे आपके शुरुआती और समापन बिंदु होंगे। सावधानी से देखो कि वक्र उत्पन्न करने के लिए आप किस पैकेज या लाइब्रेरी का उपयोग कर रहे हैं।

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

+0

क्या आप मुझे 2 और 3 नियंत्रण बिंदुओं के साथ एक बेजियर वक्र के वर्गबद्ध समीकरण को कैसे प्राप्त कर सकते हैं, इस पर कुछ संकेत दे सकते हैं। –

+0

देखें: http://en.wikipedia.org/wiki/B%C3%A9zier_curve यह रैखिक, वर्गिक और घन – PixelPerfect3

+0

के लिए समीकरण दिखाता है यह भी ध्यान दें कि आपके उदाहरण में आपके पास 4 नियंत्रण-बिंदु हैं। स्टार्ट- एंड एंड पॉइंट को कंट्रोल पॉइंट भी माना जाता है। वक्र का मूल्यांकन करने के लिए विकी के 'घन बेज़ीर वक्र' अनुभाग में अंतिम सूत्र का उपयोग करें। जैसे पी 0 = एस, पी 1 = सीपी 1, पी 2 = सीपी 2, पी 3 = ई बी (0) = एस और बी (1) = ई आपके उदाहरण में। – Dirk

7

बेजियर वक्र पर एक बिंदु खोजने के लिए, आप डी कास्टेलजौ एल्गोरिदम का उपयोग कर सकते हैं।

उदाहरण के लिए देखें http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/Bezier/de-casteljau.html या कुछ कार्यान्वयन खोजने के लिए Google का उपयोग करें।

16

एंड्रॉइड आपको जो चाहिए वह पूरा करने के लिए आपको एक एपीआई देता है। एंड्रॉइड.graphics.PathMeasure नामक कक्षा का प्रयोग करें। दो तरीकों से आप उपयोगी पाएंगे: getLength(), पथ की पिक्सल में कुल लंबाई को पुनर्प्राप्त करने के लिए, और getPosTan(), एक्स को पुनः प्राप्त करने के लिए, निर्दिष्ट दूरी पर वक्र पर बिंदु की वाई स्थिति (साथ ही साथ इस स्थान पर टेंगेंट।)

उदाहरण के लिए, यदि getLength() 200 लौटाता है और आप वक्र के बीच में बिंदु की वाई स्थिति को जानना चाहते हैं, तो दूरी = 100 के साथ getPosTan() को कॉल करें।

और जानकारी: http://developer.android.com/reference/android/graphics/PathMeasure.html

+0

http://stackoverflow.com/questions/18651025/how-to-move-image-on-curve-on-touch-event-in-android कृपया इस प्रश्न पर मेरी सहायता करें –

3

ध्यान दें कि एक घन बेज़ियर की पैरामीट्रिक रूप में पैरामीटर को बदलने रैखिक परिणाम का उत्पादन नहीं करता। दूसरे शब्दों में, टी = 0.5 सेटिंग आपको वही बिंदु नहीं देता है जो वक्र के साथ आधा रास्ते है। वक्रता (जो नियंत्रण बिंदुओं द्वारा परिभाषित किया गया है) के आधार पर पथ के साथ गैर-रैखिकताएं होंगी।

0

बेजियर वक्र Bezier curve calculator के स्थिर मूल्य बिंदुओं की गणना करने की आवश्यकता रखने वाले किसी भी व्यक्ति के लिए एक अच्छा स्रोत है। विशेष रूप से यदि आप चौथे चतुर्भुज का उपयोग करते हैं (यानी एक्स लाइन और -Y लाइन के बीच)।फिर आप नकारात्मक मूल्य पर मॉड कर रहे एंड्रॉइड समन्वय प्रणाली को पूरी तरह से मैप कर सकते हैं।

संबंधित मुद्दे