我必须在地图中生成随机点/标记,该标记不应位于特定国家/地区之外。
对于canvas,我发现了以下示例
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);
}
它添加了标记但我必须生成随机标记并检查它不应该在形状/区域之外。
有没有办法检测随机点是否在外面?由于上面的样本形状简单,但地图会有不同的角/多边形?
答案 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的值,算法计算向右线穿过多边形的次数。
如果它经过奇数次,则该点在多边形内;
如果它经过偶数次,则该点在多边形之外。