2012-06-30 8 views
6

Sto cercando di capire come disegnare un arco in CoreGraphics. Capisco quale metodo chiama per fare e come calcolare gli angoli nel seguente scenario.CoreGraphics iOS: tracciare un arco, determinare gli angoli dell'arco dal teorema degli accordi che si intersecano

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

Quando i punti sono entrambi nella parte inferiore del rettangolo. Tuttavia, quando due punti si trovano in altre posizioni, non so come calcolare l'angolo corretto.

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

Vedere parte inferiore della mia immagine.

enter image description here

Ray Wenderlich ha una great tutorial sulla creazione di archi per solo nelle prime posizioni dei punti menzionati.

// 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; 
} 

Come si calcola l'angolo in altre situazioni come illustrato nella parte inferiore dell'immagine?

risposta

9

trovo un modo più semplice per fare archi è quello di utilizzare:

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

Se si guarda a questa immagine dal sito di Ray Wenderlich (http://www.raywenderlich.com/2134/core-graphics-101-glossy-buttons/cgcontextaddarctopoint), punto (x1, y1) è il vostro punto di partenza per la curva e il punto (x2, y2) è il tuo punto finale. Quindi basta specificare il raggio dell'angolo e voilà! Sembra che questa potrebbe essere un'API più facile da usare per quello che stai cercando di fare.

0

Per determinare un cerchio sono necessari almeno 3 punti.

Nel tuo primo senario in cui due punti si trovano nella parte inferiore di un rettangolo, il punto medio superiore è implicitamente il terzo punto quando è noto arcHeight. Quindi i tre punti determinarono il cerchio, quindi l'arco. Quindi tutti gli angoli e così via possono essere calcolati.

Nel secondo senario, tuttavia, non viene definito alcun terzo punto. Pertanto è possibile disegnare un numero infinito di archi passando attraverso i due punti con diverse curvature. Avrai bisogno di requisiti aggiuntivi per fissare un arco. Ad esempio il raggio o un terzo punto che si suppone essere l'arco.

Problemi correlati