在Javascript中传递给构造函数的数组是';在调用内容中未修改
我在调用上下文中导入了以下模块:在Javascript中传递给构造函数的数组是';在调用内容中未修改,javascript,Javascript,我在调用上下文中导入了以下模块: function Controls(elem, viewMatrix) { var xD, yD; this.ppdX = 10; this.ppdY = 10; this.state = 0; var dx = 0; var dy = 0; function getXY(evt) { var x = evt.pageX - elem.offsetLeft; var
function Controls(elem, viewMatrix) {
var xD, yD;
this.ppdX = 10;
this.ppdY = 10;
this.state = 0;
var dx = 0;
var dy = 0;
function getXY(evt) {
var x = evt.pageX - elem.offsetLeft;
var y = evt.pageY - elem.offsetTop;
return [x, y];
}
function onDown(evt) {
this.state = 1;
[xD, yD] = getXY(evt);
}
function onUp(evt) {
this.state = 0;
[dx, dy] = [0, 0];
}
function onMove(evt) {
if (!this.state) return;
var [x, y] = getXY(evt);
[dx, dy] = [x - xD, y - yD];
}
this.updateView = function () {
viewMatrix = Mtx.mult(viewMatrix, Mtx.rotY(-Mtx.DtoR * dx / this.ppdX));
viewMatrix = Mtx.mult(viewMatrix, Mtx.rotX(-Mtx.DtoR * dy / this.ppdY));
}
elem.addEventListener("mousedown", onDown.bind(this));
elem.addEventListener("mouseup", onUp.bind(this));
elem.addEventListener("mousemove", onMove.bind(this));
}
export default Controls;
调用上下文如下所示:
import Controls from './js/controls.module.js';
...
viewMatrix = Mtx.makeIdent(4, 4);
controls = new Controls(renderer.domElement, viewMatrix);
...
function animate() {
requestAnimationFrame(animate);
if (controls.state) {
controls.updateView();
...
console.log(viewMatrix);
}
...
}
其中viewMatrix是一个4x4数组,定义如下:
viewMatrix = [[...],[...],[...],[...]];
我可以看到,虽然viewMatrix在updateView()调用中发生了更改,但在调用上下文中并没有发生更改。数组应该通过引用传递,在这种情况下不是这样吗
我知道我可以将updateView()中的矩阵返回到调用上下文并覆盖那里的viewMatrix,但我想知道为什么它不更新,也许有另一种方法来编写代码,以便它自己更新
编辑乘法的代码:
mult(A, B) {
var C = [];
var Ar = A.length, Ac = A[0].length;
var Br = B.length, Bc = B[0].length;
if (Ac != Br) {
console.log("mult(): dimentions mismatch");
return C;
}
for (let ar = 0; ar < Ar; ar++) {
C[ar] = [];
for (let bc = 0; bc < Bc; bc++) {
C[ar][bc] = 0;
for (let ac = 0; ac < Ac; ac++) {
C[ar][bc] += A[ar][ac] * B[ac][bc]
}
}
}
return C;
},
mult(A,B){
var C=[];
var Ar=A.length,Ac=A[0].长度;
var Br=B.length,Bc=B[0]。length;
如果(Ac!=Br){
log(“mult():维度不匹配”);
返回C;
}
for(设ar=0;ar
我们可能需要了解mult()
是如何实现的,但是在语句viewMatrix=Mtx.mult(…)
中,看起来好像刚刚覆盖了viewMatrix
的值,这意味着原始矩阵对象不会受到语句的影响。(同样,这取决于mult()
是如何实现的。)我已经添加了代码,如何更改它以使其不破坏对外部viewMatrix的引用?您可以执行类似const temp=Mtx.mult(…)
,然后将temp
的元素复制到viewMatrix
。(这是一个单独的问题,但请记住,这种对矩阵的重复修改可能会导致数值错误累积,随着时间的推移,这可能会变得明显。)只需在updateView
中使用This.viewMatrix
,然后执行console.log(controls.viewMatrix)
。不要试图让控件操纵全局viewMatrix
,它应该是一个实例属性。@user1481126:显然,您可以做任何您想做的事情,但是可能有一些参数(例如,基于“关注点分离”原则或MVC模式)不将矩阵作为“控件”对象的属性。另一种选择(可能比我之前的建议更好)是将视图矩阵(和任何其他类似数据)作为“控件”对象存储引用的对象的属性。然后,您可以像当前一样覆盖矩阵,同时仍然能够从其他地方访问它,而不受“控件”对象的影响。