2011-08-29 23 views
7

मैं उपयोगकर्ता से एकत्रित अंकों के एक सेट के बाद एक CGContext में पथ खींच रहा हूं। ऐसा लगता है कि कुछ यादृच्छिक इनपुट जिटर हैं जो कुछ लाइन किनारों को झटकेदार लगते हैं। मुझे लगता है कि थोड़ा सा पंख इस समस्या को हल करेगा। अगर मैं ओपनजीएल ईएस का उपयोग कर रहा था तो मैं बस उस पंख को पंख लगाऊंगा जिसमें मैं पथ का पीछा कर रहा हूं; हालांकि, इस परियोजना के लिए मुझे क्वार्ट्ज/कोरग्राफिक्स में रहने की आवश्यकता है और मुझे ऐसा ही समाधान नहीं मिल रहा है।आईओएस क्वार्ट्ज/कोरग्राफिक्स पंख वाले स्ट्रोक ड्राइंग

मैंने प्रत्येक पंक्ति के साथ 5 लाइनों को थोड़ा बड़ा और पंख का अनुमान लगाने के लिए अधिक पारदर्शी बनाने की कोशिश की है। यह एक खराब परिणाम पैदा करता है और प्रदर्शन को धीमा कर देता है।

CGContextMoveToPoint(UIGraphicsGetCurrentContext(),((int)lastPostionDrawing1.x), (((int)lastPostionDrawing1.y))); 
CGContextAddCurveToPoint(UIGraphicsGetCurrentContext(), ctrl1_x, ctrl1_y, ctrl2_x, ctrl2_y, lastPostionDrawing2.x, lastPostionDrawing2.y; 
[currentPath addCurveToPoint:CGPointMake(lastPostionDrawing2.x-((int)furthestLeft.x)+((int)penSize), lastPostionDrawing2.y controlPoint1:CGPointMake(ctrl1_x, ctrl1_y) controlPoint2:CGPointMake(ctrl2_x, ctrl2_y)]; 
+0

क्या आपने CGContextSetShouldAntialias फ़ंक्शन का प्रयास किया है? – Davyd

+0

मुझे अतीत में क्वाड वक्र या वक्र का उपयोग 2 नियंत्रण बिंदुओं के साथ समान समस्याएं थीं। यदि आप मुझे आकर्षित करना चाहते हैं या कम से कम पंख की कुछ और जानकारी खींचने की कोशिश कर रहे हैं, तो मैं शायद आपको मदद कर सकता हूं। – GianPac

उत्तर

2

मैं आगे जाना है और मान लीजिए आपका CGContext अभी भी है कि विरोधी aliasing चालू, लेकिन यदि नहीं, तो वह स्पष्ट पहले की कोशिश करने लगता है करने के लिए जा रहा हूँ:

यह रेखा खींचने कोड है , जैसा कि @ डेविड की टिप्पणी से पता चलता है: CGContextSetShouldAntialias ब्याज का कार्य है।

मान लीजिए कि यह समस्या नहीं है, और रेखा संदर्भ द्वारा एंटी-एलाइज्ड हो रही है, लेकिन आप अभी भी कुछ नरम चाहते हैं। मैं ऐसा करने के कुछ तरीकों के बारे में सोच सकता हूं जो उम्मीद करनी चाहिए कि 5 बार स्ट्रोकिंग से तेज होना चाहिए।

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

एक और शायद कम स्पष्ट विकल्प , इस उद्देश्य के लिए सीजी के छाया चित्र का दुरुपयोग करना हो सकता है। समारोह आप को देखने के लिए चाहते हैं: CGContextSetShadowWithColor यहाँ विधि है:

  • सहेजें GState: CGContextSaveGState
  • , मूल पथ
  • कॉपी पथ के सीमांकन बॉक्स जाओ 2.0 से ही इसे दूर का अनुवाद * CGPathCreateCopyByTransformingPath का उपयोग कर bbox.width (ध्यान दें: केवल एक्स दिशा का उपयोग, इस तरह आप संदर्भ में flips बारे में चिंता करने की जरूरत नहीं है)
  • मूल bbox का उपयोग कर CGContextClipToRect
  • पर एक छाया सेट करने के लिए संदर्भ क्लिप संदर्भ वाईआई वें CGContextSetShadowWithColor:
    • कुछ न्यूनतम धुंध (0.5 से शुरू करें और वहां से जाएं। धुंध पैरामीटर गैर-रैखिक है, और आईएमई यह एक अनुमान और जांच ऑपरेशन है)
    • बेस ऑफ स्पेस के लिए -2.0 * बॉक्स चौड़ाई और 0.0 ऊंचाई के बराबर एक ऑफसेट। (ध्यान दें: ये ऑफसेट बेस स्पेस में हैं। यह पता लगाने में गड़बड़ी होगी, लेकिन यह मानते हुए कि आप अपना खुद का स्केल ट्रांसफॉर्म नहीं जोड़ रहे हैं, स्केल फैक्टर या तो 1.0 या 2.0 होगा, इसलिए व्यावहारिक रूप से, आप एक सेट करेंगे ऑफसेट.विड्थ या तो -2.0 * bbox.width या -4.0 * bbox.width)
    • आपके चयन का एक रंग।
  • अनुवादित दूर पथ को स्ट्रोक करें।
  • GState CGContextRestoreGState

पॉप इस के साथ "सिर्फ" छाया है, जो आपको उम्मीद है कि परिणाम आप चाहते प्राप्त करने के लिए परिवर्तित कर सकते हैं आप छोड़ देना चाहिए।

सभी ने कहा कि, सीजी का छाया चित्र प्रदर्शन, आईएमई, पूरी तरह से भयानक से कम है, और पूरी तरह से निर्धारिती से कम है। मैं उम्मीद करता हूं कि यह 5 अलग-अलग स्ट्रोक के साथ पथ को 5 बार पथभ्रष्ट करने से तेज होगा, लेकिन भारी नहीं।

यह इस बात को कम कर देगा कि इस प्रभाव को आपके लिए कितना मूल्यवान है।