2012-03-17 10 views
5

以下のコードを使用して、さまざまな辺の数のポリゴンを作成しています。CGContextを使用して円を描く

誰かが、円を囲むコードを追加したり、返された各ポリゴンの円に刻印する方法をアドバイスできますか?

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

答えて

10

は最終的に元のコードに追加し、以下の他人 コードからいくつかのポインタのおかげで、私は 感謝

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

CGContextAddEllipseInRect()を使用してサークルを描き、正方形のCGRectを渡します。矩形をに合わせると、に戻ってくるポリゴンはどれくらい強くフィットしているのでしょうか?

+0

ハイテクはあなたの答えに感謝しかし、ポイントの計算方法のより詳細な説明を必要とする必要がある結果を与えるそれをsussed返された各ポリゴンは外接し、正しく刻印されます。 – superllanboy

+0

可能なポリゴンの一般的な答えは?私が恐れていることは分かりません。数学のスタック交換について質問する必要があります。 CGPathGetBoundingBoxのどこかで、あなたのパスを囲む矩形を与え、その対角線を使って半径を与えることができますか? – jrturton

+0

お返事ありがとうございました - あなたは私にアイデアの種を与えましたので、私は周りを回り、働くことができるかどうかを見てみましょう – superllanboy

関連する問題