2012-06-30 4 views
6

Ich versuche herauszufinden, wie man in CoreGraphics einen Bogen zeichnet. Ich verstehe, welche Methodenaufrufe zu machen sind und wie die Winkel im folgenden Szenario zu berechnen sind.iOS CoreGraphics: Bogen zeichnen, Bogenwinkel aus schneidendem Akkord-Theorem bestimmen

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

Wenn die Punkte sind beide in der Unterseite der Rect. Wenn jedoch zwei Punkte an anderen Orten sind, kann ich den richtigen Winkel nicht berechnen.

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

Siehe unteren Teil meines Bildes.

enter image description here

Ray Wenderlich hat eine great tutorial über Bögen nur in dem erstgenannten Punktpositionen zu schaffen.

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

Wie berechne ich den Winkel in anderen Situationen, wie unten in meinem Bild dargestellt?

Antwort

9

finde ich einen einfacheren Weg, Bögen zu machen ist, zu verwenden:

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

Wenn Sie von Ray Wenderlich Website auf diesem Bild sehen (http://www.raywenderlich.com/2134/core-graphics-101-glossy-buttons/cgcontextaddarctopoint), Punkt (x1, y1) ist Startpunkt für die Kurve und Punkt (x2, y2) ist dein Endpunkt. Dann gib einfach den Eckenradius an und voila! Es sieht so aus, als wäre dies eine einfachere API für das, was Sie suchen.

0

Sie benötigen mindestens 3 Punkte, um einen Kreis zu bestimmen.

In Ihrem ersten Szenario, wo zwei Punkte am Ende eines Rect liegen, ist der obere Mittelpunkt implizit der dritte Punkt, wenn arcHeight bekannt ist. Daher bestimmten die drei Punkte den Kreis, also den Bogen. So können alle Winkel und usw. berechnet werden.

In Ihrem zweiten Senario ist jedoch kein dritter Punkt definiert. Daher können Sie eine unendliche Anzahl von Bögen zeichnen, die durch die zwei Punkte mit unterschiedlichen Krümmungen verlaufen. Sie benötigen zusätzliche Anforderungen, um einen Bogen zu reparieren. Zum Beispiel soll der Radius oder ein dritter Punkt der eine sein.