2016-12-06 84 views
-1

我有我的矢量對象,並試圖讓這個通過一些測試。 首先,第一個dotProduct函數通過「是正測試」。 但我正努力讓它通過「負面」和「是零」兩個其他測試。Q向量的點積

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

這是第一個載體, 「這」 指的是。

housePosition = new Vector(150, 100); 

這是功能應該做些什麼的描述:

「您的矢量對象應該有一個‘dotProduct’功能,需要一個單一的矢量對象作爲參數的函數返回一個標值是'this'的點積的結果Vector和參數Vector'

我正確地處理這個問題嗎? 我會如何通過這些測試?簡單地使矢量爲負,或者還有其他我需要做的事情。

+0

考慮到你有2所dotProduct定義和他們每個人你必須secondVector硬codded的東西(沒有采取參數),你的代碼可能是錯誤。您可能在set/get方法中遇到問題,這會使您的計算結果始終爲0. –

+0

即使其中一個註釋掉了,我仍然只有「正面」才能正常工作。 – Quad117

+0

在他們每個人中你都有secondVecor的硬編碼價值,並且你沒有使用任何輸入參數。因爲這些方法不以任何方式依賴於輸入。另外,你沒有顯示你的setX和getX方法。 –

回答

0

好的。你的設置和獲取方法都可以。讓我們看看你的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:NaN和mY:undefined的Vector對象。

順便說一句,你註釋掉的dotProduct方法看起來更像是一個dotProduct。你只需要返回數字,而不是矢量。 (至少,你希望在你的單元測試中有一個數字)。所以,我認爲你正在尋找的東西是這樣的:

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

好吧,所以我不需要SecondVector var,我需要返回一個值而不是矢量。 – Quad117

+0

,你需要一個正確的公式爲矢量點產品。在編寫測試之前,還可以使用瀏覽器開發人員控制檯嘗試和調試代碼。 –