Q矢量的Dotproduct

时间:2016-12-06 21:59:43

标签: javascript vector jasmine dot-product

我有我的矢量对象,并试图通过几个测试。 首先,第一个dotProduct函数传递"是正测试"。 但我正在努力让它通过另外两个测试"是否定的"和"为零"。

2 ; Two files
File1,0,200 ; File one at offset 0, length 200
File2,200,50 ; File two at offset 200, length 50
<200 bytes of File1>
<50 bytes of File2>

测试条件:

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;

}());

这是第一个&#34;这个&#34;指的是。

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);
    });
});

这是函数应该做什么的描述:

&#34;您的Vector对象应该有一个'dotProduct'函数,它将一个Vector对象作为参数。该函数应返回单个标量值,该值是“this”Vector和参数Vector&#34;

的点积的结果。

我是否正确地解决了这个问题? 我如何通过这些测试?只需使矢量为负数或者我还需要做其他事情。

1 个答案:

答案 0 :(得分:0)

确定。你的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)它返回一个由....单个参数

构造的新矢量对象
this.getX() * secondVector.getX() +
        this.getY() * secondVector.getY() * Math.acos(90)

4)Math.acos(90)返回NaN,cos的原因值介于1和-1之间。即使你想获得一个角度的余弦,它仍然是错误的,因为Math.cos的角度单位是弧度而不是度数。

所以你的任何dotProduct调用的结果都是带有mX的Vector对象:NaN和mY:undefined。

顺便说一下,dotProduct的注释方法看起来更像是dotProduct。你只需要返回数字,而不是向量。 (至少,你期望在你的单元测试中有一个数字)。所以我认为你正在寻找这样的东西:

Vector.prototype.dotProduct = function ( secondVector ) {
    return this.getX()*secondVector.getX() + this.getY()*secondVector.getY();
};