3

这是相当概念性的,我希望有人可以提供帮助。我有一个脚本,当您在其中插入坐标(x,y,从 0 -> 800)时,它将返回 3 个单独范围内的预绘制坐标列表。

即:我输入200,200。我收到以下各项的列表:半径为 25、半径为 60、半径为 150 内的地块。

如果您对上下文感到好奇/请使用代码:

        display(coords[n][1] + ", " + coords[n][2]);

    if(n==0){

    for(var i=0; i < data.length; i++) {
        var xs = 0;
        var xy = 0;
        xs = xPlot - data[i][0];
        ys = yPlot - data[i][1];
        xs = xs * xs;
        ys = ys * ys;

        distance = Math.sqrt(xs + ys);

        if (distance <= 25){
            display2(data[i][0] + ", " + data[i][1] + " - " + alliance);
        }
        else if(distance <= 60){
            display3(data[i][0] + ", " + data[i][1] + " - " + alliance);
        }
        else if(distance <= 150){
            display4(data[i][0] + ", " + data[i][1] + " - " + alliance);
        }
    }

很容易。

现在,当我输入另一组坐标时,会创建另一个多维数组,我想检查两个(嗯,6 个)圆内的相交点。

我想过使用数组进行检查。如果输入了 2 个坐标,并且在两个内(绿色)圆内都找到了一个点,则 a = [g,g]。如果在一个内部找到一个点,但在另一个的中间(蓝色),设置 a = [g,b] 你明白了。红色是外圈。

当输入 3 个坐标时,事情变得更加棘手。假设一个点在两个内线和一个中线之内。那么 a = [g,g,b]。3 个列表的目的是将返回的值按从最佳到最差的组进行组织。因此,在具有 4 个输入的示例中,列表将按以下方式组织:

清单 1 / 清单 2 / 清单 3
gggg / gggb / bbbr
------- / ggbb / bbrr
------- / gbbb / brrr
------- / bbbb / rrrr

我将如何以可扩展的方式构建检查我的数组,所以如果我有 5 个输入,我就能够将我的结果放在适当的列中?

到目前为止,我已经开始这样做了:

else if(n>0){

    for(var i=0; i < data.length; i++) {
        for(var j=0; j < coords.length; j++) {
            var xs = 0;
            var ys = 0;
            xs = coords[j][1] - data[i][0];
            ys = coords[j][2] - data[i][1];
            xs = xs * xs;
            ys = ys * ys;
            distance = Math.sqrt(xs + ys);

            if (distance <= 25){
                a[j] = [,[g]];
                }
            else if (distance <= 60){
                a[j] = [,[b]];
                }
            else if (distance <= 150){
                a[j] = [,[r]];
                }
        }
        if($.inArray('g', a) && (!($.inArray('b', a)))){
            display2(data[i][0] + ", " + data[i][1] + " - " + alliance);

}

如果 a 包含 g 但不包含 b,则最后一行会执行吗?(jquery)我在正确的轨道上吗?

4

2 回答 2

3

与其将出现的次数作为数组中的一个项目放在一个圆圈内,不如计算一个长度与圆圈数相同的数组中出现的次数。即代替[g,g,g,g,b,b,r,r,r,r,r,r,r],使用[4,2,7]。这样,您在添加项目时不必保持数组排序,您只需递增正确的项目。

这也使得根据相关性对结果进行排序变得容易。您可以通过将数组视为一个数字来为数组创建一个数值,其底数与数据坐标的数量相同。IE:

var n = arr[0] * data.length * data.length + arr[1] * data.length + arr[2];

对于 10 个数据坐标,该数组[4,2,7]将获得值 427,从而可以轻松地将其与[3,5,0]将获得值 350 的数组进行比较。

您可以将数组计算为:

for(var i=0; i < coords.length; i++) {
  var arr = [0, 0, 0];
  for(var j=0; j < data.length; j++) {
    var xs = coords[i][1] - data[j][0];
    var ys = coords[i][2] - data[j][1];
    distance = Math.sqrt(xs * xs + ys * ys);
    if (distance <= 25) {
      arr[0]++;
    } else if (distance <= 60) {
      arr[1]++;
    } else if (distance <= 150) {
      arr[2]++;
    }
  }
  coords[i].arr = arr;
  coords[i].value = arr[0] * data.length * data.length + arr[1] * data.length + arr[2];
}

现在您可以对值的坐标进行排序:

coords.sort(function(a, b){
  return a.value - b.value;
});
于 2013-01-13T01:46:42.980 回答
0

这是我想出的解决方案。它完全符合我的需要,同时显示在适当位置找到的坐标。

http://pastehtml.com/view/cowibn4bs.html看看我的劳动成果。

if(n==0){

    for(var i=0; i < data.length; i++) {
        var xs = 0;
        var xy = 0;
        xs = xPlot - data[i][0];
        ys = yPlot - data[i][1];
        xs = xs * xs;
        ys = ys * ys;

        distance = Math.sqrt(xs + ys);

        if (distance <= 25){
            display2(data[i][0] + ", " + data[i][1] + " - " + alliance);
        }
        else if(distance <= 60){
            display3(data[i][0] + ", " + data[i][1] + " - " + alliance);
        }
        else if(distance <= 150){
            display4(data[i][0] + ", " + data[i][1] + " - " + alliance);
        }
    }
    }

    else if(n>0){

    $('#msgs2').html('');
    $('#msgs3').html('');
    $('#msgs4').html('');


    for(var i=0; i < data.length; i++) {
        a = [];
        for(var j=0; j < coords.length; j++) {
            var xs = 0;
            var ys = 0;
            xs = coords[j][1] - data[i][0];
            ys = coords[j][2] - data[i][1];
            xs = xs * xs;
            ys = ys * ys;
            distance = Math.sqrt(xs + ys);

            if (distance <= 25){
                a[j] = 'g';
                }
            else if (distance <= 60){
                a[j] = 'b';
                }
            else if (distance <= 150){
                a[j] = 'r';
                }
            else{
                a[j] = 0;
            }

        }
        if($.inArray(0, a) > -1){
        }
        else if($.inArray("g", a) > -1 && $.inArray("b", a) === -1){
            if($.inArray("r", a) === -1){
                display2(data[i][0] + ", " + data[i][1] + " - " + alliance);
            }
        }
        else if($.inArray("b", a) > -1 && $.inArray("r", a) === -1){
            display3(data[i][0] + ", " + data[i][1] + " - " + alliance);
        }
        else if($.inArray("r", a) > -1){
            display4(data[i][0] + ", " + data[i][1] + " - " + alliance);
        }
    }               

    }
    n++;
于 2013-01-13T03:22:58.330 回答