今、私は同様の質問がされていることを知っています。しかし、答えのどれも、私が必要とする結果を見つけるのには役に立たなかった。処理:線と円の交点の距離
状況は以下の通り:
我々はlx
、ly
として与えられたポイント・オブ・オリジン(PO)とのラインを、持っています。 POを終了するという行のためにangle
もあります。ここで、0°は右に水平を意味し、正の度は時計回りに平均を意味します。 angle
は[0;360[
です。さらに、無限に長くないので、行の長さはlen
です。
また、与えられた中心点(CP)を持つ円があり、cx
,cy
として与えられます。半径はcr
となります。
これらの数値をパラメータとしてとり、POと線と円の最も近い交差点の距離を返します。交差点がない場合は-1を返します。
私の現在のアプローチは、次のされています
float getDistance(float lx, float ly, float angle, float len, float cx, float cy, float cr) {
float nlx = lx - cx;
float nly = ly - cy;
float m = tan(angle);
float b = (-lx) * m;
// a = m^2 + 1
// b = 2 * m * b
// c = b^2 - cr^2
float[] x_12 = quadraticFormula(sq(m) + 1, 2*m*b, sq(b) - sq(cr));
// if no intersections
if (Float.isNaN(x_12[0]) && Float.isNaN(x_12[1]))
return -1;
float distance;
if (Float.isNaN(x_12[0])) {
distance = (x_12[1] - nlx)/cos(angle);
} else {
distance = (x_12[0] - nlx)/cos(angle);
}
if (distance <= len) {
return distance;
}
return -1;
}
// solves for x
float[] quadraticFormula(float a, float b, float c) {
float[] results = new float[2];
results[0] = (-b + sqrt(sq(b) - 4 * a * c))/(2*a);
results[1] = (-b - sqrt(sq(b) - 4 * a * c))/(2*a);
return results;
}
をしかし、望んだ通りの結果ではありません。時々私は距離を返しますが、それはまれですが、交差点が発生しないことさえあります。ほとんどの場合、交点は返されませんが、1つあるはずです。
ご協力いただければ幸いです。
EDIT:
私は、MBOの答えに対する解決策のおかげで見つけることができました。
float nlx = lx - cx;
float nly = ly - cy;
float dx = cos(angle);
float dy = sin(angle);
float[] results = quadraticFormula(1, 2*(nlx*dx + nly*dy), sq(nlx)+sq(nly)-sq(cr));
float dist = -1;
if (results[0] >= 0 && results[0] <= len)
dist = results[0];
if (results[1] >= 0 && results[1] <= len && results[1] < results[0])
dist = results[1];
return dist;