私の質問は、フリーハンドのように見える線を描画するための様々な技術を必要とする:自由に見える楕円や円を描くには?
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;
}
結果は以下のようになります。それが上に指摘どのように私は好きではない
、すべての私の試みにもかかわらず、私はそれをはるかに良くすることはできません。さらに、私はカーブがあまり完璧に見えず、唯一の "フリーハンド"な部分としてオーバーハングに頼っていないのが好きです。私は2つのクワッドカーブがちょうど行く間違った方法だと思います.....
多分4弧ですか?
誰かが私のために別の解決策やサンプルコードを持っていますか? (言語は問題ありません)