iOS CoreGraphics:绘制圆弧,根据相交的和弦定理确定圆弧角度

时间:2012-06-30 21:12:45

标签: objective-c ios core-graphics

我正在试图弄清楚如何在CoreGraphics中绘制弧线。我理解在下面的场景中调用哪个方法以及如何计算角度。

----------
|        |
*--------*

当积分都在矩形的底部。但是当两个点位于其他位置时,我不知道如何计算正确的角度。

---------*
|        |
*---------

查看我图片的底部。

enter image description here

Ray Wenderlich有great tutorial关于仅在首先提到的点位置创建弧线。

// sample code for creating arc for path from bottom of rect
CGMutablePathRef createArcPathFromBottomOfRect(CGRect rect, CGFloat arcHeight) {
  CGRect arcRect = CGRectMake(rect.origin.x, rect.origin.y + rect.size.height
    - arcHeight, rect.size.width, arcHeight);
  CGFloat arcRadius = (arcRect.size.height/2) + (pow(arcRect.size.width, 2) /
    (8 * arcRect.size.height));
  CGPoint arcCenter = CGPointMake(arcRect.origin.x + arc.size.width/2,
    arcRect.origin.y + arcRadius);
  CGFloat angle = acos(arcRect.size.width/ (2*arcRadius));
  CGFloat startAngle = radians(180) + angle;
  CGFloat endAngle = radians(360) - angle;
  CGMutablePathRef path = CGPathCreateMutable();
  CGPathAddArc(path, NULL, arcCenter.x, arcCenter.y, arcRadius, startAngle,
    endAngle, 0);
  return path;
}

如果在我的图像底部描绘的其他情况下如何计算角度?

2 个答案:

答案 0 :(得分:9)

我发现更容易使用弧线的方法是:

void CGContextAddArcToPoint (
   CGContextRef c,
   CGFloat x1,
   CGFloat y1,
   CGFloat x2,
   CGFloat y2,
   CGFloat radius
);

如果你从Ray Wenderlich的网站(https://www.raywenderlich.com/33330/core-graphics-tutorial-glossy-buttons)看这个图像,点(x1,y1)是曲线的起点,点(x2,y2)是你的终点。然后只需指定角半径和瞧!看起来这可能是一个更容易使用的API,用于您想要做的事情。

答案 1 :(得分:0)

您需要至少3个点才能确定一个圆圈。

在你的第一个Senario中,两个点位于rect的底部,顶部中间点隐含地是arcHeight已知的第三个点。因此,三个点确定了圆,从而确定了圆弧。所以可以计算所有角度等。

然而,在你的第二个事件中,没有定义第三点。因此,您可以绘制无数个弧,这些弧穿过具有不同曲率的两个点。您需要额外的要求来修复弧。例如,半径或第三点应该是弧的一个。