2012-08-07 181 views
0

我想在固定大小的圆的中心画线。请检查图像,它会解释一切。我在圈子的边界有P1的中心和P2。 P1将始终保持固定,P2将随着鼠标移动而不断变化,并且它将成为圆圈边界上的任意点。现在,我想绘制绿色固定长度的线。我想找到具有固定距离的(x1,y1)和(x2,y2),每当P2发生变化时,我想绘制面向P2的绿线。在圆的中心绘制线,角度在objective-c

enter image description here

希望,形象说明了一切,总之我需要以下。

  1. P1和P2之间的角度。
  2. 用圆心中心的角度绘制固定距离的绿线。

感谢

回答

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

根据您的问题,两者之间的角度总是垂直 - 90˚或π/ 2弧度。您可以使用atan2()获得红色线段的角度;然后减去M_PI_2为绿色的角度。

从那里,你试图找到一个圆的圆周上的两个点,其直径是段的长度。你可以考虑一下这款极坐标(R,THETA)并转换为笛卡尔(X,Y):

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

添加M_PItheta拿到另一个端点。