2012-03-17 14 views
5

Usando el siguiente código, estoy construyendo polígonos con varios lados.Dibujando círculos con CGContext

¿Alguien puede aconsejar cómo puedo agregar el código para circunscribir un círculo y también inscribir un círculo en cada polígono devuelto?

-(void) drawRect:(CGRect)rect{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextBeginPath (context); 
    CGContextSetLineWidth(context,5); 

    NSArray * points = [PolygonUIView pointsForPolygonInRect:[self bounds] numberOfSides:polygon.numberOfSides]; 

    NSLog(@"%d", [points count]); 
    NSLog(@"%d", polygon.numberOfSides); 

    for(NSValue * point in points) { 
     CGPoint val = [point CGPointValue]; 
     if([points indexOfObject:point]==0) 
     { 
      CGContextMoveToPoint (context, val.x, val.y); 

     } 
     else 
     { 
      CGContextAddLineToPoint (context, val.x, val.y); 
     } 
    } 

    CGContextClosePath(context); 
    [[UIColor clearColor] setFill]; 
    [[UIColor blackColor] setStroke]; 
    CGContextDrawPath (context, kCGPathFillStroke); 
    polygonLabel.text = polygon.name; 
} 

+ (NSArray *)pointsForPolygonInRect:(CGRect)rect numberOfSides:(int)numberOfSides { 
    CGPoint center = CGPointMake(rect.size.width/2.0, rect.size.height/2.0); 
    float radius = 0.90 * center.x; 
    NSLog(@"%f rad",radius); 
    NSMutableArray *result = [NSMutableArray array]; 
    float angle = (2.0 * M_PI)/numberOfSides; 
    float exteriorAngle = M_PI - angle; 
    float rotationDelta = angle - (0.5 * exteriorAngle); 

    for (int currentAngle = 0; currentAngle < numberOfSides; currentAngle++) { 
     float newAngle = (angle * currentAngle) - rotationDelta; 
     float curX = cos(newAngle) * radius; 
     float curY = sin(newAngle) * radius; 
     [result addObject:[NSValue valueWithCGPoint:CGPointMake(center.x + curX, 
                   center.y + curY)]]; 
    } 

    return result; 
} 

Respuesta

10

finalmente sussed a cabo gracias a algunos consejos de otros siguiente código añade al código original me da el resultado que necesito gracias

// circumscribe the polygons 
CGContextSetLineWidth(context, 2); // set the line width 
CGContextSetRGBStrokeColor(context, 20.0 /255, 101.0/255.0, 18.0/255.0, 1.0); 

CGPoint center = CGPointMake(rect.size.width/2, rect.size.height/2); // get the circle centre 
CGFloat radius = 0.9 * center.x; // little scaling needed 
CGFloat startAngle = -((float)M_PI/2); // 90 degrees 
CGFloat endAngle = ((2 * (float)M_PI) + startAngle); 
CGContextAddArc(context, center.x, center.y, radius + 4, startAngle, endAngle, 0); // create an arc the +4 just adds some pixels because of the polygon line thickness 
CGContextStrokePath(context); // draw 

// inscribed circle 
float angle = M_PI - ((2 * M_PI)/polygon.numberOfSides); // need the polygon angles 
CGContextSetLineWidth(context, 2); // set the line width 
CGContextSetRGBStrokeColor(context, 20.0/255, 101.0/255.0, 211.0/255.0, 1.0); 
CGFloat innerradius = (0.9 * center.x) * sin(angle/2); // calc the inner radius 
CGContextAddArc(context, center.x, center.y, innerradius - 3, startAngle, endAngle, 0); // create an arc the minus 3 subtracts some pixels because of the polygon line thickness 
CGContextStrokePath(context); // draw 
7

usted dibuja círculos usando CGContextAddEllipseInRect(), pasando en una plaza CGRect. Calcular el rect para que encaje en dentro de cada polígono que devuelva es un poco más complicado, dependiendo de cuán estrictamente desee que encaje.

+0

hi apreciar su respuesta, pero necesitan más explicación de la forma de calcular los puntos para que cada polígono devuelto esté circunscrito e inscrito correctamente – superllanboy

+0

¿Una respuesta genérica para cualquier posible polígono? No tengo idea de lo que temo, es posible que tengas que preguntar en el intercambio de stack de matemáticas. Puede obtener un lugar con CGPathGetBoundingBox, que le da un rect que encerra su camino, y luego calcula la diagonal de ese para darle su radio. – jrturton

+0

hola gracias por su respuesta. Me ha dado la semilla de una idea, así que voy a buscar y ver si puedo hacer que funcione. – superllanboy