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;
}

所以这需要与其他代码集成。

我怎样才能做到这一点?我可以将函数传递一条线,也可以只传递一个点。

如果传递了一行,那么我们将运行上述函数。我希望它返回一个数组。如果数组中的第一项靠近它(在红色区域中),它将返回,如果线段切割线,则数组中的第二项将返回。这意味着如果它只是一个点,那么第二项将永远是错误的。

问题

如何判断一条线或点是否位于红色区域内?

4

2 回答 2

7

引用我对这个问题的回答

第一步是找到点在直线上的法线投影。这其实很简单:取点 1 到目标的距离,点 2 到目标的距离,分别称它们为 D1 和 D2。然后计算D1+(D2-D1)/2。这是从点 1 到直线上投影点的距离。

您现在可以找到该点,并获得从该点到目标的距离。如果距离为零,则目标正好在线上。如果距离小于 5,则目标距离小于 5px,以此类推。

编辑:一张照片值一千字。这是一个图表:

图表
(来源: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 回答