मेरा प्रश्न है कि मुक्तहस्त प्रतीत लाइनों ड्राइंग के लिए विभिन्न तकनीकों शामिल है:एक फ्रीहैंड-दिखने वाले अंडाकार या सर्कल को कैसे आकर्षित करें?
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;
}
परिणाम इस प्रकार है:
मुझे पसंद नहीं है कैसे बताया यह शीर्ष पर है, और मेरी सभी कोशिशों के बावजूद मैं इसे बेहतर नहीं कर सकता। इसके अलावा, मुझे कम परिपूर्ण दिखने के लिए वक्र पसंद है, और केवल "फ्रीहैंड" दिखने वाले भाग के रूप में ओवरहैंग पर निर्भर नहीं है। मुझे लगता है कि 2 क्वाड वक्र सिर्फ जाने का गलत तरीका है .....
शायद 4 आर्क?
किसी के पास कोई अन्य समाधान या मेरे लिए कुछ नमूना कोड है? (कोई भी भाषा ठीक है)