2011-08-04 17 views
7

मेरा प्रश्न है कि मुक्तहस्त प्रतीत लाइनों ड्राइंग के लिए विभिन्न तकनीकों शामिल है:एक फ्रीहैंड-दिखने वाले अंडाकार या सर्कल को कैसे आकर्षित करें?

How do you draw like a Crayon?

विशेष रूप से स्टीव Hanov इस उत्कृष्ट blog entry तैनात।

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

अब तक सबसे अच्छा मैं इस के साथ आ गए हैं:

- (UIBezierPath*) freehandEllipseFromRect:(CGRect) rect { 

    // freehand ellipses need a lil more height 
    rect = CGRectMake(rect.origin.x, rect.origin.y-5, rect.size.width, rect.size.height+10); 

    UIBezierPath* path = [UIBezierPath bezierPath]; 


    CGPoint topMidPoint = CGPointMake(rect.origin.x + (rect.size.width/2), rect.origin.y); 
    CGPoint bottomMidPoint = CGPointMake(rect.origin.x + (rect.size.width/2), rect.origin.y+rect.size.height); 


    // random point along bottom quarter of height, cause makes it look better 
    CGFloat randomY = (((CGFloat) (arc4random() % RAND_MAX)/RAND_MAX)) * (rect.size.height/4); 
    CGPoint leftControlPoint = CGPointMake(rect.origin.x-(rect.size.width), rect.origin.y+(rect.size.height-randomY)); 


    // another random y; 
    randomY = (((CGFloat) (arc4random() % RAND_MAX)/RAND_MAX)) * (rect.size.height/4); 
    CGPoint rightControlPoint = CGPointMake(rect.origin.x+(rect.size.width*2), rect.origin.y+(rect.size.height-randomY)); 

    CGFloat overshootValueX = (((CGFloat) (arc4random() % RAND_MAX)/RAND_MAX)) * 4; 
    CGFloat overshootValueY = (((CGFloat) (arc4random() % RAND_MAX)/RAND_MAX)) * 6; 
    [path moveToPoint:CGPointMake(topMidPoint.x+overshootValueX, topMidPoint.y)];   
    [path addQuadCurveToPoint:bottomMidPoint controlPoint:leftControlPoint]; 

    // random value to overshoot 
    overshootValueX = (((CGFloat) (arc4random() % RAND_MAX)/RAND_MAX)) * 20; 
    overshootValueY = (((CGFloat) (arc4random() % RAND_MAX)/RAND_MAX)) * 4; 
    [path addQuadCurveToPoint:CGPointMake(topMidPoint.x-overshootValueX, topMidPoint.y-overshootValueY) controlPoint:rightControlPoint]; 
    return path; 
} 

परिणाम इस प्रकार है:

freehand ellipse

मुझे पसंद नहीं है कैसे बताया यह शीर्ष पर है, और मेरी सभी कोशिशों के बावजूद मैं इसे बेहतर नहीं कर सकता। इसके अलावा, मुझे कम परिपूर्ण दिखने के लिए वक्र पसंद है, और केवल "फ्रीहैंड" दिखने वाले भाग के रूप में ओवरहैंग पर निर्भर नहीं है। मुझे लगता है कि 2 क्वाड वक्र सिर्फ जाने का गलत तरीका है .....

शायद 4 आर्क?

किसी के पास कोई अन्य समाधान या मेरे लिए कुछ नमूना कोड है? (कोई भी भाषा ठीक है)

उत्तर

0

तो यह सवाल लंबे समय से खुला रहा है, मुझे इसे एक शॉट देने का प्रयास करें। दो भाग हैं: (1) पथ बनाना सही नहीं है। (2) हाथ से खींचे गए पथ को पथपाकर। (1) के लिए, चीज से बाहर निकलने के लिए उपनिवेश। इसे 100 या तो नियंत्रण बिंदुओं से बाहर निकालें और उन्हें एक रैपिंग फ़ंक्शन से विकृत करें जो धीरे-धीरे भिन्न होता है। (2) पथ पर धीरे-धीरे भिन्न, निरंतर मोटाई और कोण असाइन करें, शायद कुछ शोर भी जोड़ना। पर्लिन शोर पर एक अच्छे इंसान दिखने वाले शोर के लिए, यह कमाल है। यह भी देखना हमेशा अच्छा विचार है कि अन्य लोग इसे कैसे करते हैं, फ़ोटोशॉप में पथ बनाते हैं और उन्हें स्ट्रोक करते हैं, इसके पास स्वाभाविक रूप से यह देखने का विकल्प होता है।

1

व्यक्तिगत तौर पर मैं इस तरह parametrically अपने अंडाकार निर्धारित करेगा और इसके:

x=(width*cos(t)/2)+centerx; 
y=(height*cos(t)/2)+centery; 

तो एक समारोह है कि छोटे यादृच्छिक संख्या

कि वक्र (parametrically) करने के लिए सामान्य वेक्टर पाता है एक समारोह बनाने

उत्पन्न करना
x=width*cos(t); 
y=height*sin(t); 
normal=UnitVector(x,y); 

आपके अंडाकार पर हर बिंदु के लिए, उस बिंदु पर सामान्य को एक छोटे से यादृच्छिक संख्या से सामान्य करके स्केल करके ऑफ़सेट करें।

क्यूबिक इंटरपोलेशन का उपयोग करके बिंदुओं के माध्यम से एक वक्र बनाएं।

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