【问题标题】:Help drawing circle in iPhone帮助在 iPhone 中画圆
【发布时间】:2010-08-05 19:56:02
【问题描述】:

以下是我试图画一个圆的 sn-p 代码,但我的 x 值打印为一个常数值。这很可能是非常非常简单的事情。提前感谢您的帮助。

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);

【问题讨论】:

    标签: iphone core-graphics


    【解决方案1】:
    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));
    

    【讨论】:

    • 您也可以只将除法的一侧或另一侧转换为浮点类型;例如,i/(CGFloat)sides。但是,是的,CGPathAddEllipseInRect 是正确的做法;自己绘制一个 hecatogon 是很难的。
    • @Peter,这两种划分方式有什么区别吗?还是编译器最终使它们成为相同的指令?
    • 你的是乘法和除法;我的只是一个部门。编译器可能会很好地优化乘法,但我宁愿一开始就不为它编写代码。
    • 不通过内置函数绘制圆的原因是它最终会是一条扭曲的线,而不是一个完美的圆。感谢您的出色回答。
    • Skawful:你的圈子会如何扭曲?您是否反复连接到转换矩阵并在其中累积某种错误?绘制一个 hecatogon 将如何避免这种情况?
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • “上一个答案”并没有说明太多,因为它们都是“2010 年 8 月 5 日已回答”。你应该通过作者的名字来引用答案。
      • Matthew 谢谢,有趣的是 sin() 和 cos() 在最终绘图中给了我足够的分辨率......这是否意味着我应该只使用它们?或者我以后这样做会有问题吗?
      猜你喜欢
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-27
      • 1970-01-01
      • 2010-09-29
      相关资源
      最近更新 更多