2017-01-22 7 views
1

今、私は同様の質問がされていることを知っています。しかし、答えのどれも、私が必要とする結果を見つけるのには役に立たなかった。処理:線と円の交点の距離

状況は以下の通り:

我々はlxlyとして与えられたポイント・オブ・オリジン(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; 

答えて

3

は、NLY、我々は線分のパラメトリック方程式を構築することができ、あなたのNLXを使用

dx = Cos(angle) 
dy = Sin(Angle) 
x = nlx + t * dx 
y = nly + t * dy 

条件:多分誰かがそれによって助けすることができます - ここに私の仕上げgetDistance(...) -functionのコンテンツがあります円との交点の数:

(nlx + t * dx)^2 + (nly + t * dy)^2 = cr^2 
t^2 * (dx^2 + dy^2) + t * (2*nlx*dx + 2*nly*dy) + nlx^2+nly^2-cr^2 = 0 

したがって、未知パラメータtの二次方程式は

a = 1 
b = 2*(nlx*dx + nly*dy) 
c = nlx^2+nly^2-cr^2 

解決策tが範囲0..lenにあるかどうかを調べます。