使用CGContext绘制圆形

10
使用下面的代码,我正在构建具有不同边数的多边形。
请问是否可以提供建议,如何添加代码以包含每个返回的多边形中的围绕圆和内切圆?
-(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个回答

13

终于在别人的一些提示下搞清楚了,下面添加到原代码中的代码给出了我需要的结果,谢谢。

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

8

您可以使用CGContextAddEllipseInRect()来绘制圆形,需要传入一个正方形CGRect。如果要计算适合每个多边形内部的矩形,这会稍微复杂一些,具体取决于您希望它有多紧密的拟合。


感谢您的回答,但需要更多解释如何计算点,以便每个返回的多边形都正确地外接和内切。 - superllanboy
任何可能的多边形的通用答案?恐怕我不知道,你可能需要在数学堆栈交换上询问。使用CGPathGetBoundingBox ,您可能会得到一些进展,它会给出一个包围您的路径的矩形,然后计算该对角线以给出您的半径? - jrturton
嗨,感谢您的回答!您已经给了我一个点子的种子,所以我会摆弄一下,看看能否让它正常工作。 - superllanboy
我很想看看你能做出什么,这是一个不错的问题(如果你喜欢那种东西的话!) - jrturton
有没有办法为CGContextAddEllipseInRect提供描边,使其成为圆形的轮廓线? - Mahesh Babu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接