我在这里有这个代码,以确定一条线是否在一个圆圈内。 (也许你可以用这个作为答案)
/**
*@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,紫色线将返回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;
}
所以这需要与其他代码集成。
我该怎么做?我可以将函数传递给一行,或者我只能传递一个点。
如果传递了一行,那么我们将运行上述函数。我希望它返回一个数组。如果数组中的第一个项靠近它(在红色区域中),则该数组中的第一个项将返回,如果该段切割该行,则数组中的第二个项将返回。意思是如果它只是一个点,那么第二个项将永远是假的。
问题
如何确定线条或点是否位于红色区域内?
答案 0 :(得分:6)
引用我对this question
的回答第一步是找到点到线上的正常投影。这实际上非常简单:从第1点到目标的距离,从第2点到目标,分别称它们为D1和D2。然后计算D1+(D2-D1)/2
。这是从点1到线上投影点的距离。
您现在可以找到该点,并获得从该点到目标的距离。如果距离为零,则目标正好在线上。如果距离小于5,那么目标距离小于5px,依此类推。
编辑:一张图片胜过千言万语。这是一个图表:Diagram http://adamhaskell.net/img/schematic.png
(事后看来,可能应该让这些圈子变成不同的颜色......另外,紫色线应该与AB线垂直。用蓝线怪我可怕的目标!)
答案 1 :(得分:2)
你需要找到一个点到线的距离,d。
首先,获得与所讨论的原始线垂直的线的斜率。 (保持这个比例很方便:dx,dy
是原始斜率,dy,-dx
是垂直,其中dx是原始行中x的差异,dy是y的差异。原始行。)
要测试点p1,请获取原始线的交点(p2)和通过p1的垂线。换句话说,原始行与行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