線が円の中にあるかどうかを調べるために、ここにこのコードがあります。(おそらく、これを使用して答えを基にすることができます)
/**
*@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 になります。
質問
線または点が赤い領域内にあるかどうかを確認するにはどうすればよいですか?