How to draw stars using Quartz Core?

前端 未结 3 2151
北恋
北恋 2020-12-28 10:29

I\'m trying to adapt an example provided by Apple in order to programmatically draw stars in line, the code is the following:

CGContextRef context = UIGraphi         


        
3条回答
  •  伪装坚强ぢ
    2020-12-28 10:55

    Here's an algorithm to implement what buddhabrot implied:

    - (void)drawStarInContext:(CGContextRef)context withNumberOfPoints:(NSInteger)points center:(CGPoint)center innerRadius:(CGFloat)innerRadius outerRadius:(CGFloat)outerRadius fillColor:(UIColor *)fill strokeColor:(UIColor *)stroke strokeWidth:(CGFloat)strokeWidth {
        CGFloat arcPerPoint = 2.0f * M_PI / points;
        CGFloat theta = M_PI / 2.0f;
    
        // Move to starting point (tip at 90 degrees on outside of star)
        CGPoint pt = CGPointMake(center.x - (outerRadius * cosf(theta)), center.y - (outerRadius * sinf(theta)));
        CGContextMoveToPoint(context, pt.x, pt.y);
    
        for (int i = 0; i < points; i = i + 1) {
            // Calculate next inner point (moving clockwise), accounting for crossing of 0 degrees
            theta = theta - (arcPerPoint / 2.0f);
            if (theta < 0.0f) {
                theta = theta + (2 * M_PI);
            }
            pt = CGPointMake(center.x - (innerRadius * cosf(theta)), center.y - (innerRadius * sinf(theta)));
            CGContextAddLineToPoint(context, pt.x, pt.y);
    
            // Calculate next outer point (moving clockwise), accounting for crossing of 0 degrees
            theta = theta - (arcPerPoint / 2.0f);
            if (theta < 0.0f) {
                theta = theta + (2 * M_PI);
            }
            pt = CGPointMake(center.x - (outerRadius * cosf(theta)), center.y - (outerRadius * sinf(theta)));
            CGContextAddLineToPoint(context, pt.x, pt.y);
        }
        CGContextClosePath(context);
        CGContextSetLineWidth(context, strokeWidth);
        [fill setFill];
        [stroke setStroke];
        CGContextDrawPath(context, kCGPathFillStroke);
    }
    

    Works for me for most basic stars. Tested from 2 points (makes a good diamond!) up to 9 stars.

    If you want a star with point down, change the subtraction to addition.

    To draw multiples, create a loop and call this method multiple times, passing a new center each time. That should line them up nicely!

提交回复
热议问题