点(pX、pY)と、既知の中心(cX、cY)および半径(r)を持つ円が与えられた場合、(pX、 pY)?
ある種のコードが機能していますが、円を(x --cX)^ 2 +(y --cY)^ 2 = r ^ 2(rは半径)の形式の方程式に変換し、方程式を使用する必要があります。解くべき二次方程式を作成するために、点(pX、pY)から(cX、cY)までの線を計算します。
バグを修正すれば解決しますが、それは非常に洗練されていない解決策のようです。
点(pX、pY)と、既知の中心(cX、cY)および半径(r)を持つ円が与えられた場合、(pX、 pY)?
ある種のコードが機能していますが、円を(x --cX)^ 2 +(y --cY)^ 2 = r ^ 2(rは半径)の形式の方程式に変換し、方程式を使用する必要があります。解くべき二次方程式を作成するために、点(pX、pY)から(cX、cY)までの線を計算します。
バグを修正すれば解決しますが、それは非常に洗練されていない解決策のようです。
ここで、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 次元以上に簡単に拡張できます。
中心から点まで線を引き、そのグラフが円と交差するところを計算しますoOそれほど難しくないと思います
最初に数学的に解いてから、コードに変換します。ポイントと円の端の間の最短線もその中心を通過することに注意してください (@litb で述べられているように)。
最短距離の点は、中心と入力点を通る円と線の交点にあります。また、中心点、入力点、出力点は直線上にあります
中心を (xc, yc) とし、入力 (xi, yi) からの最短点を (x,y) とすると、sqrt((xc-x)^2 + (yc-y)^2) = r
中心点、入力点、および出力点は直線上にあるため、これらの 2 つの点のいずれかの間で計算された勾配は同じである必要があります。
(yc-yi)/(xc-xi) = (y-yc)/(x-xc)
4. 方程式 2 と 3 を解くと、最短ポイントが得られます。
関数をトリガーし、rを乗算し、必要に応じてpXまたはpYを追加します。
円の中心を原点として扱い、(pX, pY) の座標を極座標に変換し、(theta, r') r' を元の円の r に置き換えて、デカルト座標に戻します (原点を調整します)。
あなたは最短のコードを求めたので、ここにあります。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 は円での結果です。
どこかで間違いを犯したと確信しています。誰かが何かを見つけたらコメントを残してください。もちろん、それは退化しています。一方の答えはあなたの主張から最も遠く、もう一方の答えは最も近いです。
絵の観点から考えて、簡単にコードに変換する簡単な方法: 中心から点までのベクトル (pX - cX、pY - cY) を取ります。その長さ sqrt(blah blah blah) で割り、半径を掛けます。これを (cX, cY) に追加します。