Mi pregunta implica diversas técnicas para dibujar líneas que parecen ser a mano alzada:¿Cómo dibujar una elipse o círculo a mano alzada?
How do you draw like a Crayon?
Específicamente Steve Hanov publicado esto blog entry excelente.
A partir de eso, pude implementar un bonito algoritmo para líneas a mano alzada usando curvas bezier. Sin embargo, estoy atascado en cómo implementar una elipse de aspecto a mano alzada. Idealmente, me gustaría darle un rect para usar como un límite, similar a otras llamadas de dibujo de elipse. Pero, quiero que luzca muy a mano alzada.
Hasta el momento, la mejor que han llegado con esto:
- (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;
}
El resultado es el siguiente:
no me gusta la forma señaló que es en la parte superior, y a pesar de todo lo que intento, simplemente no puedo hacerlo mucho mejor. Además, me gusta que las curvas se vean menos perfectas, y no confío en el voladizo como la única parte que se ve a "mano alzada". Creo que 2 curvas cuádruples son simplemente el camino equivocado ...
¿Tal vez 4 arcos?
¿Alguien tiene otra solución o código de muestra para mí? (cualquier idioma está bien)