Создается не копия а ссылка массиве
У меня есть код симуляции атмосферы.Я начал его улучшать и в етот момент появилась проблема.А точнее работа кода никак не изменилась. Вот код. 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, чего не должно быть.
Если что гугл не помог.
Заранее спасибо.