CoreGraphicsで太極図を書いてみた



![スクリーンショット 2014-03-30 18.30.57.png](https://qiita-image-store.s3.amazonaws.com/0/40693/b4681b98-3c68-b6e7-0983-975a7931bea3.png "スクリーンショット 2014-03-30 18.30.57.png")



```Taikyokuzu.m


- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);
    
    CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);
    CGContextFillRect(context, rect);
    
    [self gaien:context rect:rect];
    [self siro:context rect:rect];
    [self kuro:context rect:rect];
    [self naienKuro:context rect:rect];
    [self naienSiro:context rect:rect];
}

//太極図の外円
- (void)gaien:(CGContextRef)context rect:(CGRect)rect {
    CGContextSaveGState(context);
    
    CGFloat x = rect.origin.x;
    x += rect.size.width/2;
    
    CGFloat y = rect.origin.y;
    y += rect.size.height/2;
    
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathAddArc(path, NULL, x, y, 100, 0, M_PI*2, NO);
    CGContextAddPath(context, path);
    CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor);
    CGContextSetLineWidth(context, 2);
    CGContextSetStrokeColorWithColor(context,[UIColor blackColor].CGColor);
    CGContextDrawPath(context, kCGPathFillStroke);
    
    CGContextRestoreGState(context);
}


//太極図の内部（白塗りのところ）
- (void)siro:(CGContextRef)context rect:(CGRect)rect{
    CGContextSaveGState(context);
    
    CGFloat x = rect.origin.x;
    x += rect.size.width/2;
    
    CGFloat y = rect.origin.y;
    y += rect.size.height/2;
    
    
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathAddArc(path, NULL, x, y-50, 50, 0, M_PI*2, NO); //内部の上の円（描画後、パスの終点は右端になる)
    CGPathAddArc(path, NULL, x, y-50, 50, 0, M_PI/2, NO); //パスを上の円の真下に移動させる。円の周辺を通るようにパスを移動させるのが重要
    CGPathAddArc(path, NULL, x, y, 100, M_PI/2, M_PI*3/2, NO); //外円を９０〜２７０度（半円）描く（下から上に線を引いている）
    CGContextAddPath(context, path);
    CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);
    CGContextSetLineWidth(context, 1);
    CGContextSetStrokeColorWithColor(context,[UIColor blackColor].CGColor);
    CGContextDrawPath(context, kCGPathFill);
    
    CGContextRestoreGState(context);
}

//内円の黒塗り
- (void)kuro:(CGContextRef)context rect:(CGRect)rect {
    CGContextSaveGState(context);
    
    CGFloat x = rect.origin.x;
    x += rect.size.width/2;
    
    CGFloat y = rect.origin.y;
    y += rect.size.height/2;
    
    
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathAddArc(path, NULL, x, y+50, 50, 0, M_PI*2, NO); //内部の下の円（描画後、パスの終点は右端になる)
    CGContextAddPath(context, path);
    CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor);
    CGContextSetLineWidth(context, 1);
    CGContextSetStrokeColorWithColor(context,[UIColor blackColor].CGColor);
    CGContextDrawPath(context, kCGPathFill);
    
    CGContextRestoreGState(context);
    
}

//更に内部の黒円
- (void)naienKuro:(CGContextRef)context rect:(CGRect)rect {
    CGContextSaveGState(context);
    
    CGFloat x = rect.origin.x;
    x += rect.size.width/2;
    
    CGFloat y = rect.origin.y;
    y += rect.size.height/2;
    
    
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathAddArc(path, NULL, x, y-50, 10, 0, M_PI*2, NO);
    CGContextAddPath(context, path);
    CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor);
    CGContextSetLineWidth(context, 1);
    CGContextSetStrokeColorWithColor(context,[UIColor blackColor].CGColor);
    CGContextDrawPath(context, kCGPathFill);
    
    CGContextRestoreGState(context);
    
}

//更に内部の白円
- (void)naienSiro:(CGContextRef)context rect:(CGRect)rect{
    CGContextSaveGState(context);
    
    CGFloat x = rect.origin.x;
    x += rect.size.width/2;
    
    CGFloat y = rect.origin.y;
    y += rect.size.height/2;
    
    
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathAddArc(path, NULL, x, y+50, 10, 0, M_PI*2, NO);
    CGContextAddPath(context, path);
    CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);
    CGContextSetLineWidth(context, 1);
    CGContextSetStrokeColorWithColor(context,[UIColor blackColor].CGColor);
    CGContextDrawPath(context, kCGPathFill);
    
    CGContextRestoreGState(context);
    
}

```

```ViewController.m

 [super viewDidLoad];
 Taikyokuzu *tai = [[Taikyokuzu alloc]initWithFrame:CGRectMake(20, 100, 280, 300)];
    
    [self.view addSubview:tai];


```