mirror of
https://github.com/scratchfoundation/scratch-vm.git
synced 2024-12-23 14:32:59 -05:00
Merge pull request #422 from CSnap/tan_fix
Added new util function that sends tan function infinities correctly
This commit is contained in:
commit
073ffda0fb
4 changed files with 39 additions and 6 deletions
|
@ -1,4 +1,5 @@
|
||||||
var Cast = require('../util/cast.js');
|
var Cast = require('../util/cast.js');
|
||||||
|
var MathUtil = require('../util/math-util.js');
|
||||||
|
|
||||||
var Scratch3OperatorsBlocks = function (runtime) {
|
var Scratch3OperatorsBlocks = function (runtime) {
|
||||||
/**
|
/**
|
||||||
|
@ -126,9 +127,9 @@ Scratch3OperatorsBlocks.prototype.mathop = function (args) {
|
||||||
case 'floor': return Math.floor(n);
|
case 'floor': return Math.floor(n);
|
||||||
case 'ceiling': return Math.ceil(n);
|
case 'ceiling': return Math.ceil(n);
|
||||||
case 'sqrt': return Math.sqrt(n);
|
case 'sqrt': return Math.sqrt(n);
|
||||||
case 'sin': return Math.sin((Math.PI * n) / 180);
|
case 'sin': return parseFloat(Math.sin((Math.PI * n) / 180).toFixed(10));
|
||||||
case 'cos': return Math.cos((Math.PI * n) / 180);
|
case 'cos': return parseFloat(Math.cos((Math.PI * n) / 180).toFixed(10));
|
||||||
case 'tan': return Math.tan((Math.PI * n) / 180);
|
case 'tan': return MathUtil.tan(n);
|
||||||
case 'asin': return (Math.asin(n) * 180) / Math.PI;
|
case 'asin': return (Math.asin(n) * 180) / Math.PI;
|
||||||
case 'acos': return (Math.acos(n) * 180) / Math.PI;
|
case 'acos': return (Math.acos(n) * 180) / Math.PI;
|
||||||
case 'atan': return (Math.atan(n) * 180) / Math.PI;
|
case 'atan': return (Math.atan(n) * 180) / Math.PI;
|
||||||
|
|
|
@ -45,4 +45,24 @@ MathUtil.wrapClamp = function (n, min, max) {
|
||||||
return n - (Math.floor((n - min) / range) * range);
|
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;
|
module.exports = MathUtil;
|
||||||
|
|
|
@ -160,9 +160,13 @@ test('mathop', function (t) {
|
||||||
t.strictEqual(blocks.mathop({OPERATOR: 'floor', NUM: 1.5}), 1);
|
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: 'ceiling', NUM: 0.1}), 1);
|
||||||
t.strictEqual(blocks.mathop({OPERATOR: 'sqrt', NUM: 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: 'sin', NUM: 1}), 0.0174524064);
|
||||||
t.strictEqual(blocks.mathop({OPERATOR: 'cos', NUM: 1}), 0.9998476951563913);
|
t.strictEqual(blocks.mathop({OPERATOR: 'sin', NUM: 90}), 1);
|
||||||
t.strictEqual(blocks.mathop({OPERATOR: 'tan', NUM: 1}), 0.017455064928217585);
|
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: 'asin', NUM: 1}), 90);
|
||||||
t.strictEqual(blocks.mathop({OPERATOR: 'acos', NUM: 1}), 0);
|
t.strictEqual(blocks.mathop({OPERATOR: 'acos', NUM: 1}), 0);
|
||||||
t.strictEqual(blocks.mathop({OPERATOR: 'atan', NUM: 1}), 45);
|
t.strictEqual(blocks.mathop({OPERATOR: 'atan', NUM: 1}), 45);
|
||||||
|
|
|
@ -34,3 +34,11 @@ test('wrapClamp', function (t) {
|
||||||
t.strictEqual(math.wrapClamp(100, 0, 10), 1);
|
t.strictEqual(math.wrapClamp(100, 0, 10), 1);
|
||||||
t.end();
|
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();
|
||||||
|
});
|
||||||
|
|
Loading…
Reference in a new issue