向量的 Q 点积
Q Dotproduct of a vector
我有我的矢量对象,正在努力让它通过一些测试。
首先,第一个 dotProduct 函数传递 "is positive test"。
但是我正在努力让它通过 "is negative" 和 "is zero".
的另外两个测试
var Vector = (function () {
function Vector(pX, pY, pZ) {
this.setX(pX);
this.setY(pY);
this.setZ(pZ);
}
Vector.prototype.getX = function () {
return this.mX;
};
Vector.prototype.setX = function (pX) {
this.mX = pX;
};
Vector.prototype.getY = function () {
return this.mY;
};
Vector.prototype.setY = function (pY) {
this.mY = pY;
};
Vector.prototype.setZ = function () {
return this.mZ;
};
Vector.prototype.getZ = function (pZ) {
this.mZ = pZ;
};
Vector.prototype.add = function (v) {
return new Vector(this.getX() + v.getX(), this.getY() + v.getY());
};
Vector.prototype.subtract = function (s) {
return new Vector(this.getX() - s.getX(), this.getY() - s.getY());
};
Vector.prototype.multiply = function (scalar) {
return new Vector(this.getX() * scalar, this.getY() * scalar);
};
Vector.prototype.divide = function (scalar) {
return new Vector(this.getX() / scalar, this.getY() / scalar);
};
Vector.prototype.magnitude = function () {
return Math.sqrt(this.getX() * this.getX() + this.getY() * this.getY());
};
Vector.prototype.normalise = function () {
return new Vector(this.getX() / this.magnitude(), this.getY() / this.magnitude());
};
Vector.prototype.limitTo = function (Scalar) {
this.normalise();
this.multiply(Scalar);
return new Vector(this.getX(), this.getY(), this.getZ());
};
//Vector.prototype.dotProduct = function () {
// var secondVector = new Vector(100, 400);
// return new Vector(this.getX() * secondVector.getX() +
// this.getY() * secondVector.getY());
//};
Vector.prototype.dotProduct = function (secondVector) {
secondVector = new Vector(-100, -400);
return new Vector(this.getX() * secondVector.getX() +
this.getY() * secondVector.getY() / Math.acos(90));
};
return Vector;
}());
测试条件:
describe("Dot Product", function () {
it("Result is zero", function () {
var secondVector, dotProduct;
secondVector = new Vector(40, -30, 0);
dotProduct = vector.dotProduct(secondVector);
expect(dotProduct).toEqual(0);
});
it("Result is positive", function () {
var secondVector, dotProduct;
secondVector = new Vector(50, 0, 0);
dotProduct = vector.dotProduct(secondVector);
expect(dotProduct).not.toBeLessThan(0);
});
it("Result is negative", function () {
var secondVector, dotProduct;
secondVector = new Vector(0, -50, 1);
dotProduct = vector.dotProduct(secondVector);
expect(dotProduct).toBeLessThan(0);
});
});
这是 "this" 所指的第一个向量。
housePosition = new Vector(150, 100);
这是对函数应该做什么的描述:
"your Vector object should have a ‘dotProduct’ function that takes a single Vector object as its parameter. The function should return a single scalar value that is the result of the dot product of the ‘this’ Vector and the parameter Vector"
我这样做正确吗?
我怎样才能让它通过这些测试?简单地使向量为负或者我需要做其他事情。
好的。您的 set 和 get 方法没问题。让我们看看您的 dotProduct 方法。
Vector.prototype.dotProduct = function () {
var secondVector = new Vector(100, 400);
return new Vector(this.getX() * secondVector.getX() +
this.getY() * secondVector.getY() * Math.acos(90));
};
1) 它不使用任何输入参数!
2) 它使用硬编码向量 (100, 400) 作为乘数
3) 它 return 是一个新的矢量对象,由一个....单个参数构造
this.getX() * secondVector.getX() +
this.getY() * secondVector.getY() * Math.acos(90)
4) Math.acos(90) returns NaN,因为cos的值在1和-1之间。即使你想得到一个角度的余弦,它仍然是错误的,因为 Math.cos 的角度单位是弧度而不是度数。
因此,任何 dotProduct 调用的结果都是具有 mX:NaN 和 mY:undefined 的 Vector 对象。
顺便说一句,您为 dotProduct 注释掉的方法看起来更像是一个 dotProduct。您只需要 return 数字,而不是矢量。 (至少,您期望单元测试中有一个数字)。所以我认为您正在寻找这样的东西:
Vector.prototype.dotProduct = function ( secondVector ) {
return this.getX()*secondVector.getX() + this.getY()*secondVector.getY();
};
我有我的矢量对象,正在努力让它通过一些测试。 首先,第一个 dotProduct 函数传递 "is positive test"。 但是我正在努力让它通过 "is negative" 和 "is zero".
的另外两个测试var Vector = (function () {
function Vector(pX, pY, pZ) {
this.setX(pX);
this.setY(pY);
this.setZ(pZ);
}
Vector.prototype.getX = function () {
return this.mX;
};
Vector.prototype.setX = function (pX) {
this.mX = pX;
};
Vector.prototype.getY = function () {
return this.mY;
};
Vector.prototype.setY = function (pY) {
this.mY = pY;
};
Vector.prototype.setZ = function () {
return this.mZ;
};
Vector.prototype.getZ = function (pZ) {
this.mZ = pZ;
};
Vector.prototype.add = function (v) {
return new Vector(this.getX() + v.getX(), this.getY() + v.getY());
};
Vector.prototype.subtract = function (s) {
return new Vector(this.getX() - s.getX(), this.getY() - s.getY());
};
Vector.prototype.multiply = function (scalar) {
return new Vector(this.getX() * scalar, this.getY() * scalar);
};
Vector.prototype.divide = function (scalar) {
return new Vector(this.getX() / scalar, this.getY() / scalar);
};
Vector.prototype.magnitude = function () {
return Math.sqrt(this.getX() * this.getX() + this.getY() * this.getY());
};
Vector.prototype.normalise = function () {
return new Vector(this.getX() / this.magnitude(), this.getY() / this.magnitude());
};
Vector.prototype.limitTo = function (Scalar) {
this.normalise();
this.multiply(Scalar);
return new Vector(this.getX(), this.getY(), this.getZ());
};
//Vector.prototype.dotProduct = function () {
// var secondVector = new Vector(100, 400);
// return new Vector(this.getX() * secondVector.getX() +
// this.getY() * secondVector.getY());
//};
Vector.prototype.dotProduct = function (secondVector) {
secondVector = new Vector(-100, -400);
return new Vector(this.getX() * secondVector.getX() +
this.getY() * secondVector.getY() / Math.acos(90));
};
return Vector;
}());
测试条件:
describe("Dot Product", function () {
it("Result is zero", function () {
var secondVector, dotProduct;
secondVector = new Vector(40, -30, 0);
dotProduct = vector.dotProduct(secondVector);
expect(dotProduct).toEqual(0);
});
it("Result is positive", function () {
var secondVector, dotProduct;
secondVector = new Vector(50, 0, 0);
dotProduct = vector.dotProduct(secondVector);
expect(dotProduct).not.toBeLessThan(0);
});
it("Result is negative", function () {
var secondVector, dotProduct;
secondVector = new Vector(0, -50, 1);
dotProduct = vector.dotProduct(secondVector);
expect(dotProduct).toBeLessThan(0);
});
});
这是 "this" 所指的第一个向量。
housePosition = new Vector(150, 100);
这是对函数应该做什么的描述:
"your Vector object should have a ‘dotProduct’ function that takes a single Vector object as its parameter. The function should return a single scalar value that is the result of the dot product of the ‘this’ Vector and the parameter Vector"
我这样做正确吗? 我怎样才能让它通过这些测试?简单地使向量为负或者我需要做其他事情。
好的。您的 set 和 get 方法没问题。让我们看看您的 dotProduct 方法。
Vector.prototype.dotProduct = function () {
var secondVector = new Vector(100, 400);
return new Vector(this.getX() * secondVector.getX() +
this.getY() * secondVector.getY() * Math.acos(90));
};
1) 它不使用任何输入参数!
2) 它使用硬编码向量 (100, 400) 作为乘数
3) 它 return 是一个新的矢量对象,由一个....单个参数构造
this.getX() * secondVector.getX() +
this.getY() * secondVector.getY() * Math.acos(90)
4) Math.acos(90) returns NaN,因为cos的值在1和-1之间。即使你想得到一个角度的余弦,它仍然是错误的,因为 Math.cos 的角度单位是弧度而不是度数。
因此,任何 dotProduct 调用的结果都是具有 mX:NaN 和 mY:undefined 的 Vector 对象。
顺便说一句,您为 dotProduct 注释掉的方法看起来更像是一个 dotProduct。您只需要 return 数字,而不是矢量。 (至少,您期望单元测试中有一个数字)。所以我认为您正在寻找这样的东西:
Vector.prototype.dotProduct = function ( secondVector ) {
return this.getX()*secondVector.getX() + this.getY()*secondVector.getY();
};