Angular Division Solver
Finds all angles which when multiplied by n are equal to some theta.
by wio_dude
HTML
<script src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML&dummy=.js"></script>
<script type="text/x-mathjax-config">
MathJax.Hub.Config({ tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]} });
</script>
<div>\[
\theta = n\phi, \quad \phi_k = \frac{360^\circ(k-1)+\theta}{n},\quad k\in \{1,2,\dots,n\}
\]</div>
<label for="rev">$\theta$:</label>
<input id="rev" type="text" value="90" />
<br/>
<label for="mult">$n$:</label>
<input id="mult" type="text" value="2" />
<br/>
<input id="solve" type="button" value="Solve" />
<div id="output"></div>
CSS
table {
border-collapse: collapse;
}
td, th {
text-align: center;
border: 1px solid black;
padding: 5px;
}
JavaScript
var byId = document.getElementById.bind(document);
var newElem = document.createElement.bind(document);
var output = byId("output");
var rev = byId("rev");
var mult = byId("mult");
var solve = byId("solve");
var DECIMALS = 5;
var newElemHTML = function(tagname, html) {
var elem = newElem(tagname);
elem.innerHTML = html;
return elem;
}
function clear() {
output.innerHTML = "";
}
function print(x) {
output.innerHTML += x;
}
function trunc(number, places) {
var i, factor = 1;
for (i = 0; i < places; i++) {
factor *= 10;
}
return Math.floor(number * factor) / factor;
}
function angularDivisionSolver(angle, n) {
var k, solutions = [];
for (k = 1; k <= n; k++) {
var solution = (360 * (k-1) + angle) / n;
solutions.push(solution);
}
return solutions;
}
function reduceAngle(angle) {
if (angle < 0) {
return angle + Math.ceil(-angle / 360) * 360;
}
else if (angle >= 1) {
return angle - Math.floor(angle / 360) * 360;
}
return angle;
}
function equal(x, y, delta) {
return Math.abs(x-y) < delta;
}
solve.addEventListener("click", function(){
var angle = parseFloat(rev.value);
var n = parseInt(mult.value, 10);
var solutions = angularDivisionSolver(angle, n);
var k;
clear();
var table = newElem("table");
var thead = newElem("thead");
thead.appendChild(newElemHTML("th", "$k$"));
thead.appendChild(newElemHTML("th", "$\\phi_k$"));
thead.appendChild(newElemHTML("th", "$n\\cdot \\phi_k$"));
thead.appendChild(newElemHTML("th", "$\\bmod{360^\\circ}$"));
table.appendChild(thead);
for (k = 0; k < solutions.length; k++) {
var tr = newElem("tr");
var phi_k = trunc(solutions[k], DECIMALS),
nphi_k = trunc(solutions[k] * n, DECIMALS),
mod360 = trunc(reduceAngle(solutions[k] * n), DECIMALS);
tr.appendChild(newElemHTML("td", "$"+(k+1).toString()+"$"));
...