我想在固定大小的圆心画线。请检查图像,它将解释一切。我有 P1 圆心和 P2 在圆的边界某处。P1 将始终保持固定,P2 将随着鼠标移动而不断变化,它将是圆边界上的任何点。现在,我想绘制以绿色显示的固定长度的线。我想找到具有固定距离的 (x1,y1) 和 (x2,y2),每次 P2 改变时,我都想画一条朝向 P2 的绿线。
希望,图像解释了一切,简而言之,我需要关注。
- P1 和 P2 之间的角度。
- 在圆心处以一定的角度绘制具有固定距离的绿线。
谢谢
我想在固定大小的圆心画线。请检查图像,它将解释一切。我有 P1 圆心和 P2 在圆的边界某处。P1 将始终保持固定,P2 将随着鼠标移动而不断变化,它将是圆边界上的任何点。现在,我想绘制以绿色显示的固定长度的线。我想找到具有固定距离的 (x1,y1) 和 (x2,y2),每次 P2 改变时,我都想画一条朝向 P2 的绿线。
希望,图像解释了一切,简而言之,我需要关注。
谢谢
由于您(显然)希望绿线垂直于红线,因此您不需要计算 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);
根据您的问题,两者之间的角度始终是垂直的——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
获取另一个端点。