【问题标题】:Generating random points in the map for a region?在地图中为区域生成随机点?
【发布时间】:2014-08-13 00:36:51
【问题描述】:

我必须在地图上生成不应该在特定国家之外的随机点/标记。

对于画布,我找到了以下示例

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

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

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

【问题讨论】:

  • 不要硬编码您的markerPositions 值,而是随机化每个值。您可以在生成它们之后以及将它们添加到数组之前检查该点是否在某个形状内。
  • 如何检查一个点是否具有特定形状?
  • 实际上取决于形状。对于像矩形或圆形这样的简单形状,它只需要一些简单/复杂的数学计算。对于奇怪的不规则形状,我真的不知道。

标签: javascript jquery html canvas svg


【解决方案1】:

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

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

然后检查该点是否在多边形中,如果是,则添加。
虽然不是 numMatchingPoints 重复

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

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 坐标在边的范围内,则第一个 if 语句成功。
第二个条件检查测试点是否在行的左侧

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

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

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

另请参阅: http://en.wikipedia.org/wiki/Point_in_polygon

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多