2016-12-06 2 views
-1

У меня есть мой векторный объект, и я пытаюсь сделать это, пройдя несколько тестов. Во-первых, первая функция dotProduct передает «положительный тест». Но я изо всех сил стараюсь пропустить два других теста: «отрицательно» и «равно нулю».Q Dotproduct of vector

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“, которая принимает один векторный объект в качестве параметра Функция должна возвращать скаляр значение, которое является результатом точечного произведения «этого» вектора и параметра «Вектор»

Неужели я об этом правильно? Как мне пройти эти тесты? Просто сделайте вектор отрицательным или есть что-то еще, что мне нужно сделать.

+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.

Btw, ваш метод комментариев для dotProduct больше похож на dotProduct. Вам просто нужно вернуть число, а не вектор. (по крайней мере, вы ожидаете число в ваших модульных тестах). Так что я думаю, что вы ищете что-то вроде этого:

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

Ah ok, поэтому мне не нужен var Secondvector var, и мне нужно вернуть значение вместо вектора. – Quad117

+0

и вам нужны правильные формулы для векторного точечного продукта. Также он помогает использовать консоль разработчиков браузера, чтобы попробовать и отладить ваш код перед написанием тестов. –