134 lines
3.3 KiB
HTML
134 lines
3.3 KiB
HTML
|
<!DOCTYPE html>
|
||
|
<html lang="en">
|
||
|
<head>
|
||
|
<meta charset="utf-8">
|
||
|
<title>math.js | angle configuration</title>
|
||
|
<style>
|
||
|
body, input, select {
|
||
|
font: 11pt sans-serif;
|
||
|
}
|
||
|
input, select, th, #result {
|
||
|
padding: 5px 10px;
|
||
|
}
|
||
|
th {
|
||
|
text-align: left;
|
||
|
}
|
||
|
</style>
|
||
|
|
||
|
<script src="../../lib/browser/math.js"></script>
|
||
|
</head>
|
||
|
<body>
|
||
|
|
||
|
<p>
|
||
|
This code example extends the trigonometric functions of math.js with configurable angles: degrees, radians, or gradians.
|
||
|
</p>
|
||
|
|
||
|
<table>
|
||
|
<tr>
|
||
|
<th>Angles</th>
|
||
|
<td>
|
||
|
<select id="angles">
|
||
|
<option value="deg">deg</option>
|
||
|
<option value="grad">grad</option>
|
||
|
<option value="rad">rad</option>
|
||
|
</select>
|
||
|
</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<th>Expression</th>
|
||
|
<td>
|
||
|
<input id="expression" type="text" value="sin(45)" />
|
||
|
<input id="evaluate" type="button" value="Evaluate">
|
||
|
</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<th>Result</th>
|
||
|
<td id="result"></td>
|
||
|
</tr>
|
||
|
</table>
|
||
|
|
||
|
<script>
|
||
|
let replacements = {}
|
||
|
|
||
|
// our extended configuration options
|
||
|
const config = {
|
||
|
angles: 'deg' // 'rad', 'deg', 'grad'
|
||
|
}
|
||
|
|
||
|
// create trigonometric functions replacing the input depending on angle config
|
||
|
const fns1 = ['sin', 'cos', 'tan', 'sec', 'cot', 'csc']
|
||
|
fns1.forEach(function(name) {
|
||
|
const fn = math[name] // the original function
|
||
|
|
||
|
const fnNumber = function (x) {
|
||
|
// convert from configured type of angles to radians
|
||
|
switch (config.angles) {
|
||
|
case 'deg':
|
||
|
return fn(x / 360 * 2 * Math.PI)
|
||
|
case 'grad':
|
||
|
return fn(x / 400 * 2 * Math.PI)
|
||
|
default:
|
||
|
return fn(x)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// create a typed-function which check the input types
|
||
|
replacements[name] = math.typed(name, {
|
||
|
'number': fnNumber,
|
||
|
'Array | Matrix': function (x) {
|
||
|
return math.map(x, fnNumber)
|
||
|
}
|
||
|
})
|
||
|
})
|
||
|
|
||
|
// create trigonometric functions replacing the output depending on angle config
|
||
|
const fns2 = ['asin', 'acos', 'atan', 'atan2', 'acot', 'acsc', 'asec']
|
||
|
fns2.forEach(function(name) {
|
||
|
const fn = math[name] // the original function
|
||
|
|
||
|
const fnNumber = function (x) {
|
||
|
const result = fn(x)
|
||
|
|
||
|
if (typeof result === 'number') {
|
||
|
// convert to radians to configured type of angles
|
||
|
switch(config.angles) {
|
||
|
case 'deg': return result / 2 / Math.PI * 360
|
||
|
case 'grad': return result / 2 / Math.PI * 400
|
||
|
default: return result
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return result
|
||
|
}
|
||
|
|
||
|
// create a typed-function which check the input types
|
||
|
replacements[name] = math.typed(name, {
|
||
|
'number': fnNumber,
|
||
|
'Array | Matrix': function (x) {
|
||
|
return math.map(x, fnNumber)
|
||
|
}
|
||
|
})
|
||
|
})
|
||
|
|
||
|
// import all replacements into math.js, override existing trigonometric functions
|
||
|
math.import(replacements, {override: true})
|
||
|
|
||
|
// pointers to the input elements
|
||
|
const expression = document.getElementById('expression')
|
||
|
const evaluate = document.getElementById('evaluate')
|
||
|
const result = document.getElementById('result')
|
||
|
const angles = document.getElementById('angles')
|
||
|
|
||
|
// attach event handlers for select box and button
|
||
|
angles.onchange = function () {
|
||
|
config.angles = this.value
|
||
|
config.angles = this.value
|
||
|
}
|
||
|
evaluate.onclick = function () {
|
||
|
result.innerHTML = math.evaluate(expression.value)
|
||
|
}
|
||
|
</script>
|
||
|
|
||
|
|
||
|
</body>
|
||
|
</html>
|