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&amp;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()+"$"));
       ...