Как рисовать звезды с помощью Quartz Core?

Я пытаюсь адаптировать пример, предоставленный Apple, чтобы программно рисовать звезды в линию, код следующий:

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, aSize);

    for (NSUInteger i=0; i<stars; i++) 
    {

       CGContextSetFillColorWithColor(context, aColor);
       CGContextSetStrokeColorWithColor(context, aColor);

       float w = item.size.width;
       double r = w / 2;
       double theta = 2 * M_PI * (2.0 / 5.0); // 144 degrees

       CGContextMoveToPoint(context, 0, r);

       for (NSUInteger k=1; k<5; k++) 
       {
          float x = r * sin(k * theta);
          float y = r * cos(k * theta);
          CGContextAddLineToPoint(context, x, y);
       }

       CGContextClosePath(context);
       CGContextFillPath(context);
    }

Код выше рисует идеальную звезду, но 1. отображается вверх ногами 2. является черным и без границ. Я хочу добиться того, чтобы нарисовать много звезд на одной линии и с заданным стилем. Я понимаю, что на самом деле я рисую один и тот же путь 5 раз в одном и том же положении и что я должен как-то перевернуть контекст вертикально, но после нескольких тестов я сдался! (У меня нет необходимых математических и геометрических навыков :P)... не могли бы вы мне помочь?

ОБНОВЛЕНИЕ:

Ок, благодаря CocoaFu, это моя исправленная и работающая утилита рисования:

- (void)drawStars:(NSUInteger)count inContext:(CGContextRef)context;
{
    // constants
    const float w = self.itemSize.width;
    const float r = w/2;
    const double theta = 2 * M_PI * (2.0 / 5.0);
    const float flip = -1.0f; // flip vertically (default star representation)

    // drawing center for the star
    float xCenter = r;

    for (NSUInteger i=0; i<count; i++) 
    {
        // get star style based on the index
        CGContextSetFillColorWithColor(context, [self fillColorForItemAtIndex:i]);
        CGContextSetStrokeColorWithColor(context, [self strokeColorForItemAtIndex:i]);

        // update position
        CGContextMoveToPoint(context, xCenter, r * flip + r);

        // draw the necessary star lines
        for (NSUInteger k=1; k<5; k++) 
        {
            float x = r * sin(k * theta);
            float y = r * cos(k * theta);
            CGContextAddLineToPoint(context, x + xCenter, y * flip + r);
        }

        // update horizontal center for the next star
        xCenter += w + self.itemMargin; 

        // draw current star
        CGContextClosePath(context);
        CGContextFillPath(context);
        CGContextStrokePath(context);
    }
}
9
задан daveoncode 9 December 2011 в 15:11
поделиться