Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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_Recursion_Geometry - Fatal编程技术网

Javascript 递归地在数组中的点之间添加中点

Javascript 递归地在数组中的点之间添加中点,javascript,arrays,recursion,geometry,Javascript,Arrays,Recursion,Geometry,我试图创建一个函数,它获取数组中的所有点,并返回一个数组,在每对相邻点之间有一个额外的点。例如,从(2,10)开始,我将获得列表中的以下迭代: (2, 14) (2, 8, 14) (2, 5, 8, 11, 14) (2, 3.5, 5, 6.5, 8, 9.5, 11, 12.5, 14) 我的代码: var宽度=1000 可变高度=1000 const svg=document.getElementById('svg1') setAttribute('width',width) svg

我试图创建一个函数,它获取数组中的所有点,并返回一个数组,在每对相邻点之间有一个额外的点。例如,从(2,10)开始,我将获得列表中的以下迭代:

(2, 14)
(2, 8, 14)
(2, 5, 8, 11, 14)
(2, 3.5, 5, 6.5, 8, 9.5, 11, 12.5, 14)
我的代码:

var宽度=1000
可变高度=1000
const svg=document.getElementById('svg1')
setAttribute('width',width)
svg.setAttribute('height',height)
var seg=功能(点){
var段=document.createElements(“http://www.w3.org/2000/svg“,”圆圈“)
段.setAttribute(“cx”,点.x)
段.setAttribute(“cy”,点.y)
段.setAttribute(“r”,1)
segment.setAttribute(“填充”、“无”)
segment.setAttribute('stroke',“#f00”)
segment.setAttribute('stroke-width',0.5)
svg.appendChild(段)
}
常数mid=函数(pa,pb){
设cx=(pa.x+pb.x)/2
设cy=(pa.y+pb.y)/2
返回{
x:cx,
y:cy
}
}
var testarray=[{
x:0,,
y:100
}, {
x:400,
y:50
}]
常量拆分=函数(a){
设b=[]
设c=[]
对于(i=0;i

问题在于您在迭代列表时正在修改列表。住手!:-)


创建从原始列表生成的第二个列表,并返回第二个列表。或者,您可以尝试以相反的顺序进行迭代,但这会使您依赖于拼接语义,这仍然是一种危险的做法。

问题是,您在迭代列表时正在修改列表。住手!:-)


创建从原始列表生成的第二个列表,并返回第二个列表。或者,您可以尝试以相反的顺序进行迭代,但这会使您依赖于拼接语义,这仍然是一种危险的做法。

问题是,当您向数组添加项时,数组的形状会发生变化,但是
i
上的循环没有考虑到这一点。一个快速的解决方案是在拼接新值后增加
i
,就像在for循环中一样

 const split = function(a){
    for(i=0;i<a.length-1;i++){
        let b = mid(a[i],a[i+1])
        a.splice(i+1,0,b)
        i++
        if(a.length>100){return}
    }
 }
const split=函数(a){
对于(i=0;i100){return}
}
}

问题在于,当您向数组中添加项目时,数组的形状会发生变化,但是
i
上的循环没有考虑到这一点。一个快速的解决方案是在拼接新值后增加
i
,就像在for循环中一样

 const split = function(a){
    for(i=0;i<a.length-1;i++){
        let b = mid(a[i],a[i+1])
        a.splice(i+1,0,b)
        i++
        if(a.length>100){return}
    }
 }
const split=函数(a){
对于(i=0;i100){return}
}
}

尽管这不是一个好的做法。最好按照Prune的答案构建一个新的数组,而不是修改正在循环的数组。尽管这不是一个好的做法。最好按照Prune的答案构建一个新的数组,而不是修改正在循环的数组。您认为有没有一种方法可以将第二个列表与原始列表结合起来,而不需要排序函数?我想这可能是不可避免的;只需将它们插入第三个列表。A[0],B[0],A[1],B[1]。。。A[N]。结尾没有B[N],你认为有没有一种方法可以在不需要排序函数的情况下将第二个列表与原始列表结合起来?我想这可能是不可避免的;只需将它们插入第三个列表。A[0],B[0],A[1],B[1]。。。A[N]。结尾没有B[N]。