7

線が円の中にあるかどうかを調べるために、ここにこのコードがあります。(おそらく、これを使用して答えを基にすることができます)

/**
*@param l1  Line point 1, containing latitude and longitude
*@param l2  Line point 2, containing latitude and longitude
*@param c   Center of circle, containing latitude and longitud
*@param r   Radius of the circle
**/
Maps.ui.inCircle = function(l1, l2, c, r){
    var a = l1.lat() - l2.lat()
    var b = l1.lng() - l2.lng()
    var x = Math.sqrt(a*a + b*b)
    return (Math.abs((c.lat() - l1.lat()) * (l2.lng() - l1.lng()) - (c.lng() - l1.lng()) * (l2.lat() - l1.lat())) / x <= r);
}

これはそのために完璧に機能します。しかし今、点が線の周りの領域にあるかどうかを調べる必要があります。たとえば、この中の青い点は true を返し、紫色の線 I は true を返します。しかし、緑の線や点ではありません。また、線が線を通り抜けるかどうかを調べる必要があります。

ここに画像の説明を入力

線がこの線と交差するかどうかを確認するコードは次のとおりです。

function getLineIntersaction(y1,x1,y2,x2, y3,x3,y4,x4){
    if (Math.max(X1,X2) < Math.min(X3,X4)) // This means no same coordinates
        return false;  
    m1 = (y1-y2)/(x1-x2); 
    m2 = (y3-y4)/(x3-x4); 
    c1 = y1-m1x1; 
    c2 = y3-m2x3; 
    if(m1=m2)//segments are parallel.
        return false;
    var x = (c1-c2)/(m2-m1); 
    if(!isNaN(x) && isFinite(x)){
        if( x < Math.max(Math.min(x1,x2),math.min(x3,x4)) || x > Math.min(Math.max(x1,x2),Math.max(x3,x4)))
            return false;
        else
            return true;
    }
    return false;
}

したがって、これを他のコードと統合する必要があります。

これどうやってするの?関数を 1 行で渡すことも、1 つのポイントだけで渡すこともできます。

行が渡されると、上記の関数が実行されます。配列を返したい。配列の最初の項目は、その近く (赤い領域) にある場合に返され、配列の 2 番目の項目は、セグメントが線を切断した場合に返されます。つまり、それが単なる点である場合、2 番目の項目は常に false になります。

質問

線または点が赤い領域内にあるかどうかを確認するにはどうすればよいですか?

4

2 に答える 2

7

この質問に対する私の答えを引用する

最初のステップは、点の線への法線投影を見つけることです。これは実際には非常に単純です。ポイント 1 からターゲットまでの距離と、ポイント 2 からターゲットまでの距離を取り、それぞれを D1 および D2 と呼びます。次に計算しD1+(D2-D1)/2ます。これは、ポイント 1 から直線上に投影されたポイントまでの距離です。

その点を見つけて、その点からターゲットまでの距離を取得できます。距離がゼロの場合、ターゲットは正確に直線上にあります。距離が 5 未満の場合、ターゲットは 5 ピクセル未満でした。

編集: 百聞は一見にしかず。これが図です:

ダイアグラム
(出典: adamhaskell.net )

(後から考えると、おそらくこれらの円は別の色にするべきだったでしょう...また、紫色の線は線ABに垂直であるはずです.青い線で私のひどい狙いを非難してください!)

于 2013-01-28T01:32:45.337 に答える
2

点から線までの距離 d を求める必要があります。

まず、問題の元の線に垂直な線の傾きを取得します。(これを比率として保持すると便利です。dx,dyは元の勾配、dy,-dxは垂線です。ここで、dx は元の線の x の差、dy は元の線の y の差です。)

点 p1 をテストするには、元の線と p1 を通る垂線の交点 (p2) を取得します。言い換えれば、元の線と次の線とのp2交点(p2.x+dy, p2.y-dx)

p2 が元の線の端点の間にある場合、線までの距離 (d) は P1 と P2 の間の距離です。

P2 が元の線の端点の外側にある場合、線までの距離 (d) は、P1 から元の線の端点までの距離のうち短い方になります。

original line: points pq1 and pq2
point to measure: p1
distance to line: d

dx = pq2.x - pq1.x
dy = pq2.y - pq1.y

p2.x = p1.x + dy // get perpendicular, arbitrary length
p2.y = p1.y - dx

px = intersection(pq1-pq2, p1-p2)

if px.x is between pq1.x and pq2.x inclusive then // check y's instead if it's near vertical
  d = distance(p1-px)
else
  d = minimum(distance(p1, pq1), distance(p1, pq2))
end if
于 2013-01-27T22:49:13.287 に答える