在objective-c中以角度绘制圆心的线条

时间:2012-08-07 04:47:16

标签: objective-c geometry core-graphics

我想在固定大小的圆心处画线。请检查图像,它将解释一切。我有圆圈的P1中心和P2在圆圈边界的某个地方。 P1将始终保持固定,P2将随着鼠标移动而不断变化,它将成为圆圈边界的任意点。现在,我想绘制绿色显示固定长度的线条。我想找到固定距离的(x1,y1)和(x2,y2),每次P2变化,我想绘制面向P2的绿线。

enter image description here

希望,形象解释了一切,简而言之我需要关注。

  1. P1和P2之间的角度。
  2. 画一条固定距离的绿线,角度在圆心。
  3. 由于

2 个答案:

答案 0 :(得分:0)

由于您(显然)希望绿线垂直于红线,因此您无需计算p1和p2之间的角度。将矢量旋转90˚非常简单。

我假设你有p1和p2作为CGPoint(或NSPoint)变量。

首先让我们计算从p1到p2的向量:

CGPoint p1p2 = CGPointMake(p2.x - p1.x, p2.y - p1.y);

接下来,我们将计算垂直于p1-> p2向量的向量:

CGPoint p1p2Perp = CGPointMake(p1p2.y, -p1p2.x);

现在让我们找到垂直向量的长度:

CGFloat radius = hypot(p1p2Perp.x, p1p2Perp.y);

请注意,如果圆的半径是常数,则可以使用它而不是计算它。如果您使用的是iOS,请使用hypotf代替hypot

所以现在我们可以“垂直化”垂直向量,使其长度为1,将其坐标除以其长度:

p1p2Perp.x /= radius;
p1p2Perp.y /= radius;

接下来,我们可以将其乘以所需绿线长度的一半。我假设您在名为greenLineLength的常量或变量中具有所需的绿线长度。

p1p2Perp.x *= greenLineLength / 2;
p1p2Perp.y *= greenLineLength / 2;

现在我们可以为绿线创建一条路径。我假设您的CGContextRef位于名为gc的变量中:

CGContextBeginPath(gc);
CGContextMoveToPoint(gc, p1.x - p1p2Perp.x, p1.y - p1p2Perp.y);
CGContextAddLineToPoint(gc, p1.x + p1p2Perp.x, p1.y + p1p2Perp.y);

你可以随心所欲地抚摸路径。例如:

CGContextSetRGBStrokeColor(gc, 0, 1, 0, 1);
CGContextSetLineWidth(gc, 2);
CGContextSetLineCap(gc, kCGLineCapRound);
CGContextStrokePath(gc);

答案 1 :(得分:0)

根据您的问题,两者之间的角度始终是垂直的 - 90°或π/ 2弧度。您可以使用atan2()获取红色部分的角度;然后减去M_PI_2的绿色角度。

从那里,你试图在圆周上找到两个点,直径是段的长度。您可以在极坐标(r,theta)中考虑这一点并转换为笛卡尔坐标(x,y):

x = (segment_length / 2) * cos(theta)
y = (segment_length / 2) * sin(theta)

M_PI添加到theta以获取另一个端点。