2011-02-07 9 views
7

ढाल-भरने या स्ट्रोक के साथ आकर्षित करने के तरीके के बारे में वेब पर कहीं और संसाधन हैं।कोर ग्राफिक्स: सामान्य ढाल वाले पथ के साथ चित्रण

हालांकि, AFAICT, कोई भी संबोधित करता है निम्नलिखित की आवश्यकता: कैसे एक सामान्य ढाल, जिससे सामान्य पथ के लिए ओर्थोगोनल का मतलब है के साथ एक पथ आकर्षित करने के लिए। अंधेरे-> प्रकाश-> अंधेरे रैखिक ढाल के साथ लागू होने पर शुद्ध प्रभाव टूथपेस्ट या ट्यूब की तरह कुछ हो सकता है।

round-rect tube http://muys.net/cadre_blanc.png

(इस हाथ से तैयार था और कोनों बहुत अच्छा नहीं कर रहे हैं): यहाँ एक गोल आयत के मामले में यह विचार है।

राउंड रेक्ट के विशिष्ट मामले में, मुझे लगता है कि मैं इस प्रभाव को 4 रैखिक ग्रेडियेंट्स (पक्षों) और 4 रेडियल ग्रेडियेंट्स (कोनों) के साथ प्राप्त कर सकता हूं। लेकिन क्या बेहतर है?

क्या किसी भी पथ के लिए कोई आसान समाधान है?

उत्तर

6

एकमात्र "आसान" समाधान मैं सोच सकता हूं कि पथ को कई बार स्ट्रोक करना होगा, स्ट्रोक चौड़ाई को कम करना होगा और प्रत्येक ढाल को अनुकरण करने के लिए रंग को हर बार बदलना होगा।

जाहिर है, यह जटिल पथों के लिए एक महंगा संचालन हो सकता है ताकि आप संभव होने पर परिणाम कैश करना चाहें।

#define RKRandom(x) (arc4random() % ((NSUInteger)(x) + 1)) 

@implementation StrokeView 

- (void)drawRect:(NSRect)rect 
{ 
    NSRect bounds = self.bounds; 

    //first draw using Core Graphics calls 
    CGContextRef c = [[NSGraphicsContext currentContext] graphicsPort]; 

    CGMutablePathRef path = CGPathCreateMutable(); 

    CGPathMoveToPoint(path, NULL, NSMidX(bounds), NSMidY(bounds)); 
    CGContextSetMiterLimit(c,90.0); 
    CGContextSetLineJoin(c, kCGLineJoinRound); 
    CGContextSetLineCap(c, kCGLineCapRound); 

    for(NSUInteger f = 0; f < 20; f++) 
    { 
     CGPathAddCurveToPoint(
           path, 
           NULL, 
           (CGFloat)RKRandom((NSInteger)NSWidth(bounds)) + NSMinX(bounds), 
           (CGFloat)RKRandom((NSInteger)NSHeight(bounds)) + NSMinY(bounds), 
           (CGFloat)RKRandom((NSInteger)NSWidth(bounds)) + NSMinX(bounds), 
           (CGFloat)RKRandom((NSInteger)NSHeight(bounds)) + NSMinY(bounds), 
           (CGFloat)RKRandom((NSInteger)NSWidth(bounds)) + NSMinX(bounds), 
           (CGFloat)RKRandom((NSInteger)NSHeight(bounds)) + NSMinY(bounds) 
          ); 
    } 

    for(NSInteger i = 0; i < 8; i+=2) 
    { 
     CGContextSetLineWidth(c, 8.0 - (CGFloat)i); 
     CGFloat tint = (CGFloat)i * 0.15; 

     CGContextSetRGBStrokeColor (
            c, 
            1.0, 
            tint, 
            tint, 
            1.0 
            ); 
     CGContextAddPath(c, path); 
     CGContextStrokePath(c); 
    } 

    CGPathRelease(path); 

    //now draw using Cocoa drawing 
    NSBezierPath* cocoaPath = [NSBezierPath bezierPathWithRoundedRect:NSInsetRect(self.bounds, 20.0, 20.0) xRadius:10.0 yRadius:10.0]; 
    for(NSInteger i = 0; i < 8; i+=2) 
    { 
     [cocoaPath setLineWidth:8.0 - (CGFloat)i]; 
     CGFloat tint = (CGFloat)i * 0.15; 
     NSColor* color = [NSColor colorWithCalibratedRed:tint green:tint blue:1.0 alpha:1.0]; 
     [color set]; 
     [cocoaPath stroke]; 
    } 
} 

@end 

sample output

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