我正在寻找一些关于如何找到弧线中点的帮助。我有起点和终点,圆心和半径。我在网上到处搜索,无法找到我可以在任何地方转换成代码的答案。如果有人有任何想法,请告诉我。以下图片是我想要找到的(假设已经找到了圆心)。
答案 0 :(得分:2)
平均值为x1的Atan2(),x2和y1的平均值,y2给出了与中点的角度。因此,弧的中点为:
double c=Math.Atan2(y1+y2, x1+x2);
double x_mid=R*Math.Cos(c);
double y_mid=R*Math.Sin(c);
请注意,我从两个参数中删除了因子1/2(平均值),因为这不会改变角度。
更新:此方法将始终在周边两点之间的最短弧上找到中点。这可能是你需要的也可能不是。
答案 1 :(得分: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时的错误,并可提供更准确的结果。
答案 2 :(得分: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;
}