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

以objective-c中的角度在圆心处绘制线,objective-c,geometry,core-graphics,Objective C,Geometry,Core Graphics,我想在圆心画一条固定尺寸的线。请检查图片,它会解释一切。我有P1圆心,P2在圆的边缘。P1将始终保持不变,P2将随着鼠标移动而不断变化,它将是圆边界上的任何点。现在,我想画一条以绿色显示的固定长度的线。我想找到固定距离的(x1,y1)和(x2,y2),每当P2改变时,我想画一条面向P2的绿线 希望,图像解释了一切,总之我需要以下 P1和P2之间的角度 以固定距离绘制绿色线,角度位于圆的中心 谢谢因为您(显然)希望绿线与红线垂直,所以不需要计算p1和p2之间的角度。将矢量旋转90˚是非常简单的

我想在圆心画一条固定尺寸的线。请检查图片,它会解释一切。我有P1圆心,P2在圆的边缘。P1将始终保持不变,P2将随着鼠标移动而不断变化,它将是圆边界上的任何点。现在,我想画一条以绿色显示的固定长度的线。我想找到固定距离的(x1,y1)和(x2,y2),每当P2改变时,我想画一条面向P2的绿线

希望,图像解释了一切,总之我需要以下

  • P1和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弧度。您可以使用获取红色线段的角度;然后减去绿色的角度
    M_PI_2

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

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

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