2012-06-30 31 views
6

Tôi đang cố gắng tìm ra cách vẽ một vòng cung trong CoreGraphics. Tôi hiểu phương thức nào cần thực hiện và cách tính các góc trong kịch bản sau đây.iOS CoreGraphics: Vẽ vòng cung, xác định góc cung từ định lý hợp âm giao nhau

---------- 
|  | 
*--------* 

Khi cả hai điểm ở dưới cùng của trực tràng. Tuy nhiên khi hai điểm ở các vị trí khác, tôi không biết cách tính góc đúng.

---------* 
|  | 
*--------- 

Xem phần dưới cùng của hình ảnh của tôi.

enter image description here

Ray Wenderlich có great tutorial về việc tạo vòng cung cho chỉ ở các vị trí điểm cần chú ý đầu tiên.

// sample code for creating arc for path from bottom of rect 
CGMutablePathRef createArcPathFromBottomOfRect(CGRect rect, CGFloat arcHeight) { 
    CGRect arcRect = CGRectMake(rect.origin.x, rect.origin.y + rect.size.height 
    - arcHeight, rect.size.width, arcHeight); 
    CGFloat arcRadius = (arcRect.size.height/2) + (pow(arcRect.size.width, 2)/
    (8 * arcRect.size.height)); 
    CGPoint arcCenter = CGPointMake(arcRect.origin.x + arc.size.width/2, 
    arcRect.origin.y + arcRadius); 
    CGFloat angle = acos(arcRect.size.width/ (2*arcRadius)); 
    CGFloat startAngle = radians(180) + angle; 
    CGFloat endAngle = radians(360) - angle; 
    CGMutablePathRef path = CGPathCreateMutable(); 
    CGPathAddArc(path, NULL, arcCenter.x, arcCenter.y, arcRadius, startAngle, 
    endAngle, 0); 
    return path; 
} 

Làm cách nào để tính góc khi ở các tình huống khác như được mô tả ở cuối hình ảnh của tôi?

Trả lời

9

Tôi tìm thấy một cách dễ dàng hơn để làm cho vòng cung là sử dụng:

void CGContextAddArcToPoint (
    CGContextRef c, 
    CGFloat x1, 
    CGFloat y1, 
    CGFloat x2, 
    CGFloat y2, 
    CGFloat radius 
); 

Nếu bạn nhìn vào hình ảnh này từ trang web của Ray Wenderlich của (http://www.raywenderlich.com/2134/core-graphics-101-glossy-buttons/cgcontextaddarctopoint), điểm (x1, y1) là điểm bắt đầu của bạn cho đường cong và điểm (x2, y2) là điểm kết thúc của bạn. Sau đó chỉ cần xác định bán kính góc và thì đấy! Có vẻ như đây có thể là một API dễ sử dụng hơn cho những gì bạn đang tìm kiếm.

0

Bạn cần ít nhất 3 điểm để xác định vòng kết nối.

Trong senario đầu tiên của bạn, nơi hai điểm nằm ở dưới cùng của một trực tràng, điểm giữa trên cùng là điểm thứ ba khi arcHeight được biết đến. Vì vậy, ba điểm xác định vòng tròn, do đó vòng cung. Vì vậy, tất cả các góc độ và vv có thể được tính toán.

Tuy nhiên, trong senario thứ hai, không xác định được điểm thứ ba. Vì vậy, bạn có thể vẽ số lượng vô hạn của vòng cung đi qua hai điểm với độ cong khác nhau. Bạn sẽ cần thêm các yêu cầu để sửa một vòng cung. Ví dụ bán kính hoặc điểm thứ ba được cho là một cung.

Các vấn đề liên quan