Skip to content

Commit

Permalink
Merge pull request #422 from CSnap/tan_fix
Browse files Browse the repository at this point in the history
Added new util function that sends tan function infinities correctly
  • Loading branch information
thisandagain committed Feb 1, 2017
2 parents fff63e3 + 1ac89f5 commit 073ffda
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 6 deletions.
7 changes: 4 additions & 3 deletions src/blocks/scratch3_operators.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
var Cast = require('../util/cast.js');
var MathUtil = require('../util/math-util.js');

var Scratch3OperatorsBlocks = function (runtime) {
/**
Expand Down Expand Up @@ -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;
Expand Down
20 changes: 20 additions & 0 deletions src/util/math-util.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
10 changes: 7 additions & 3 deletions test/unit/blocks_operators.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
8 changes: 8 additions & 0 deletions test/unit/util_math.js
Original file line number Diff line number Diff line change
Expand Up @@ -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();
});

0 comments on commit 073ffda

Please sign in to comment.