2013-12-10 11 views
11

मैं पाई के प्रत्येक टुकड़े के लिए एक कैशपलेयर का उपयोग करके एक पाई चार्ट खींच रहा हूं। यहां तक ​​कि जब एक पाई टुकड़ा का अंत कोण आसन्न टुकड़े के प्रारंभ कोण के बराबर होता है, तब भी एंटीअलाइजिंग के परिणामस्वरूप प्रत्येक पासा टुकड़ा के बीच अंतर्निहित पृष्ठभूमि रंग होता है यदि स्लाइस के बीच की सीमा कोण पर होती है।निकट कैशपलेयर एंटीअलाइजिंग अंक

http://i.stack.imgur.com/Qdu8d.png

मैं जबकि अभी भी एंटीलायज़िंग़ का उपयोग कर तो जिसके परिणामस्वरूप पाई गाड़ी अभी भी चिकनी लग रहा है स्लाइस के बीच मामूली अंतर को खत्म करना चाहते हैं। संकल्पनात्मक रूप से, ऐसा लगता है कि पूरे कैलियर पर एंटीअलाइजिंग लागू करने का कोई तरीका था और यह पाई स्लाइस सब्लेयर के बाद सभी पाई स्लाइस खींचे जाने के बाद, यह चाल चलती थी ... पाई स्लाइस एक दूसरे में एंटीअलाइज किया जाएगा पृष्ठभूमि।

मैंने कई कैलियर गुणों के साथ खेला है क्योंकि मैं सोच सकता हूं और इस पर अधिक जानकारी खोजने में कठिनाई हो रही है। कोई विचार?

अद्यतन: नीचे मेरा उत्तर देखें।

उत्तर

5

अद्यतन: रोब का जवाब बहुत अच्छा है, लेकिन संभवत: अन्य एंटीलायज़िंग़ मुद्दों में परिणाम है। मैंने प्रत्येक पाई स्लाइस के अंत कोण के साथ 1pt चौड़ी रेडियल लाइनों को चित्रित करके अंतराल को 'भरना' समाप्त कर दिया, प्रत्येक पंक्ति आसन्न टुकड़े के समान रंग है। ये रेखाएं पाई स्लाइस की तुलना में निचले जेड इंडेक्स पर खींची जाती हैं, इसलिए वे नीचे हैं। यहां बताया गया है कि वे ऊपर बनाए पाई स्लाइस के बिना की तरह लग रही है:

The filler lines with no slices drawn.

और यहाँ अंतिम उत्पाद है:

Final result with lines underneath and slices on top.

8

शायद आप अपने पाई स्लाइस किनारों को बिल्कुल कोई दरार के साथ पूरा करने में सक्षम नहीं होने जा रहे हैं। सबसे आसान समाधान कोशिश नहीं है।

अपने पाई स्लाइस किनारों पर मिलने के बजाय, उन्हें ओवरलैप करें। एक पूर्ण डिस्क के रूप में पहला टुकड़ा ड्रा:

first slice

फिर, एक पूर्ण डिस्क के रूप में दूसरा टुकड़ा आकर्षित पहला टुकड़ा के समुचित क्षेत्र को छोड़कर:

second slice

फिर आकर्षित तीसरा टुकड़ा एक पूर्ण डिस्क के रूप में, पहले दो स्लाइस के समुचित क्षेत्र को छोड़कर:

third slice

और इसी तरह:

fourth slicefifth slice

यहाँ मेरी कोड है:

#import "PieView.h" 

@implementation PieView { 
    NSMutableArray *slices; 
} 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
    } 
    return self; 
} 

- (void)layoutSubviews { 
    [super layoutSubviews]; 
    [self layoutSliceLayers]; 
} 

- (void)layoutSliceLayers { 
    if (slices == nil) { 
     [self createSlices]; 
    } 
    [slices enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
     [self layoutSliceLayer:obj index:idx]; 
    }]; 
} 

static const int kSliceCount = 5; 

- (void)createSlices { 
    slices = [NSMutableArray arrayWithCapacity:kSliceCount]; 
    for (int i = 0; i < kSliceCount; ++i) { 
     [slices addObject:[self newSliceLayerForIndex:i]]; 
    } 
} 

- (CAShapeLayer *)newSliceLayerForIndex:(int)i { 
    CAShapeLayer *layer = [CAShapeLayer layer]; 
    layer.fillColor = [UIColor colorWithWhite:(CGFloat)i/kSliceCount alpha:1].CGColor; 
    [self.layer addSublayer:layer]; 
    return layer; 
} 

- (void)layoutSliceLayer:(CAShapeLayer *)layer index:(int)index { 
    layer.position = [self center]; 
    layer.path = [self pathForSliceIndex:index].CGPath; 
} 

- (CGPoint)center { 
    CGRect bounds = self.bounds; 
    return CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds)); 
} 

- (UIBezierPath *)pathForSliceIndex:(int)i { 
    CGFloat radius = [self radius]; 
    CGFloat fudgeRadians = 5/radius; 
    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointZero 
     radius:radius startAngle:2 * M_PI * i/kSliceCount 
     endAngle:2 * M_PI clockwise:YES]; 
    [path addLineToPoint:CGPointZero]; 
    [path closePath]; 
    return path; 
} 

- (CGFloat)radius { 
    CGSize size = self.bounds.size; 
    return 0.9 * MIN(size.width, size.height)/2; 
} 

@end 
+0

धन्यवाद प्रतिक्रिया, रोब के लिए एक बहुत। मैंने इस समाधान को एक बिंदु पर आजमाया और अंधेरे, अंतर्निहित परतों से पृष्ठभूमि में एंटीअलाइज्ड होने से एंटीअलाइजिंग कलाकृतियों को देख रहा था। यह पाई चार्ट के चारों ओर एक सूक्ष्म अंधेरे किनारे के रूप में दिखाई दिया जो हल्का रंगीन स्लाइस के बाहरी किनारे पर विशेष रूप से ध्यान देने योग्य था। मैंने वर्णित रेडियल फिलर समाधान अच्छी तरह से काम करने लगता है। – Aaron

+0

@Aaron जब आप एंटी-उपनाम करते हैं, तो आप ठोस रंग के प्रभावी ढंग से अलियाकृत आकार के आस-पास रंग + अल्फा पिक्सेल की अंगूठी के साथ समाप्त होते हैं। एक ही रूपरेखा के साथ कई आकारों के लिए ऐसा करने से, आपका प्रभावी-अलियाकृत आंतरिक क्षेत्र ठीक दिखाई देगा लेकिन आपके एंटी-एलाइज्ड जोन में रंग (एन) + अल्फा ओवरलेइंग रंग (एन -1) + अल्फा ओवरलेइंग होगा ... रंग (0) + अल्फा। यह आपके द्वारा देखे जाने वाले प्रभाव को बताता है। –

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