在地图中为区域生成随机点?

时间:2014-08-11 12:18:45

标签: javascript jquery html5 canvas svg

我必须在地图中生成随机点/标记,该标记不应位于特定国家/地区之外。

对于canvas,我发现了以下示例

http://jsfiddle.net/6cFfU/3/

var  markerPositions = [[225,175], [75,275], [150,225], [400,125], [300,300]];

var svgNS = "http://www.w3.org/2000/svg";
var xlinkNS = "http://www.w3.org/1999/xlink";

for (var i=0; i<markerPositions.length; i++) {
    // Create an SVG <use> element
    var  use = document.createElementNS(svgNS, "use");
    // Point it at our pin marker (the circle)
    use.setAttributeNS(xlinkNS, "href", "#pin");
    // Set it's x and y
    use.setAttribute("x", markerPositions[i][0]);
    use.setAttribute("y", markerPositions[i][1]);
    // Add it to the "markers" group
    document.getElementById("markers").appendChild(use);
}

它添加了标记但我必须生成随机标记并检查它不应该在形状/区域之外。

有没有办法检测随机点是否在外面?由于上面的样本形状简单,但地图会有不同的角/多边形?

1 个答案:

答案 0 :(得分:0)

首先,计算边界框矩形。
然后在该矩形内生成随机点。

x ==>  rand(x_min,x_max)
y ==> rand (y_min, y_max)

然后检查点是否在多边形中,如果是,则添加。
虽然不是numMatchingPoints&lt; numPointsMustHave ==&gt;重复

你可以检查一个点是否在这样的非重叠的n-Vertex-Polygon中(C-Code):

int pnpoly(int nvert, float *vertx, float *verty, float testx, float testy)
{
  int i, j, c = 0;
  for (i = 0, j = nvert-1; i < nvert; j = i++) {
    if ( ((verty[i]>testy) != (verty[j]>testy)) &&
     (testx < (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]) )
       c = !c;
  }
  return c;
}

这称为光线投射算法 该算法射线投射到右侧。
在每次迭代中,它都会针对多边形的一个边缘测试测试点。

如果点的y-coord在边缘范围内,则第一个if语句成功。
第二个条件检查测试点是否在行左侧

如果两者都为真,则从测试点向右绘制的线穿过该边缘。

通过反复反转c的值,算法计算向右线穿过多边形的次数。

如果它经过奇数次,则该点在多边形内;
如果它经过偶数次,则该点在多边形之外。

另见: http://en.wikipedia.org/wiki/Point_in_polygon