0

私はCore Graphicsを初めて使用し、円とその周りにすべての方向に線を描き、円から光線が出ているようなアニメーションを作成したいと考えています。の

円のすべての方向に線のアニメーション効果を実現する方法として提案してください。

円を描くためのこれまでのコードは次のとおりです。

- (void)drawRect:(CGRect)iRect
{
    // Drawing code
    CGContextRef aContext = UIGraphicsGetCurrentContext();
    [self drawMeWithContext:aContext withRect:iRect];
    [self drawBadgeGradientWithContext:aContext withRect:iRect];


}



- (void)drawMeWithContext:(CGContextRef)iContext withRect:(CGRect)iRect {
    CGContextSaveGState(iContext);

    CGFloat aRadius = CGRectGetMaxY(iRect) * kBadgeCornerRadius;
    CGFloat aBuffer = CGRectGetMaxY(iRect) * kScreenBuffer;
    CGFloat aMaxX = CGRectGetMaxX(iRect) - aBuffer;
    CGFloat aMaxY = CGRectGetMaxY(iRect) - aBuffer;
    CGFloat aMinX = CGRectGetMinX(iRect) + aBuffer;
    CGFloat aMinY = CGRectGetMinY(iRect) + aBuffer;

    CGContextBeginPath(iContext);
    CGContextSetFillColorWithColor(iContext, [_MyColor CGColor]);
    CGContextAddArc(iContext, aMaxX - aRadius, aMinY + aRadius, aRadius, M_PI + M_PI/2, 0, 0);
    CGContextAddArc(iContext, aMaxX - aRadius, aMaxY - aRadius, aRadius, 0, M_PI/2, 0);
    CGContextAddArc(iContext, aMinX + aRadius, aMaxY - aRadius, aRadius, M_PI/2, M_PI, 0);
    CGContextAddArc(iContext, aMinX + aRadius, aMinY + aRadius, aRadius, M_PI, M_PI + M_PI/2, 0);
    CGContextClosePath(iContext);
    CGContextFillPath(iContext);
    CGContextRestoreGState(iContext);
}


- (void)drawBadgeGradientWithContext:(CGContextRef)iContext withRect:(CGRect)iRect {
    CGContextSaveGState(iContext);

    CGFloat aRadius = CGRectGetMaxY(iRect) * kBadgeCornerRadius;
    CGFloat aBuffer = CGRectGetMaxY(iRect) * kScreenBuffer;
    CGFloat aMaxX = CGRectGetMaxX(iRect) - aBuffer;
    CGFloat aMaxY = CGRectGetMaxY(iRect) - aBuffer;
    CGFloat aMinX = CGRectGetMinX(iRect) + aBuffer;
    CGFloat aMinY = CGRectGetMinY(iRect) + aBuffer;

    CGContextBeginPath(iContext);
    CGContextAddArc(iContext, aMaxX - aRadius, aMinY + aRadius, aRadius, M_PI+(M_PI/2), 0, 0);
    CGContextAddArc(iContext, aMaxX - aRadius, aMaxY - aRadius, aRadius, 0, M_PI/2, 0);
    CGContextAddArc(iContext, aMinX + aRadius, aMaxY - aRadius, aRadius, M_PI/2, M_PI, 0);
    CGContextAddArc(iContext, aMinX + aRadius, aMinY + aRadius, aRadius, M_PI, M_PI+M_PI/2, 0);
    CGContextClip(iContext);

    size_t aNumberOfLocations = 2;
    CGFloat aLocations[2] = {0.0, 0.5};
//  CGFloat aComponents[8] = {0.98, 0.96, 0.98, 1.0, 0.698, 0.016, 0.075, 1.0};

    CGColorSpaceRef aColorSpace;
    CGGradientRef aGradient;
    aColorSpace = CGColorSpaceCreateDeviceRGB();
    aGradient = CGGradientCreateWithColorComponents (aColorSpace, _MyColorComponent, aLocations, aNumberOfLocations);
    CGColorGetComponents([[UIColor redColor] CGColor]);
    CGColorGetComponents([[UIColor whiteColor] CGColor]);
    CGPoint aStartPoint;
    CGPoint anEndPoint;
    aStartPoint.x = 0;
    aStartPoint.y = 0;
    anEndPoint.x = 0;
    anEndPoint.y = aMaxY;

    CGContextDrawLinearGradient (iContext, aGradient, aStartPoint, anEndPoint, 0);
    CGColorSpaceRelease(aColorSpace);
    CGGradientRelease(aGradient);
    CGContextRestoreGState(iContext);
}
4

1 に答える 1

2

6 本の線を描きたいとしましょう。単位円の円周は2πです。したがって、最初の線は π/3 ラジアン (つまり、2π を 6 で割った値) の回転を持ち、2 番目の線は 2π/3 ラジアンの回転を持ち、というようになります。その回転を各線に適用します。

次に、線を円の外側に移動する必要があります。さて、あなたは各線が行きたい円の角度 (π/3, 2π/3 ... 2π) と円の半径を知っています。したがって、極座標 (例: (半径、π/3)) を作成できます。この極点をデカルト点 (例: (1, 2)) に変換します。これどうやってやるの?方法は次のとおりです。

x 座標を取得するには、cos(π/3) を見つけて、半径を掛けます。y についても同じことを行いますが、代わりに sin を使用します。

(2, π/3) は極座標 => (2cos(π/3), 2sin(π/3)) はデカルト座標です。

x 座標と y 座標のペアができたので、各線をデカルト ポイントに変換します。次に、線をアニメーション化する必要があります。私は iOS の回転機能にあまり詳しくありません。円の中心を中心に各線を回転できますか? それ以外の場合は、各線が次に進むべき円上の点を再計算し、線自体を回転させる必要があります。

これにはかなりの量の数学が含まれます。さらにサポートが必要な場合はお知らせください。

于 2013-06-22T05:49:40.680 に答える