Merge pull request #422 from CSnap/tan_fix

Added new util function that sends tan function infinities correctly
This commit is contained in:
Andrew Sliwinski 2017-02-01 09:12:42 -05:00 committed by GitHub
commit 073ffda0fb
4 changed files with 39 additions and 6 deletions

View file

@ -1,4 +1,5 @@
var Cast = require('../util/cast.js');
var MathUtil = require('../util/math-util.js');
var Scratch3OperatorsBlocks = function (runtime) {
/**
@ -126,9 +127,9 @@ Scratch3OperatorsBlocks.prototype.mathop = function (args) {
case 'floor': return Math.floor(n);
case 'ceiling': return Math.ceil(n);
case 'sqrt': return Math.sqrt(n);
case 'sin': return Math.sin((Math.PI * n) / 180);
case 'cos': return Math.cos((Math.PI * n) / 180);
case 'tan': return Math.tan((Math.PI * n) / 180);
case 'sin': return parseFloat(Math.sin((Math.PI * n) / 180).toFixed(10));
case 'cos': return parseFloat(Math.cos((Math.PI * n) / 180).toFixed(10));
case 'tan': return MathUtil.tan(n);
case 'asin': return (Math.asin(n) * 180) / Math.PI;
case 'acos': return (Math.acos(n) * 180) / Math.PI;
case 'atan': return (Math.atan(n) * 180) / Math.PI;

View file

@ -45,4 +45,24 @@ MathUtil.wrapClamp = function (n, min, max) {
return n - (Math.floor((n - min) / range) * range);
};
/**
* Convert a value from tan function in degrees.
* @param {!number} angle in degrees
* @return {!number} Correct tan value
*/
MathUtil.tan = function (angle) {
angle = angle % 360;
switch (angle) {
case -270:
case 90:
return Infinity;
case -90:
case 270:
return -Infinity;
default:
return parseFloat(Math.tan((Math.PI * angle) / 180).toFixed(10));
}
};
module.exports = MathUtil;

View file

@ -160,9 +160,13 @@ test('mathop', function (t) {
t.strictEqual(blocks.mathop({OPERATOR: 'floor', NUM: 1.5}), 1);
t.strictEqual(blocks.mathop({OPERATOR: 'ceiling', NUM: 0.1}), 1);
t.strictEqual(blocks.mathop({OPERATOR: 'sqrt', NUM: 1}), 1);
t.strictEqual(blocks.mathop({OPERATOR: 'sin', NUM: 1}), 0.01745240643728351);
t.strictEqual(blocks.mathop({OPERATOR: 'cos', NUM: 1}), 0.9998476951563913);
t.strictEqual(blocks.mathop({OPERATOR: 'tan', NUM: 1}), 0.017455064928217585);
t.strictEqual(blocks.mathop({OPERATOR: 'sin', NUM: 1}), 0.0174524064);
t.strictEqual(blocks.mathop({OPERATOR: 'sin', NUM: 90}), 1);
t.strictEqual(blocks.mathop({OPERATOR: 'cos', NUM: 1}), 0.9998476952);
t.strictEqual(blocks.mathop({OPERATOR: 'cos', NUM: 180}), -1);
t.strictEqual(blocks.mathop({OPERATOR: 'tan', NUM: 1}), 0.0174550649);
t.strictEqual(blocks.mathop({OPERATOR: 'tan', NUM: 90}), Infinity);
t.strictEqual(blocks.mathop({OPERATOR: 'tan', NUM: 180}), 0);
t.strictEqual(blocks.mathop({OPERATOR: 'asin', NUM: 1}), 90);
t.strictEqual(blocks.mathop({OPERATOR: 'acos', NUM: 1}), 0);
t.strictEqual(blocks.mathop({OPERATOR: 'atan', NUM: 1}), 45);

View file

@ -34,3 +34,11 @@ test('wrapClamp', function (t) {
t.strictEqual(math.wrapClamp(100, 0, 10), 1);
t.end();
});
test('tan', function (t) {
t.strictEqual(math.tan(90), Infinity);
t.strictEqual(math.tan(180), 0);
t.strictEqual(math.tan(-90), -Infinity);
t.strictEqual(math.tan(33), 0.6494075932);
t.end();
});