2011-08-04 233 views
7

我的问题涉及到的各种技术绘制,似乎是写意线:如何绘制手绘的椭圆或圆形?

How do you draw like a Crayon?

具体史蒂夫Hanov张贴了这个优秀的blog entry

由此我能够使用贝塞尔曲线为徒手线实现漂亮的算法。但是,我坚持如何实现手绘椭圆。理想情况下,我想给它一个矩形作为边界,类似于其他椭圆绘图调用。但是,我希望它看起来很自由。

到目前为止,最好的我想出了这一点:

- (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)在路径上分配缓慢变化的连续厚度和角度,可能还会增加一些噪音。看到佩林噪音,看起来很好看的人声噪音,这很棒。另外,看看别人怎么做,在Photoshop中创建路径并对它们进行描边总是一个好主意,它可以自然地找到它。

1

我个人参定义你的椭圆形,像这样:

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

然后使产生小的随机数

作出这样的发现法向矢量曲线(参)的函数

功能
x=width*cos(t); 
y=height*sin(t); 
normal=UnitVector(x,y); 

对于椭圆上的每个点,通过用一个小的随机数缩放该点的法线来抵消。

使用三次插值绘制通过点的曲线。