Skip to content

Instantly share code, notes, and snippets.

@follesoe
Last active October 13, 2016 19:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save follesoe/d808895227f9dcd65f40d46984f175bc to your computer and use it in GitHub Desktop.
Save follesoe/d808895227f9dcd65f40d46984f175bc to your computer and use it in GitHub Desktop.
Silly implementation of compass UI in console to understand how to implement it.
function difference(a, b) {
var diff = b - a;
var absDiff = Math.abs(diff);
if (absDiff <= 180)
{
return absDiff == 180 ? absDiff : diff;
}
else if (b > a)
{
return absDiff - 360;
}
else
{
return 360 - absDiff;
}
}
function pad(n, width, z) {
z = z || '0';
n = n + '';
return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
}
function draw(userDeg)
{
// Items at different headings
var items = [
{label: '↑', deg: 0},
{label: '↗', deg: 45},
{label: '→', deg: 90},
{label: '↘', deg: 135},
{label: '↓', deg: 180},
{label: '↙', deg: 225},
{label: '←', deg: 270},
{label: '↖', deg: 315},
];
// Items to show at a given heading
var itemsToShow = {};
// Find items to show
for(var i = 0; i < items.length; ++i)
{
var itemDeg = items[i].deg;
var diff = difference(userDeg, itemDeg);
// Check if item is less than 90 degrees from center (deg) and should be included
if (Math.abs(diff) <= 90)
{
items[i].diff = diff;
itemsToShow[''+diff] = items[i].label;
}
}
process.stdout.write(pad(userDeg, 3) + '° ');
for (var i = -90; i <= 90; ++i)
{
if (i == 0)
{
process.stdout.write('☺');
}
else if (itemsToShow[i])
{
process.stdout.write(itemsToShow[i]);
}
else
{
process.stdout.write('.');
}
}
}
while(true)
{
for (var i = 0; i <= 359; ++i)
{
process.stdout.clearLine(); // clear current text
process.stdout.cursorTo(0);
draw(i);
var waitTill = new Date(new Date().getTime() + 75);
while(waitTill > new Date()){}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment