2010-08-05 177 views
1

以下是我试图绘制圆圈的一段代码,但是我的x值会打印为常量值。这很可能非常非常简单。预先感谢您的帮助。在iPhone中帮助绘制圆圈

int sides = 100; 
int radius = 200; 
int centerX = 100; 
int centerY = 100; 
CGFloat red[4] = {1.0f, 0.0f, 0.0f, 1.0f}; 
CGContextSetStrokeColor(context, red); 
CGContextBeginPath(context); 


CGContextMoveToPoint(context, 0, 0); 
int i = 0; 
for(i = 0; i <= sides; i++) 
{ 

    CGFloat pointRatio = i/sides; 
    CGFloat xSteps = cos(pointRatio * 2 * M_PI); 
    CGFloat ySteps = sin(pointRatio * 2 * M_PI); 
    CGFloat pointX = centerX + xSteps * radius; 
    CGFloat pointY = centerY + ySteps * radius; 
    NSLog(@"%i", pointX); 

    CGContextAddLineToPoint(context, pointX, pointY); 
} 
CGContextStrokePath(context); 

回答

8
CGFloat pointRatio = i/sides; 

当你把2个整数,结果也将整数 - 在你的情况下为0。你必须确保浮点部门将进行:

CGFloat pointRatio = 1.0f*i/sides; 
// Or even better 
CGFloat pointRatio = i/(CGFloat)sides; 

通过你为什么不希望使用内置的函数来绘制圆的方式:

CGPathAddEllipseInRect(path, NULL, 
      CGRectMake(centerX - radius, centerY - radius, 2*radius, 2*radius)); 
+0

您也可以将分隔符的一边或另一边转换为浮点类型;例如'i /(CGFloat)sides'。但是,'CGPathAddEllipseInRect'是正确的方法;密谋自己是一个艰难的方式。 – 2010-08-05 20:27:04

+0

@彼得,这两种分裂方式有什么区别吗?或者编译器最终使它们的指令相同? – Vladimir 2010-08-05 20:46:38

+0

你是一个乘法和一个分裂;我的是一个师。编译器可能会非常好地优化乘法,但我宁愿不为它编写代码。 – 2010-08-05 20:51:24

0

以前的答案是正确的。另外,使用cosf()和sinf(),而不是cos()和sin() - 你正在使用浮点精度。

+2

“以前的答案”没有说太多,当他们都“回答”08年8月5日“。你应该用作者的名字来引用答案。 – 2010-08-05 20:52:42

+0

马修感谢,有趣的是,sin()和cos()在最终的绘图中给我足够的分辨率......这意味着我应该使用这些分辨率?或者稍后我会遇到问题。 – Skawful 2010-08-06 02:15:33

5

您只需要2行代码即可绘制出真正的圆形圆。我的示例代码:

CGContextAddArc(contextRef,centerX,centerY,radius,0,2*3.1415926535898,1); 
CGContextDrawPath(contextRef,kCGPathStroke);