Câu hỏi của tôi liên quan đến kỹ thuật khác nhau để vẽ đường có vẻ như là tự do:Làm cách nào để vẽ hình elip hoặc vòng tròn tự do?
How do you draw like a Crayon?
Cụ Steve Hanov posted tuyệt vời blog entry này.
Từ đó tôi đã có thể triển khai thuật toán tìm kiếm đẹp mắt cho các đường tự do sử dụng đường cong bezier. Tuy nhiên, tôi bị mắc kẹt về cách thực hiện một hình elip tìm kiếm tự do. Lý tưởng nhất, tôi muốn cung cấp cho nó một rect để sử dụng như một ranh giới, tương tự như các cuộc gọi vẽ hình elip khác. Nhưng, tôi muốn nó trông rất tự do.
Cho đến nay, các tốt nhất mà tôi đã đưa ra với điều này:
- (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;
}
Kết quả trông như thế này:
tôi không thích như thế nào chỉ là trên đầu trang, và mặc dù tất cả cố gắng của tôi tôi chỉ không thể làm cho nó tốt hơn nhiều. Thêm vào đó, tôi thích các đường cong trông ít hoàn hảo hơn, và không dựa vào phần nhô ra như phần tìm kiếm "tự do" duy nhất. Tôi nghĩ rằng 2 đường cong quad chỉ là sai cách để đi .....
Có lẽ 4 vòng cung?
Bất kỳ ai có giải pháp khác hoặc một số mã mẫu cho tôi? (bất kỳ ngôn ngữ nào là tốt)