在iOS中,对于某些起始角度,弧线格式不正确

时间:2014-07-21 07:30:49

标签: ios objective-c cgcontext cgpath

我使用以下代码绘制弧

    double radius = 358.40001058578491;
    startAngle = 0.13541347644783652;
    double center_x= 684;
    double center_y = 440;
    std::complex<double> start1(   std::polar(radius,startAngle) );

    CGPoint targetStart1 = CGPointMake(start1.real() + center_x, start1.imag() +center_y);
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, NULL, targetStart1.x, targetStart1.y);
    CGPathAddArc(path, NULL, center_x, center_y, radius, startAngle, 0.785,   0 );
    CGContextAddPath(context, path);
    CGContextSetLineWidth( context,  30 );

    CGContextSetStrokeColorWithColor( context, targetColor.CGColor);

    CGContextStrokePath(context);

    CGPathRelease(path);

如果您在视网膜上检查它,它看起来像这样:

enter image description here

我的弧线是绿色弧线。我已经显示了起始角度为橙色线的位置。正如我在红色矩形中所示,在弧的最开始处绘制了一个额外的东西。这不是针对所有起始角度,而是针对特定起始角度。

你知道为什么会这样吗?

感谢。

1 个答案:

答案 0 :(得分:3)

在您的原始问题中,您指定了一个不太正确的文字起点,因此,Core Graphics将从该点绘制一条直线到弧线的起点。并且因为起始点距离弧的实际开始只有几个像素,所以它会导致您在问题中说明好奇的渲染。

在您修改过的问题中,您正在计算起点,但我建议您以编程方式计算它:

CGFloat centerX    = 684.0;
CGFloat centerY    = 440.0;
CGFloat radius     = 360.0;
CGFloat startAngle = 0.135;
CGFloat endAngle   = 0.785;

CGFloat startingX = centerX + radius * cosf(startAngle);
CGFloat startingY = centerY + radius * sinf(startAngle);
CGContextMoveToPoint(context, startingX, startingY);

CGContextAddArc(context, centerX, centerY, radius, startAngle, endAngle, 0);

CGContextSetLineWidth(context, 30);
CGContextSetStrokeColorWithColor(context, targetColor.CGColor);
CGContextStrokePath(context);

当我以这种方式计算时,没有舍入错误导致原始问题中显示的工件。


注意,如果您未在弧线之前绘制任何内容,则可以完全省略CGContextMoveToPoint调用。你只需要&#34;移动到指向&#34;如果你在弧线前画了一些东西并且不想从CGContextGetPathCurrentPoint到弧线的起点连接路径,请打电话。