使用CGContext绘制圆圈

时间:2012-03-17 07:50:11

标签: objective-c core-graphics

使用下面的代码,我正在构建具有不同数量边的多边形。

有人可以建议我如何添加代码来限制圆圈并在每个返回的多边形中刻上圆圈吗?

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

2 个答案:

答案 0 :(得分:11)

最后,由于其他人的一些指示,他们终于怀疑了 下面添加到原始代码的代码给了我需要的结果 感谢

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

答案 1 :(得分:8)

您使用CGContextAddEllipseInRect()绘制圆圈,传入正方形CGRect。计算矩形以适合 你返回的每个多边形更多一些,具体取决于你想要它的紧密程度。