Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将相邻线合并为单个阵列_Javascript_Arrays_Algorithm_Html5 Canvas - Fatal编程技术网

Javascript 将相邻线合并为单个阵列

Javascript 将相邻线合并为单个阵列,javascript,arrays,algorithm,html5-canvas,Javascript,Arrays,Algorithm,Html5 Canvas,我有一个包含一些Javascript对象的数组。每个对象实际上都是从画布元素中提取的水平线段。每个对象都具有属性“lowx”(线段的左x坐标)、“highx”(线段的右x坐标)和“yvalue”(直线段由于水平而占据的y坐标) 我需要一个将所有相邻线段合并到同一数组中的循环。下面是一个数组转换示例: 下面是运行此循环之前rowarray的示例: var rowarray = [ [{"lowx": 210, "highx": 212, "yvalue": 132}], [{"lowx": 208

我有一个包含一些Javascript对象的数组。每个对象实际上都是从画布元素中提取的水平线段。每个对象都具有属性“lowx”(线段的左x坐标)、“highx”(线段的右x坐标)和“yvalue”(直线段由于水平而占据的y坐标)

我需要一个将所有相邻线段合并到同一数组中的循环。下面是一个数组转换示例:

下面是运行此循环之前rowarray的示例:

var rowarray = [
[{"lowx": 210, "highx": 212, "yvalue": 132}],
[{"lowx": 208, "highx": 214, "yvalue": 133}],
[{"lowx": 207, "highx": 215, "yvalue": 134}],
[{"lowx": 207, "highx": 216, "yvalue": 135}],
[{"lowx": 206, "highx": 216, "yvalue": 136}],
[{"lowx": 206, "highx": 216, "yvalue": 138}],
[{"lowx": 205, "highx": 220, "yvalue": 139}],
[{"lowx": 199, "highx": 209, "yvalue": 140}]
]
在循环中运行之后,rowarray应该包含两个数组(因为有两组相邻的线段)。Y值为132-136的线段将在第一个数组中,Y值为138-140的线段应在第二个数组中

因此,rowarray将如下所示:

var rowarray = [
[{"lowx": 210, "highx": 212, "yvalue": 132},
{"lowx": 208, "highx": 214, "yvalue": 133},
{"lowx": 207, "highx": 215, "yvalue": 134},
{"lowx": 207, "highx": 216, "yvalue": 135},
{"lowx": 206, "highx": 216, "yvalue": 136}],

[{"lowx": 206, "highx": 216, "yvalue": 138},
{"lowx": 205, "highx": 220, "yvalue": 139},
{"lowx": 199, "highx": 209, "yvalue": 140}]

]
这是我拥有的代码,我认为它已经接近工作了,但还没有完全实现。通常情况下,这完全是不合逻辑的。存在空对象(不确定为什么?),不存在本应放置在同一数组中的线段

由于项目的性质,这需要在客户端javascript中完成。然而,JQuery的使用是很好的,并且是受欢迎的

var keepgoing=1;
var errorcounter=0;
while(keepgoing==1){
试一试{
hadtombine=0;
对于(var x=rowarray.length-1;x>=0;x--){
对于(var w=rowarray.length-1;w>=0;w--){
对于(var q=rowarray[x]。长度-1;q>=0;q--){
对于(var z=rowarray[w]。长度-1;z>=0;z--){
if((rowarray[x][q].yvalue==(rowarray[w][z].yvalue+1))| |(rowarray[x][q].yvalue==(rowarray[w][z].yvalue-1))){
如果((rowarray[x][q].highx>=rowarray[w][z].lowx)&(rowarray[x][q].highx=rowarray[w][z].lowx]&(rowarray[x][q].lowx=rowarray[w][z].lowx)和&(rowarray[x][q].highx=20000){keepgoing=10;}
}
希望我能很好地解释这一点——如果不发表评论,我会修改。这是我的第一篇文章(经过多年的潜伏),所以我希望我已经做得很好了


谢谢!

您可以通过使用简单的过滤器和映射方法来获得结果

var行数组=[
[{
“lowx”:210,
“highx”:212,
“yvalue”:132
}],
[{
“lowx”:208,
“高x”:214,
“yvalue”:133
}],
[{
“lowx”:207,
“高x”:215,
“yvalue”:134
}],
[{
“lowx”:207,
“高x”:216,
“yvalue”:135
}],
[{
“lowx”:206,
“高x”:216,
“yvalue”:136
}],
[{
“lowx”:206,
“高x”:216,
“yvalue”:138
}],
[{
“低x”:205,
“高x”:220,
“yvalue”:139
}],
[{
“lowx”:199,
“highx”:209,
“yvalue”:140
}]
]
常量组=[{
l:132,
h:136
},
{
l:138,
h:140
}
];
rowarray=rowarray.map(x=>x[0])
常数极限=(h,l,x)=>x.Y值极限(g.l,g.h,x)))
});

console.log(gg)
您还没有明确指定哪些段是“相邻的”,但似乎您需要类似的东西(使用段而不是单元格),并且需要实现一种生成


该问题也可以被视为计算几何中的矩形并集问题(通过并集查找和/或扫掠线方法解决)

对于以下代码,如果两个线段在x轴上相交,并且它们在相邻或相同的y值上,则这两个线段是相邻的

解决办法如下:

函数getAdjancets([x,…xs],r=[]){//x是第一项,xs是输入数组的其余部分。
函数相邻(a,b){
返回(a.lowxisAdjacent(a,b[0])?r[0].push(b[0]):r[1].push(b);
返回bs.length?groupBy(如concat(r[0]),bs,r)
:r;
}
var[as,bs]=xs.length?groupBy(x,xs):[[],[],//根据第一个元素对其余元素进行分组
cs=x.concat(as);//第一个元素及其相邻元素
返回bs.length?as.length?getAdjancets([cs].concat(bs),r)//如果找到相邻元素,则继续检查
:(r.push(cs),getAdjacents(bs,r))//如果不是,则将前面的邻接项推到结果中,并从剩余的邻接项开始
:(r.push(cs,r);//如果没有剩余的返回结果
}
var rowarray=[{“lowx”:210,“highx”:212,“yvalue”:132}],
[{“lowx”:208,“highx”:214,“yvalue”:133}],
[{“lowx”:207,“highx”:215,“yvalue”:134}],
[{“lowx”:207,“highx”:216,“yvalue”:135}],
[{“lowx”:206,“highx”:216,“yvalue”:136}],
[{“lowx”:206,“highx”:216,“yvalue”:138}],
[{“lowx”:205,“highx”:220,“yvalue”:139}],
[{“lowx”:199,“highx”:209,“yvalue”:140}]
];

console.log(getAdjancets(rowarray))
这一点都不清楚;现在发生了什么?有什么问题吗?请详细说明输入json和输出jsonneeded@user93请看最后两个代码片段。这是循环之前变量的内容,然后是循环之后的内容。没有真正改变JSON的内容,它是JUt数组得到重新组织然后删除问题中除数组转换和代码段之外的其他部分,因为它不是relevant@RachelGallen目前,相邻线段没有合并到同一个数组中。有些线段应该在同一个数组中,但不在循环之后。这适用于
    var keepgoing = 1;
    var errorcounter = 0;
    while (keepgoing == 1) {
        try {
            hadtocombine = 0;
            for (var x = rowarray.length-1; x >= 0; x--) {
                for (var w = rowarray.length-1; w >= 0; w--) {
                    for (var q = rowarray[x].length-1; q >= 0; q--) {
                            for (var z = rowarray[w].length-1; z >= 0; z--) {
                                if ((rowarray[x][q].yvalue == (rowarray[w][z].yvalue + 1)) || (rowarray[x][q].yvalue == (rowarray[w][z].yvalue - 1))) {
                                    if ((rowarray[x][q].highx >= rowarray[w][z].lowx) && (rowarray[x][q].highx <= rowarray[w][z].highx)) {
                                        rowarray.splice(w,1);
                                        rowarray.splice(x,1);
                                        rowarray.push(rowarray[x].concat(rowarray[w]));
                                        hadtocombine = 1;
                                    }
                                    else if ((rowarray[x][q].lowx >= rowarray[w][z].lowx) && (rowarray[x][q].lowx <= rowarray[w][z].highx)) {
                                        rowarray.splice(w,1);
                                        rowarray.splice(x,1);
                                        rowarray.push(rowarray[x].concat(rowarray[w]));
                                        hadtocombine = 1;
                                    }
                                    else if ((rowarray[x][q].highx >= rowarray[w][z].highx) && (rowarray[x][q].lowx <= rowarray[w][z].lowx)) {
                                        rowarray.splice(w,1);
                                        rowarray.splice(x,1);
                                        rowarray.push(rowarray[x].concat(rowarray[w]));
                                        hadtocombine = 1;
                                    }
                                    else if ((rowarray[x][q].lowx >= rowarray[w][z].lowx) && (rowarray[x][q].highx <= rowarray[x][q].highx)) {
                                        rowarray.splice(w,1);
                                        rowarray.splice(x,1);
                                        rowarray.push(rowarray[x].concat(rowarray[w]));
                                        hadtocombine = 1;
                                    }
                                }
                            }
                    }
                }
            }
            if (hadtocombine == 0) { 
                keepgoing = 0;
            }
        } catch (err) { errorcounter++; if(errorcounter >= 20000) { keepgoing = 10; } }
    }