2012-06-30 11 views
6

Estoy tratando de encontrar la manera de dibujar un arco en CoreGraphics. Entiendo qué método se llama a hacer y cómo calcular los ángulos en el siguiente escenario.iOS CoreGraphics: Dibujar arco, determinar ángulos de arco del teorema de acordes de intersección

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

Cuando los puntos están ambos en la parte inferior de la rect. Sin embargo, cuando dos puntos se encuentran en otras ubicaciones, no sé cómo calcular el ángulo correcto.

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

Ver la parte inferior de mi imagen.

enter image description here

Ray Wenderlich tiene una great tutorial sobre la creación de arcos por sólo en las primeras posiciones punto mencionado.

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

¿Cómo puedo calcular el ángulo cuando en otras situaciones como se muestra en la parte inferior de mi imagen?

Respuesta

9

Me parece una manera más fácil de hacer arcos es utilizar:

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

Si nos fijamos en esta imagen desde el sitio de Ray Wenderlich (http://www.raywenderlich.com/2134/core-graphics-101-glossy-buttons/cgcontextaddarctopoint), punto (x1, y1) es el punto de inicio de la curva y el punto (x2, y2) es su punto final. Entonces solo especifica el radio de la esquina y ¡voila! Parece que esto puede ser una API más fácil de usar para lo que estás buscando hacer.

0

Necesita al menos 3 puntos para determinar un círculo.

En su primer senario donde dos puntos están en la parte inferior de un rect, el punto medio superior es implícitamente el tercer punto cuando se conoce arcHeight. Por lo tanto, los tres puntos determinaron el círculo, por lo tanto, el arco. Por lo tanto, se pueden calcular todos los ángulos, etc.

En su segundo senario, sin embargo, no se define un tercer punto. Por lo tanto, puede dibujar un número infinito de arcos que pasan por los dos puntos con diferentes curvaturas. Necesitará requisitos adicionales para arreglar un arco. Por ejemplo, el radio o un tercer punto se supone que es uno el arco.

Cuestiones relacionadas