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