4

我正在寻找有关如何找到弧线中点的帮助。我有起点和终点、圆心和半径。我在网上到处搜索,找不到可以在任何地方转换成代码的答案。如果有人有任何想法,请告诉我。下图是我试图找到的(假设已经找到了圆心)。

找到中点?

4

3 回答 3

2

x1,x2 的平均值和 y1,y2 的平均值的 Atan2() 为您提供到中点的角度。因此,圆弧的中点为:

double c=Math.Atan2(y1+y2, x1+x2);
double x_mid=R*Math.Cos(c);
double y_mid=R*Math.Sin(c);

请注意,我从 Atan2 的两个参数中删除了 1/2 因子(平均值),因为这不会改变角度。

更新:此方法将始终在周长上两点之间的最短弧上找到中点。这可能是也可能不是你需要的。

于 2012-07-26T18:23:37.030 回答
0

尽管此函数返回一个近似点,但它对于实际目的很有用。我自己想出了这个,效果很好。

先决条件:
- 此处假设圆弧中心为 (0, 0),尽管可以将其修改为使用圆心参数
- 您必须知道圆弧开始的角度(例如 270)
- 您必须知道测量值圆弧的角度(例如 90 度)

下面的代码是用 Objective-C 编写的:

#define   DEGREES_TO_RADIANS(degrees)  ((M_PI * degrees)/ 180)
- (CGPoint)getApproximateMidPointForArcWithStartAngle:(CGFloat)startAngle andDegrees:(CGFloat)degrees {

CGFloat midPointDegrees = fmodf(startAngle + degrees / 2, 360);
CGFloat midStartAngle = midPointDegrees - .1f;
CGFloat midEndAngle = midPointDegrees + .1f;

UIBezierPath *midPointPath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(0, 0) radius:self.radius startAngle:DEGREES_TO_RADIANS(midStartAngle) endAngle:DEGREES_TO_RADIANS(midEndAngle) clockwise:YES];

CGRect midPointPathFrame = CGPathGetPathBoundingBox(midPointPath.CGPath);
CGPoint approximateMidPointCenter = CGPointMake(CGRectGetMidX(midPointPathFrame), CGRectGetMidY(midPointPathFrame));
return approximateMidPointCenter;
}
于 2013-07-21T23:23:05.910 回答
0

取终点。

(x1, y1), (x2, y2)

围绕圆心对它们进行标准化。然后转换为极性。

(r, theta1), (r, theta2)

半径将是相同的。圆弧的中心是

(r, (theta2 + theta1) / 2)

转换为笛卡尔坐标并添加中心的坐标。

编辑:是这样的:

def Point CenterOfArc(Point start, end, center)
    let (x1, y1) = (start.x - center.x, start.y - center.y)
    let (x2, y2) = (end.x   - center.x, end.y   - center.y)

    let (r1, theta1) = (sqrt(x1^2 + y1^2), atan(y1/x1))
    let (r2, theta2) = (sqrt(x2^2 + y2^2), atan(y2/x2))
    if (theta1 > theta2) theta2 += 2 * pi

    let (r, theta) = ((r1 + r2) / 2, (theta1 + theta2) / 2) // averaging in case of rounding error

    let (x, y) = (r * cos(theta), r * sin(theta))

    return (x + center.x, y + center.y)
end

EDIT2:当您转换为极坐标时,您需要确保 theta2 > theta1,否则就好像弧是向后的。

EDIT3:另外,tan<sup>-1</sup>(y/x)是正确的操作,但对于许多语言,您应该将其称为atan2(y, x)而不是atan(y/x). atan2专为此用途而设计,它在 x=0 时避免了错误,并且可能会给出更准确的结果。

于 2012-07-26T18:12:49.910 回答