2010-03-21 6 views
5

यह विषय एक या दो बार खरोंच कर दिया गया है, लेकिन मैं अभी भी परेशान हूं। और Google या तो दोस्ताना नहीं था।एक उपयोगकर्ता को क्वार्ट्ज 2 डी समन्वय प्रणाली कैसे सेट करें जो स्कैलिंग के साथ अस्पष्ट ड्राइंग से बचाती है?

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

तो मूल रूप से, उदाहरण के लिए, मैं दृश्य को स्केल करना चाहता हूं ताकि जब मैं 10x10 आयत खींचूं (उदाहरण के लिए 10-इंच बॉक्स सोचें), तो मुझे 60x60 पिक्सेल आयत मिलता है।

यह काम करता है, आयत को छोड़कर मुझे काफी अस्पष्ट लगता है। यहां एक और सवाल का जवाब मिला जो बताता है कि क्यों। हालांकि, मुझे यकीन नहीं है कि मैं उस कारण को समझ गया क्यों, और इसके अलावा, मुझे नहीं पता कि इसे कैसे ठीक किया जाए।

मैं अपने awakeFromNib कस्टम दृश्य विधि में मेरी समन्वय प्रणाली सेट:

- (void)drawRect:(CGRect)rect { 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGRect r = CGRectMake(10., 10., 10., 10.); 
    CGFloat lineWidth = 1.0; 
    CGContextStrokeRectWithWidth(context, r, lineWidth); 
} 

वर्ग मैं ठीक माप लिया जाता है:

- (void) awakeFromNib { 
    CGAffineTransform scale = CGAffineTransformMakeScale(6.0, 6.0); 
    self.transform = scale; 
} 

और यहाँ मेरी ड्रा दिनचर्या है यहाँ मेरी कोड है , लेकिन पूरी तरह से अस्पष्ट। lineWidth के साथ खेलना मदद नहीं करता है: जब lineWidth छोटा सेट होता है, तो यह हल्का हो जाता है, लेकिन कुरकुरा नहीं होता है।

तो क्या स्केल किए गए समन्वय प्रणाली के लिए एक दृश्य स्थापित करने का कोई तरीका है, ताकि मैं अपने डोमेन निर्देशांक का उपयोग कर सकूं? या क्या मुझे वापस जाना चाहिए और मेरे ड्राइंग दिनचर्या में स्केलिंग लागू करना चाहिए?

ध्यान दें कि यह समस्या अनुवाद या रोटेशन के लिए नहीं होती है।

धन्यवाद

उत्तर

2

ठीक है, जैसा कि अक्सर, समझा मुद्दा मुझे एक समाधान के लिए सीसा।

समस्या यह है कि दृश्य परिवर्तन संपत्ति को थोड़ा बफर में खींचा जाने के बाद इसे लागू किया जाता है। स्केलिंग ट्रांसफॉर्म ड्राइंग से पहले लागू किया जाना चाहिए, यानी। drawRect विधि में। तो खरोंच awakeFromNib मैं दे दी है, और यहाँ एक सही drawRect है:

- (void)drawRect:(CGRect)rect { 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGAffineTransform scale = CGAffineTransformMakeScale(6.0, 6.0); 
    CGContextConcatCTM(context, scale); 
    CGRect r = CGRectMake(10., 10., 10., 10.); 
    CGFloat lineWidth = 0.1; 
    CGContextStrokeRectWithWidth(context, r, lineWidth); 
} 
+1

यदि आप स्केल फैक्टर के बावजूद बिंदुओं में रेखा चौड़ाई सेट करना चाहते हैं, तो इसे 'अंक/स्केल फैक्टर की वांछित संख्या' पर सेट करें। उदाहरण: डिफ़ॉल्ट 1 pt/1 × = 1 है; आपके 6 × कारक पर 1-पीटी लाइन '1.0/6.0' है; एक 2-पीटी लाइन '2.0/6.0' होगी। –

10

[stroked] आयत मैं काफी अस्पष्ट है।

आमतौर पर, यह है, क्योंकि आप पूरे नंबर समन्वय पर आयत साजिश रची और अपने लाइन चौड़ाई 1.

पोस्टस्क्रिप्ट में है (और इस प्रकार उसके वंश में: AppKit, पीडीएफ, और क्वार्ट्ज), ड्राइंग इकाइयों को अंक के लिए डिफ़ॉल्ट, 1 बिंदु बिल्कुल 1/72 इंच होना। मैक और आईफोन वर्तमान में * स्क्रीन के वास्तविक रिज़ॉल्यूशन के बावजूद, इस तरह के प्रत्येक बिंदु को 1 पिक्सेल के रूप में मानते हैं, इसलिए व्यावहारिक अर्थ में, अंक (डिफ़ॉल्ट रूप से, मैक और आईफोन पर) पिक्सल के बराबर होते हैं।

पोस्टस्क्रिप्ट और इसके वंशजों में, अभिन्न समन्वय बिंदुओं के बीच चलते हैं। 0, 0, उदाहरण के लिए, निचले बाएं बिंदु के निचले बाएं कोने हैं। 1, 0 उसी बिंदु के निचले-दाएं कोने (और दाईं ओर दाईं ओर के निचले बाएं कोने) है।

एक स्ट्रोक पथ पर केंद्रित है जिस पर आप पथपाकर हैं। इस प्रकार, आधे रास्ते के अंदर, आधा बाहर होगा।

मैक की (अवधारणात्मक रूप से) 72-डीपीआई दुनिया में, इन दो तथ्यों में समस्या उत्पन्न करने के लिए गठबंधन किया गया है। यदि 1 pt 1 पिक्सेल के बराबर है, और आप दो पिक्सेल के बीच 1-pt स्ट्रोक लागू करते हैं, तो स्ट्रोक का आधा उन पिक्सेल में से प्रत्येक को हिट करेगा।

कम से कम क्वार्ट्ज, वर्तमान रंग को रंगीन अल्फा के आधे हिस्से में दोनों पिक्सेल में चित्रित करके प्रस्तुत करेगा। यह संकल्पनात्मक स्ट्रोक द्वारा कितना पिक्सेल कवर किया जाता है यह निर्धारित करता है; यदि आपने 1.5-पीटी रेखा चौड़ाई का उपयोग किया है, तो इसका आधा 0.75 pt है, जो प्रत्येक 1-पीटी पिक्सेल के तीन-चौथाई है, इसलिए रंग 0.75 अल्फा पर प्रस्तुत किया जाएगा। यह, निश्चित रूप से, प्राकृतिक निष्कर्ष पर जाता है: यदि आप 2-पीटी रेखा चौड़ाई का उपयोग करते हैं, तो प्रत्येक पिक्सेल पूरी तरह से ढंका हुआ है, इसलिए अल्फा 1 होगा। यही कारण है कि आप इस प्रभाव को 1-pt स्ट्रोक के साथ देख सकते हैं, न कि 2-पीटी स्ट्रोक।

  • आधा बिंदु अनुवाद:

    कई संभावित हल कर रहे हैं वास्तव में क्या यह बॉक्स पर कहते हैं, आप अनुवाद करने और सही आधा अंक से, के लिए मुआवजा ऊपर उल्लिखित 1-pt-कट में आधा विभाजन

    यह साधारण मामलों में काम करता है, लेकिन जब आप पूरे-बिंदु अनुवाद को छोड़कर किसी भी अन्य समन्वय परिवर्तन को शामिल करते हैं तो बाहर निकलता है। यही कहना है, आप 30, 20 तक अनुवाद कर सकते हैं और यह अभी भी काम करेगा, लेकिन यदि आप 33 + 1/3, 25.252525 ... द्वारा अनुवाद करते हैं, या यदि आप स्केल या घुमाते हैं, तो आपका आधा-बिंदु अनुवाद बेकार होगा ।

  • आंतरिक स्ट्रोक: पहले क्लिप करें, फिर रेखा चौड़ाई को दोगुना करें (क्योंकि आप केवल इसके आधे हिस्से को आकर्षित करने जा रहे हैं), फिर स्ट्रोक करें।

    यदि आपके पास अन्य ड्राइंग करने के लिए बहुत सारे ड्राइंग हैं, तो आपको gstate juggling की आवश्यकता हो सकती है, क्योंकि आप नहीं चाहते कि क्लिपिंग पथ आपके अन्य ड्राइंग को प्रभावित करे।

  • बाहरी स्ट्रोक: अनिवार्य रूप से एक आंतरिक स्ट्रोक के समान ही, सिवाय इसके कि आप क्लिपिंग से पहले पथ को उलट दें।

    यदि आप सुनिश्चित हैं कि पथ जो आप स्ट्रोक करना चाहते हैं, वे आंतरिक स्ट्रोक की तुलना में बेहतर (कम gstate juggling) हो सकते हैं यदि आप पथ को स्ट्रोक करना चाहते हैं तो ओवरलैप नहीं होगा। दूसरी ओर, यदि आप पथ को भरना भी चाहते हैं, तो गैस्टेट जॉगलिंग रिटर्न।

* यह हमेशा के लिए नहीं रहेगा। ऐप्पल कुछ समय के लिए संकेत छोड़ रहा है कि वे कम से कम मैक के ड्राइंग रिज़ॉल्यूशन को किसी बिंदु पर बदलने जा रहे हैं। इस तरह के बदलाव के लिए एपीआई नींव अब सब कुछ काफी है; यह ऐप्पल स्विच फेंकने की बात है।

+0

सब बहुत सच है, सिवाय इसके कि मुझे अनुभव की अस्पष्टता का कारण नहीं है। इस तथ्य के कारण अस्पष्टता 'UIView.transform' को पोस्ट-ब्लिटिंग चरण के रूप में देखने के लिए लागू होती है। तो यहां यह 'drawRect' द्वारा खींचे गए छोटे मानचित्र को स्केल कर रहा है। बस 'drawRect' की शुरुआत * में * ट्रांसफॉर्म लागू करके इसे ठीक करता है। यह स्केलिंग के लिए 'UIView.transform' बेकार बनाता है। बेशक, मैं अभी भी देखता हूं कि आप क्या वर्णन करते हैं - पिक्सेल स्ट्रैडलिंग। 1 पिक्सेल लंबवत और क्षैतिज स्ट्रोक पर दृश्य इंप्रेशन अस्पष्टता के बजाए काले रंग के बजाय ग्रे के रूप में दिखाई देना है। –

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