5
5

More than 5 years have passed since last update.

CoreGraphicsで太極図を書いてみた

Last updated at Posted at 2014-03-30

スクリーンショット 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); //外円を90〜270度(半円)描く(下から上に線を引いている)
    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];


5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5