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の係数(平均)を削除したことに注意してください。これは角度を変更しないためです。

更新:このメソッドは、周囲の2点間の最短円弧上の中点を常に検出します。それはあなたが必要とするものかもしれないし、そうでないかもしれません。

于 2012-07-26T18:23:37.030 に答える
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)as と呼ぶ必要があります。はこの用途向けに設計されており、x=0 の場合のエラーを回避し、より正確な結果が得られる可能性があります。atan2(y, x)atan(y/x)atan2

于 2012-07-26T18:12:49.910 に答える