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