Создается не копия а ссылка массиве

У меня есть код симуляции атмосферы.Я начал его улучшать и в етот момент появилась проблема.А точнее работа кода никак не изменилась. Вот код. index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>AtmosSim</title>
</head>
<body>
    <canvas  width="640" height="640"></canvas>
    <script src="main.js"></script>
</body>
</html>

main.js

var canvas = document.querySelector("canvas")
var ctx = canvas.getContext("2d")


var atmosArray=[[0,0,0,0,0,0,0,0,0,0],
                [0,0,0,0,0,0,0,0,0,0],
                [0,0,0,0,0,0,0,0,0,0],
                [0,0,0,0,0,0,0,0,0,0],
                [0,0,0,0,0,100,0,0,0,0],
                [0,0,0,0,0,0,0,0,0,0],
                [0,0,0,0,0,0,0,0,0,0],
                [0,0,0,0,0,0,0,0,0,0],
                [0,0,0,0,0,0,0,0,0,0],
                [0,0,0,0,0,0,0,0,0,0]]


var atmosArrayAdv=[[{},{},{},{},{},{},{},{},{},{}],
                   [{},{},{},{},{},{},{},{},{},{}],
                   [{},{},{},{},{},{},{},{},{},{}],
                   [{},{},{},{},{},{},{},{},{},{}],
                   [{},{},{},{},{},{},{},{},{},{}],
                   [{},{},{},{},{},{},{},{},{},{}],
                   [{},{},{},{},{},{},{},{},{},{}],
                   [{},{},{},{},{},{},{},{},{},{}],
                   [{},{},{},{},{},{},{},{},{},{}],
                   [{},{},{},{},{},{},{},{},{},{}]]
var atmosArrayOld=[[0,0,0,0,0,0,0,0,0,0],
                [0,0,0,0,0,0,0,0,0,0],
                [0,0,0,0,0,0,0,0,0,0],
                [0,0,0,0,0,0,0,0,0,0],
                [0,0,0,0,0,100,0,0,0,0],
                [0,0,0,0,0,0,0,0,0,0],
                [0,0,0,0,0,0,0,0,0,0],
                [0,0,0,0,0,0,0,0,0,0],
                [0,0,0,0,0,0,0,0,0,0],
                [0,0,0,0,0,0,0,0,0,0]]
   
   
var atmosArrayAdvOld=[[{},{},{},{},{},{},{},{},{},{}],
                    [{},{},{},{},{},{},{},{},{},{}],
                    [{},{},{},{},{},{},{},{},{},{}],
                    [{},{},{},{},{},{},{},{},{},{}],
                    [{},{},{},{},{},{},{},{},{},{}],
                    [{},{},{},{},{},{},{},{},{},{}],
                    [{},{},{},{},{},{},{},{},{},{}],
                    [{},{},{},{},{},{},{},{},{},{}],
                    [{},{},{},{},{},{},{},{},{},{}],
                    [{},{},{},{},{},{},{},{},{},{}]]
for (let y = 0; y < atmosArrayAdv.length; y++) {
    for (let x = 0; x < atmosArrayAdv[y].length; x++) {
        if(x-1<0){
            var left=-1
        }else{
            var left=atmosArray[y][x-1]
        }
        if(x+1>=atmosArrayAdv[y].length){
            var right=-1
        }else{
            var right=atmosArray[y][x+1]
        }
        if(y-1<0){
            var up=-1
        }else{
            var up=atmosArray[y-1][x]
        }
        if(y+1>=atmosArrayAdv.length){
            var down=-1
        }else{
            var down=atmosArray[y+1][x]
        }
        atmosArrayAdv[y][x]={center:atmosArray[y][x],left,right,up,down}
    }
    
    
}
for (let y = 0; y < atmosArrayAdvOld.length; y++) {
    for (let x = 0; x < atmosArrayAdvOld[y].length; x++) {
        if(x-1<0){
            var left=-1
        }else{
            var left=atmosArrayOld[y][x-1]
        }
        if(x+1>=atmosArrayAdv[y].length){
            var right=-1
        }else{
            var right=atmosArrayOld[y][x+1]
        }
        if(y-1<0){
            var up=-1
        }else{
            var up=atmosArrayOld[y-1][x]
        }
        if(y+1>=atmosArrayAdvOld.length){
            var down=-1
        }else{
            var down=atmosArrayOld[y+1][x]
        }
        atmosArrayAdvOld[y][x]={center:atmosArrayOld[y][x],left,right,up,down}
    }
    
    
}
function drawVals(){
    ctx.fillStyle="#000000"
    ctx.fillRect(0,0,640,640)
    ctx.fillStyle="#ffffff"
    for (let j = 0; j < atmosArray.length; j++) {
        for (let i = 0; i < atmosArray[j].length; i++) {
            ctx.fillText(Math.round(atmosArray[j][i]*100)/ 100,i*64+10,j*64+16)
            
        }
        
    }
}
function setPressure(x,y,val){
    atmosArrayAdv[y][x].center=val
    atmosArray[y][x]=val
    if(atmosArrayAdv[y][x].up!=-1){
        atmosArrayAdv[y-1][x].down=val
    }
    if(atmosArrayAdv[y][x].down!=-1){
        atmosArrayAdv[y+1][x].up=val
    }
    if(atmosArrayAdv[y][x].left!=-1){
        atmosArrayAdv[y][x-1].right=val
    }
    if(atmosArrayAdv[y][x].right!=-1){
        atmosArrayAdv[y][x+1].left=val
    }
}

function step(){
    var withPressure=[]
    for (let y = 0; y < atmosArrayAdvOld.length; y++) {
        for (let x = 0; x < atmosArrayAdvOld[y].length; x++) {
            if(atmosArrayAdvOld[y][x].center!=-1){
                if (atmosArrayAdvOld[y][x].center>0) {
                    withPressure.push([y,x])
                }
            }
        }
    }
    for (let i = 0; i < withPressure.length; i++) {
        var el = withPressure[i]
        var y=el[0]
        var x=el[1]
        var sum=0
        var c=1
        sum+=atmosArrayAdvOld[y][x].center
        if(atmosArrayAdvOld[y][x].up!=-1){
            sum+=atmosArrayAdvOld[y][x].up
            c++
        }
        if(atmosArrayAdvOld[y][x].down!=-1){
            sum+=atmosArrayAdvOld[y][x].down
            c++
        }
        if(atmosArrayAdvOld[y][x].left!=-1){
            sum+=atmosArrayAdvOld[y][x].left
            c++
        }
        if(atmosArrayAdvOld[y][x].right!=-1){
            sum+=atmosArrayAdvOld[y][x].right
            c++
        }
        var finalVal=sum/c
        setPressure(x,y,finalVal)
        drawVals()
        if(atmosArrayAdvOld[y][x].up!=-1){
            setPressure(x,y-1,finalVal)
            drawVals()
        }
        if(atmosArrayAdvOld[y][x].down!=-1){
            setPressure(x,y+1,finalVal)
            drawVals()
        }
        if(atmosArrayAdvOld[y][x].left!=-1){
            setPressure(x-1,y,finalVal)
            drawVals()
        }
        if(atmosArrayAdvOld[y][x].right!=-1){
            setPressure(x+1,y,finalVal)
            drawVals()
        }
    }
    //Проблема тут
    atmosArrayOld=atmosArray.slice(0)
    atmosArrayAdvOld=atmosArrayAdv.slice(0)
}
setInterval(() => {
    drawVals()
}, 1000/30);
setInterval(() => {
    step()
}, 1000);

Если нужно то вот старый код

Ошибку нашел с помощью отладчика но решить не смог. Когда изменяется массив atmosArray и atmosArrAdv теже изменения поисходят и с atmosArrayOld и atmosArrayAdvOld, чего не должно быть.

Если что гугл не помог.

Заранее спасибо.


Ответы (0 шт):