2013-06-22 134 views
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); 
} 

回答

2

比方說,你想畫六行。單位圓的周長是2π。因此,第一條線將有π/ 3弧度的旋轉(即2π除以6),第二條線將具有2π/ 3弧度的旋轉等。將該旋轉應用於每條線。

現在您需要將您的線條翻譯爲圓圈外部。那麼,你知道每條線要走的圓上的角度(π/3,2π/ 3 ...2π)以及圓的半徑。因此,您可以創建極座標(例如(半徑,π/ 3))。將此極點轉換爲笛卡爾點(例如(1,2))。你怎麼做到這一點?就是這樣。

要獲得您的x座標,找到cos(π/ 3),然後將其乘以半徑。對y做同樣的事情,而是用罪惡來代替。 (2,π/ 3)是極座標=>(2cos(π/ 3),2sin(π/ 3))是笛卡爾座標。

現在您已經有了x和y座標對,請將每條線翻譯爲它的笛卡兒點。現在你需要動畫線條。我不太熟悉iOS上的旋轉功能。你可以圍繞圓心旋轉每條線嗎?否則,你必須重新計算每一行下一行的圓上的點,並自行旋轉行。

這涉及到一個體面的數學。讓我知道你是否需要額外的幫助。