Moje pytanie dotyczy różnych technik rysunku linie, które wydają się być odręczne:Jak narysować elipsę lub okrąg odręczny?
How do you draw like a Crayon?
Konkretnie Steve Hanov pisał ten doskonały blog entry.
Dzięki temu mogłem zaimplementować ładnie wyglądający algorytm dla linii odręcznych za pomocą krzywych Beziera. Jednak utknąłem na tym, jak zaimplementować odręczną elipsę. Idealnie, chciałbym nadać temu prostemu użycie jako granicę, podobnie do innych wywołań rysowania elipsy. Ale chcę, żeby wyglądała bardzo odręcznie.
tej pory najlepszy jaki mają pochodzić z tego:
- (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;
}
Wynik wygląda tak:
nie lubię, jak wskazał to na górze, i pomimo wszystkich moich prób, po prostu nie mogę tego poprawić. Poza tym podoba mi się, że krzywe wyglądają mniej perfekcyjnie i nie polegają na tym, że zwis jest jedyną "odręczną" częścią. Myślę, że 2 zakręty czteropunktowe są po prostu niewłaściwą drogą .....
Może 4 łuki?
Ktoś ma inne rozwiązanie lub przykładowy kod dla mnie? (dowolny język jest w porządku)