web-dev-qa-db-ja.com

与えられた点に最も近い円上の点を見つける最良の方法

点(pX、pY)と既知の中心(cX、cY)と半径(r)を持つ円が与えられた場合、(pX、 pY)?

いくつかのコードが機能していますが、円を(x-cX)^ 2 +(y-cY)^ 2 = r ^ 2(rは半径)という形の方程式に変換し、方程式を使用します点(pX、pY)から(cX、cY)への直線を解いて、解く2次方程式を作成します。

一度バグを修正すれば問題は解決しますが、そのような洗練されていない解決策のようです。

36
Matt Mitchell

ここで、Pは点、Cは中心、Rは適切な「数学」言語の半径です。

V = (P - C); Answer = C + V / |V| * R;

ここで| V | Vの長さです。

わかった、わかった

double vX = pX - cX;
double vY = pY - cY;
double magV = sqrt(vX*vX + vY*vY);
double aX = cX + vX / magV * R;
double aY = cY + vY / magV * R;

2次元以上に拡張するのは簡単です。

63
Mike Dunlavey

中心から点に線を引き、そのグラフが円と交差するところを計算します。

最初にそれを数学的に解決してから、コードに変換します。点と円のエッジの間の最短線もその中心を通過することに注意してください(@litbで述べられています)。

3
Daniel Spiewak
  1. 最短距離の点は、中心と入力点を通る円周と線の交点にあります。また、中心点、入力点、出力点は直線上にあります

  2. 中心を(xc、yc)とし、入力からの最短点(xi、yi)を(x、y)とすると、sqrt((xc-x)^ 2 +(yc-y)^ 2)= r

  3. 中心点、入力点、出力点は直線上にあるため、これらの点のいずれかの間で計算された勾配は同じでなければなりません。

(yc-yi)/(xc-xi)=(y-yc)/(x-xc)

4.方程式2と3を解くと、最短のポイントが得られます。

2
user830818

関数をトリガーし、rを掛け、必要に応じてpXまたはpYを追加します。

1

円の中心を原点として扱い、(pX、pY)の座標を極座標に変換します(theta、r ')r'を元の円のrで置き換え、デカルト座標(原点を調整します)。

1
Rob Walker

あなたは最短のコードを求めたので、ここにあります。 4行で実行できますが、まだ2次式があります。ポイントは円の外側にあると考えました。ポイントが円の中心の真上または真下、つまりcX = pXである場合に何が起こるかは考慮していません。

m=(cY-pY)/(cX-pX);  //slope
b=cY-m*cX;  //or Py-m*Px.  Now you have a line in the form y=m*x+b
X=(  (2mcY)*((-2*m*cY)^2-4*(cY^2+cX^2-b^2-2*b*cY-r^2)*(-1-m^2))^(1/2)  )/(2*(cY^2+cX^2-b^2-2*bc*Y-r^2));
Y=mX+b;

1]点と円の中心を結ぶ線の方程式を取得します。

2]中心から1半径の距離だけ線に沿って移動し、円上の点を見つけます。つまり:radius = a ^ 2 + b ^ 2つまり、r =((cY-Y)+(cX-X))^(1/2)

3]二次的に解きます。 X = quadratic_solver(r =((cY-Y)+(cX-X))^(1/2)、X)Y = m * X + bに置き換えると、上記のような地獄ができます。

4] XとYはサークルの結果です。

私はどこかで間違いを犯したと確信しています。誰かが何かを見つけた場合はコメントを残してください。もちろんそれは縮退しており、1つの答えはあなたのポイントから最も遠く、もう1つの答えは最も近いです。

1
Alex

絵の観点から考えるのが簡単で、コードに変換するのも簡単です。ベクトル(pX-cX、pY-cY)を中心から点に移動します。その長さsqrt(何とか何とか何とか)で割り、半径を掛けます。これを(cX、cY)に追加します。

1
Mike Kantor