2011-04-07 2 views
16

मैं गोलाकार कोनों के साथ एक आयत खींचने की कोशिश कर रहा हूं। मेरे पास एक जावास्क्रिप्ट पथ है जो यह करता है, लेकिन जावास्क्रिप्ट arcTo विधि एक आयताकार (अपने अंडाकार को परिभाषित करने के लिए) लेता है और फिर एक पैरा जो स्वीप सेट करता है।क्या कोई व्यक्ति arcTo के अंतिम दो पैरा समझा सकता है?

हालांकि, एंड्रॉइड संस्करण में तीन पैरा हैं। आयताकार अंडाकार (जो मुझे लगता है कि मैंने सही ढंग से परिभाषित किया है) और फिर स्टार्टएंगल और स्वीपएंगल (जिसे मैं उपयोग को समझ नहीं पा रहा हूं), लेकिन मेरी चापों को कुछ भी नहीं दिख रहा है जो मैं उम्मीद कर रहा हूं जब मैं कैसे नूडल करता हूं मुझे लगता है कि उन्हें काम करना चाहिए।

क्या किसी को इस पर एक अच्छा ट्यूटोरियल पता है?

विशेष रूप से मैं यह समझने की कोशिश कर रहा हूं कि दो पैरा कैसे दिखेंगे यदि मैं 12 - 3 से एक चाप (घड़ी के चेहरे पर) खींचने की कोशिश कर रहा था, और फिर मुझे लगता है कि मेरे पास एक रेखा है जो 3 से नीचे चली गई है और उसके बाद कोने को 3 से 6 तक और आगे की ओर जाने की आवश्यकता थी।

यहाँ मेरी कोड (चाप संख्या अब उपेक्षा में वहाँ ... कि बस मेरी, यह कैसे काम कर सकते हैं पर अनुमान लगा पिछले है, और अधिक समझदार प्रयासों पर विफल होने के नवीनतम यात्रा है):

Path ctx = new Path(); 
     ctx.moveTo(X+5,Y); //A 
     ctx.lineTo(X+W-5,Y);//B 
     ctx.arcTo(new RectF(X+W, Y, X+W, Y+5), -180, 90); //B arc 

     ctx.lineTo(X+W,Y+H-5); //C 
     ctx.arcTo(new RectF(X+W,Y+H,X+W-5,Y+H),90,180); //C arc 

     ctx.lineTo(X+W/2 +6,Y+H); 
     ctx.lineTo(X+W/2,Y+H+8); 
     ctx.lineTo(X+W/2-6,Y+H); 
     ctx.lineTo(X+5,Y+H); 
     ctx.arcTo(new RectF(X,Y+H,X,Y+H-5),180,270); 

     ctx.lineTo(X,Y+5); 
     ctx.arcTo(new RectF(X,Y,X+5,Y),270,0); 
     Paint p = new Paint(); 
     p.setColor(0xffff00ff); 

     canvas.drawPath(ctx, p); 

बहुत आभारी।

उत्तर

25

अजीब कोई नहीं में पहुंचाया कि एक जवाब के साथ, एक बार मुझे यह मिला (यह खोजना आसान नहीं था) यह वास्तव में सीधे आगे था।

तो, जिस तरह से यह काम करता है यह है: मान लिया जाये कि आप 12 में एक गोल कोने आकर्षित करने के लिए चाहते हैं - 3 (घड़ी संदर्भ का उपयोग करते हुए): आप अपने पथ शुरू करने और जब आप चाप लाइन की जरूरत है आप एक आयत जिसका परिभाषित ऊपरी बाएं कोने वह स्थान है जहां आपकी लाइन वर्तमान में समाप्त हो गई है और जिसका निचला दायां कोने वह स्थान है जहां आप चाप को जाना चाहते हैं, इसलिए यदि आप एक वर्ग की कल्पना करते हैं जिसका एक्स, वाई 12 (घड़ी पर) है और जिसका एक्स + डब्ल्यू, वाई + एच 3 है जो आपको आवश्यक वर्ग है।

अब, कल्पना करें कि उस वर्ग में अंडाकार है (इस उदाहरण में यह एक गोलाकार अंडाकार है, यदि आप अपने वक्र को अधिक अंडाकार-आश होना चाहते हैं, तो अपने वर्ग को आयताकार के रूप में परिभाषित करें), आप कोई टुकड़ा ले सकते हैं विधि के अंतिम दो पैरा का उपयोग कर उस सर्कल का। पहला पैरा उस कोण को परिभाषित करता है जहां आप काटना शुरू करना चाहते हैं। यदि हम एक कंपास का उपयोग कर रहे हैं, तो 0 डिग्री पूर्व है (सुनिश्चित नहीं है कि, मैं ज्यामिति विशेषज्ञ क्यों नहीं हूं ... क्या यह सामान्य है? मैं हमेशा 0 होने का विचार करता हूं, लेकिन मेरे पास देखे जाने वाले सभी प्रोग्रामिंग ज्यामिति उदाहरणों में 0 है पूर्व, शायद कोई टिप्पणी करेगा कि यह क्यों है)।

दूसरा पैराम परिभाषित करता है कि आप कितना सर्कल चाहते हैं। यदि आप पूरे सर्कल को 360 डालते हैं तो आप 180 डालते हैं।

तो, हमारे मामले में हम 12 से 3 तक कोने को गोल करना चाहते हैं, इसलिए हमने 270 को अपनी शुरुआती डिग्री और पकड़ लिया सर्कल के 90 डिग्री।

आखिरकार, जब आप इस प्रक्रिया के साथ काम करते हैं, तो लाइन अब खुद को 3 बजे होने के बारे में सोचती है ताकि आप वहां से लाइन (आईएनजी) जारी रख सकें। तो ... यहां मेरे आकार के लिए मेरा निश्चित कोड है (इसमें थोड़ा त्रिकोण है, लेकिन यह न तो यहां और न ही वहां है, वास्तविक गोलाकार भाग बी-सी, डी-ई, आई-जे, और के-ए हैं। बाकी सभी सीधी रेखाएं हैं।

int arc = 25; 
    public Cursor(int X, int Y, int W, int H){ 
     /* 
     * A   B 
     * K    C 
     * J    D 
     * I H F E 
        G 
     */ 
     int Ax = X+ arc; 
     int Ay = Y; 
     int Bx = X + W - arc; 
     int By = Y; 
     int Cx = X + W; 
     int Cy = Y + arc; 
     int Dx = Cx; 
     int Dy = (Y + arc) + (H - arc*2); 
     int Ex = Bx; 
     int Ey = Y + H; 
     int Fx = X+W/2 +6; 
     int Fy = Ey; 
     int Gx = X+W/2; 
     int Gy = Y+H+8; 
     int Hx = X+W/2-6; 
     int Hy = Ey; 
     int Ix = Ax; 
     int Iy = Hy; 
     int Jx = X; 
     int Jy = Dy; 
     int Kx = X; 
     int Ky = Cy; 


     Path ctx = new Path(); 
     ctx.moveTo(Ax,Ay); //A 
     ctx.lineTo(Bx,By);//B 
     ctx.arcTo(new RectF(Bx, By, Cx, Cy), 270, 90); //B-C arc 

     ctx.lineTo(Dx,Dy); //D 
     ctx.arcTo(new RectF(Dx - arc, Dy, Ex + arc, Ey),0,90); //D-E arc 

     ctx.lineTo(Fx, Fy); //E-F 
     ctx.lineTo(Gx, Gy); //F-G 
     ctx.lineTo(Hx, Hy); //G-H 
     ctx.lineTo(Ix, Iy); //H - I 
     ctx.arcTo(new RectF(Jx, Jy, Ix, Iy),90,90);// I = J arc 

     ctx.lineTo(Kx, Ky); //K 
     ctx.arcTo(new RectF(Ax - arc, Ay, Kx + arc, Ky),180,90); //K - A arc 
     ctx.lineTo(Ax, Ay); //K 



     Paint p = new Paint(); 
     p.setAntiAlias(true); 
     p.setColor(0xffffffff); 
     p.setStyle(Style.FILL); 
     canvas.drawPath(ctx, p);  
     p.setColor(0xff000000); 
     p.setStyle(Style.STROKE); 
     p.setStrokeWidth(3);    
     canvas.drawPath(ctx, p); 



    } 
+0

अरे, मुझे पथ में आर्क बनाने के दौरान समस्या हो रही है, मैंने आपकी सिफारिशों का पालन करने की कोशिश की लेकिन मुझे यह नहीं मिला .. क्या आप मुझसे पूछे गए प्रश्न देख सकते हैं? वहां मेरी समस्या विस्तृत है इसलिए आपके लिए समझना बेहतर है। http://stackoverflow.com/questions/17449339/how-to-define-te-startangle-and-sweepangle-for-arcto-method-android धन्यवाद! :) –

+1

कल्पना करें कि आपकी चाप एक आयताकार से घिरा हुआ है (और उस आयताकार के अंदर के चारों तरफ फैला हुआ है, भले ही आप जो हिस्सा दिखाएंगे वह दिखाया जाएगा)। पहला पैरामीटर आपके अंडाकार के अंदर की डिग्री है जहां बिंदु शुरू हो जाएगा, और दूसरा वह डिग्री है जो आप पूर्ण अंडाकार को पकड़ने के लिए चाहते हैं जो कि आपकी चाप है। –

+0

धन्यवाद! मैंने सोचा कि मैं क्या गलत कर रहा था। मैं sweepAngle पैरामीटर के लिए अंतिम डिग्री मान पास कर रहा था। मुझे शुरू करना था कि मैं शुरूआती पैरामीटर पर विचार करने के लिए कितनी डिग्री लेना चाहता हूं, और अंतिम एंगल –

0

यहां कुछ नमूना कोड (मेरी वर्गों में से एक से में इकट्ठा) एक भरा है, गोल कोने आयत बनाने के लिए और फिर एक stroked आयत जोड़ने यह एक सीमा देने के लिए है:

//Initializing some stuff 
_paint = new Paint(); 
_rect = new RectF(); 
_radius = 10; 
_bgColor = 0xFFFFFFFF; 
_borderColor = 0xFFCCCCCC; 

//Doing dimension calculations 
_rect.left = 0; 
_rect.top = 0; 
_rect.right = this.getWidth() - 1; 
_rect.bottom = this.getHeight() - 1; 

//painting 
//draw the background 
_paint.setColor(_bgColor); 
_paint.setStyle(Style.FILL_AND_STROKE); 
canvas.drawRoundRect(_rect, _radius, _radius, _paint); 

//draw the border 
_paint.setStrokeWidth(1); 
_paint.setColor(_borderColor); 
_paint.setStyle(Style.STROKE); 
canvas.drawRoundRect(_rect, _radius, _radius, _paint); 
+0

मैं इसकी सराहना करता हूं, लेकिन यह वह नहीं है जो मैं कर रहा हूं ... मैं arcto metho को समझना चाहता हूँ घ। मेरा आकार सख्ती से आयताकार नहीं बोल रहा है, इसके नीचे एक छोटा सा तीर है। –

2

इस उदाहरण के लिए धन्यवाद, यह पैरामीटर को समझने के लिए बहुत स्पष्ट बनाता है। जो मैंने एंड्रॉइड के देव दस्तावेज़ों में पढ़ा है, उससे आप शायद "लाइन टू()" कॉल (एफ, जी, एच को इंगित करने के अलावा) को छोड़ सकते हैं, क्योंकि आर्क स्वचालित रूप से एक पंक्ति जोड़ता है जब आर्क का पहला बिंदु आखिरी बिंदु तैयार नहीं है ...

क्यों 0 पूर्व के लिए शुरू होता है, इसलिए गणित और त्रिकोणमिति पाठों के कारण ऐसा लगता है कि 0 डिग्री चिह्न वह बिंदु है जहां त्रिकोणमितीय चक्र (केंद्र 0,0 के साथ सर्कल और त्रिज्या 1) एक्स-अक्ष के साथ छेड़छाड़ करता है, जो पूर्व है (ये वही सबक आम तौर पर कोणों को विपरीत दिशा में गिनते हैं, इसलिए 9 0 डिग्री उत्तर बन जाता है और 270 दक्षिण होता है, जबकि एंड्रॉइड पर ऐसा लगता है कि कोण घड़ी की दिशा में गिना जाता है)

+0

उस अतिरिक्त जानकारी के लिए धन्यवाद! –

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