我使用以下代码绘制弧
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);
如果您在视网膜上检查它,它看起来像这样:
我的弧线是绿色弧线。我已经显示了起始角度为橙色线的位置。正如我在红色矩形中所示,在弧的最开始处绘制了一个额外的东西。这不是针对所有起始角度,而是针对特定起始角度。
你知道为什么会这样吗?
感谢。
答案 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
到弧线的起点连接路径,请打电话。