Added distance and time calculations. General tweaks.

This commit is contained in:
Rob L 2016-07-22 10:23:16 -04:00
parent 2de0aa215c
commit a20a24fd76
5 changed files with 220 additions and 56 deletions

View File

@ -1,3 +1,5 @@
var lastInputBox;
$(document).ready(function() { $(document).ready(function() {
// Controls menu hide/show // Controls menu hide/show
$('#hotdog').click(function(){ $('#hotdog').click(function(){
@ -10,9 +12,30 @@ $(document).ready(function() {
var selected = $('#findbyselect option:selected').text(); var selected = $('#findbyselect option:selected').text();
zoomfocus(selected); zoomfocus(selected);
}); });
$('#calctnd').click(function() {
$('#cal_start').html( $('#pointa option:selected').text() );
$('#cal_end').html( $('#pointb option:selected').text() );
$('#cal_speed').html( $('#speed').val() +" " + $('#speedunit option:selected').val() );
var dist = calcDist( $('#pointa option:selected').text(), $('#pointb option:selected').text() );
var eta = calcETA({'speed': $('#speed').val(), 'unit': $('#speedunit option:selected').val()},dist)
$('#cal_eta').html( timeformat(eta) );
$('#cal_dist').html( dist.toFixed(2) + " PC");
}); });
$("#pointa").focus(function() {
lastInputBox = "pointa";
// console.log('Updating last touched box to : ' + lastInputBox)
});
$("#pointb").focus(function() {
lastInputBox = "pointb";
// console.log('Updating last touched box to : ' + lastInputBox)
});
});
function populateUserFields() { function populateUserFields() {
//Populate find by select dropdown //Populate find by select dropdown
var types = []; var types = [];
@ -31,6 +54,18 @@ function populateUserFields() {
} }
$('#findbyselect').html(option); $('#findbyselect').html(option);
// Populate pointa and pointb dropdowns
var types = ['planets','stations'];
for (var type in types){
for ( var key in listobjects(types[type]) ){
option += '<option value="'+ escapeHTML(key) + '">' + escapeHTML(key) + '</option>';
}
}
$('#pointa').html(option);
$('#pointb').html(option);
} }
function openTab(evt,tabName) { function openTab(evt,tabName) {
@ -47,8 +82,7 @@ function openTab(evt,tabName) {
evt.currentTarget.className += " wvg-tab-active"; evt.currentTarget.className += " wvg-tab-active";
} }
function escapeHTML(text) function escapeHTML(text) {
{
var chr = { '"': '"', '&': '&', '<': '[', '>': ']' }; var chr = { '"': '"', '&': '&', '<': '[', '>': ']' };
function abc(a) function abc(a)
{ {
@ -56,3 +90,19 @@ function escapeHTML(text)
} }
return text.replace(/[\"&<>]/g, abc); return text.replace(/[\"&<>]/g, abc);
} }
function timeformat(secs) {
var s = new Decimal(secs);
var hours = new Decimal(secs / 3600);
var h = hours.floor(); //Get whole hours
s = s - (h * 3600);
var m = new Decimal(s / 60); //Get remaining minutes
m = m.floor();
s = s - (m * 60 );
s = Math.round(s,0)
console.log("Hours :"+ h);
console.log("Minutes :"+ m);
console.log("Seconds :"+ s);
console.log("Input :"+ secs);
return h+":"+(m < 10 ? '0'+m : m)+":"+(s < 10 ? '0'+s : s); //zero padding on minutes and seconds
}

3
js/decimal.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -2,12 +2,15 @@ if ( ! Detector.webgl ) Detector.addGetWebGLMessage();
var camera, controls, scene, renderer; var camera, controls, scene, renderer;
var clock = new THREE.Clock(); var clock = new THREE.Clock();
var raycaster = new THREE.Raycaster();
var mouse = new THREE.Vector2(), INTERSECTED;
var WIDTH = window.innerWidth , HEIGHT = window.innerHeight var WIDTH = window.innerWidth , HEIGHT = window.innerHeight
window.onload = function() { window.onload = function() {
loadData(function() { loadData(function() {
init(); init();
animate(); animate();
populateUserFields();
}); });
} }
@ -54,18 +57,13 @@ function init() {
controls.dampingFactor = 0.25; controls.dampingFactor = 0.25;
controls.enableZoom = true; controls.enableZoom = true;
controls.addEventListener( 'change', render ); controls.addEventListener( 'change', render );
document.addEventListener( 'mousedown', onCanvasClick, false );
var Text2D = THREE_Text.Text2D; var Text2D = THREE_Text.Text2D;
var SpriteText2D = THREE_Text.SpriteText2D; var SpriteText2D = THREE_Text.SpriteText2D;
var textAlign = THREE_Text.textAlign var textAlign = THREE_Text.textAlign
var raycaster = new THREE.Raycaster();
var mouse = new THREE.Vector2();
var b_geometry, b_material, b_mesh, p_geometry, p_material, p_mesh, s_geometry, s_material, s_mesh, l_text; var b_geometry, b_material, b_mesh, p_geometry, p_material, p_mesh, s_geometry, s_material, s_mesh, l_text;
@ -83,7 +81,7 @@ for (var key in jsonEmpire) {
b_mesh.position.x = border.x; b_mesh.position.x = border.x;
b_mesh.position.y = border.y; b_mesh.position.y = border.y;
b_mesh.position.z = border.z; b_mesh.position.z = border.z;
b_mesh.name = border.name; b_mesh.name = escapeHTML(border.name);
scene.add( b_mesh ); scene.add( b_mesh );
if (border.radius > 10) { if (border.radius > 10) {
l_text = new Text2D(border.name, { align: textAlign.center, font: '25px Arial', fillStyle: '#777' , antialias: false }); l_text = new Text2D(border.name, { align: textAlign.center, font: '25px Arial', fillStyle: '#777' , antialias: false });
@ -105,9 +103,9 @@ for (var key in jsonEmpire) {
p_mesh.position.x=planet.x; p_mesh.position.x=planet.x;
p_mesh.position.y=planet.y; p_mesh.position.y=planet.y;
p_mesh.position.z=planet.z; p_mesh.position.z=planet.z;
p_mesh.name = planet.name; p_mesh.name = escapeHTML(planet.name);
scene.add( p_mesh ); scene.add( p_mesh );
l_text = new Text2D(planet.name, { align: textAlign.right, font: '12px Arial', fillStyle: '#FFF' , antialias: false }); l_text = new Text2D(escapeHTML(planet.name), { align: textAlign.right, font: '12px Arial', fillStyle: '#FFF' , antialias: false });
l_text.material.alphaTest = 0.0; l_text.material.alphaTest = 0.0;
l_text.position.set(planet.x,planet.y,planet.z); l_text.position.set(planet.x,planet.y,planet.z);
l_text.scale.set(0.25,0.25,0.25); l_text.scale.set(0.25,0.25,0.25);
@ -123,9 +121,9 @@ for (var key in jsonEmpire) {
s_mesh.position.x=base.x; s_mesh.position.x=base.x;
s_mesh.position.y=base.y; s_mesh.position.y=base.y;
s_mesh.position.z=base.z; s_mesh.position.z=base.z;
s_mesh.name = base.name; s_mesh.name = escapeHTML(base.name);
scene.add( s_mesh ); scene.add( s_mesh );
l_text = new Text2D(base.name, { align: textAlign.left, font: '12px Arial', fillStyle: '#ABABAB' , antialias: false }); l_text = new Text2D(escapeHTML(base.name), { align: textAlign.left, font: '12px Arial', fillStyle: '#ABABAB' , antialias: false });
l_text.material.alphaTest = 0.0; l_text.material.alphaTest = 0.0;
l_text.position.set(base.x,base.y+3,base.z); l_text.position.set(base.x,base.y+3,base.z);
l_text.scale.set(0.20,0.20,0.20); l_text.scale.set(0.20,0.20,0.20);
@ -148,20 +146,46 @@ window.onresize = function() {
render(); render();
} }
function onCanvasClick( event ) {
//event.preventDefault();
mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
raycaster.setFromCamera( mouse, camera );
var intersects = raycaster.intersectObjects( scene.children );
if ( intersects.length > 0 ) {
if ( INTERSECTED != intersects[ 0 ].object ) {
INTERSECTED = intersects[ 0 ].object;
// console.log( INTERSECTED.name );
document.getElementById(lastInputBox).value = INTERSECTED.name;
}
} else {
INTERSECTED = null;
}
}
function animate() { function animate() {
var delta = clock.getDelta(); var delta = clock.getDelta();
requestAnimationFrame( animate ); requestAnimationFrame( animate );
scene.updateMatrixWorld() scene.updateMatrixWorld()
controls.update(delta); controls.update(delta);
render(); render();
} }
function render () { function render () {
//requestAnimationFrame( render ); //requestAnimationFrame( render );
renderer.render( scene, camera ); renderer.render( scene, camera );
// find intersections
} }
@ -187,7 +211,7 @@ function zoomfocus(name) {
for (var type in types) { for (var type in types) {
var objects = listobjects(types[type]); var objects = listobjects(types[type]);
for ( var key in objects ) { for ( var key in objects ) {
if (escapeHTML(key) == name) { if (key == name) {
var object = objects[key]; var object = objects[key];
controls.target.x = object.x; controls.target.x = object.x;
controls.target.y = object.y; controls.target.y = object.y;
@ -225,3 +249,53 @@ function removeEntity(object) {
scene.remove( selectedObject ); scene.remove( selectedObject );
animate(); animate();
} }
// Calculates SU/s with given warp factor
function calcSUpS(warpfactor) {
// 14.0*29.979246*1298.737508 = 257494817.55 SU/s
// Velocity = WF^3.333333*lightspeed*cochranes
// 3087467836.3256578445 = 1 Parsec
var cochranes = 1298.737508; // Average cochranes
var lightspeed = 29.979246; // Lightspeed constant
var exponent = 3.333333;
var sus = Math.pow(warpfactor,exponent) * lightspeed * cochranes ;
return sus;
}
function su2pc ( su ) {
return su / 3087467836.3256578445;
}
// Calculates ETA for given distance and velocity.
// Velocity should be supplied as an array of speed and unit
function calcETA(velocity,distance) {
var speed = velocity.speed;
var unit = velocity.unit;
var seconds;
switch (unit) {
case 'SU/s':
seconds = new Decimal( distance / su2pc(speed) );
break;
case 'PC/s':
seconds = new Decimal( distance / speed );
break;
case 'WF':
seconds = distance / su2pc(calcSUpS(speed));
break;
default:
throw "Invalid unit of speed."
}
return seconds;
}
// Calculate the distance between two named points ( Stations or Bases )
function calcDist(pointa, pointb) {
var obj_A = scene.getObjectByName(pointa);
var obj_B = scene.getObjectByName(pointb);
var distance = obj_A.position.distanceTo(obj_B.position);
return distance;
}

View File

@ -41869,4 +41869,3 @@ THREE.MorphBlendMesh.prototype.update = function ( delta ) {
} }
}; };

View File

@ -2,6 +2,7 @@
<html> <html>
<head> <head>
<script src="js/three.js"></script> <script src="js/three.js"></script>
<script src="js/decimal.min.js"></script>
<script src="js/OrbitControls.js"></script> <script src="js/OrbitControls.js"></script>
<script src="js/three-text2d.js"></script> <script src="js/three-text2d.js"></script>
<script src="js/Detector.js"></script> <script src="js/Detector.js"></script>
@ -30,8 +31,8 @@
ul.wvg-navbar li { width:auto; height: 100%; float: left; } .wvg-tablink { margin: 0; padding: 0; padding: 8px 10px; font-weight: bold; text-align: center; font-family: 'Space Mono', monospace; color:#67989A; } ul.wvg-navbar li { width:auto; height: 100%; float: left; } .wvg-tablink { margin: 0; padding: 0; padding: 8px 10px; font-weight: bold; text-align: center; font-family: 'Space Mono', monospace; color:#67989A; }
.wvg-tab-active { background-color: #0D4A4D; color: #003133; } .wvg-tab-active { background-color: #0D4A4D; color: #003133; }
.wvg-tools { width: 100%; height: 98%; background: #333; display: none; color: #AAA; padding-top: 2vh; padding-left:1vw; padding-right: 2.5vw;} .wvg-tools { width: 100%; height: 98%; background: #333; display: none; color: #AAA; padding-top: 2vh; padding-left:1vw; padding-right: 2.5vw;}
.wvg-tools select { .wvg-tools select, .wvg-tools input {
width: 75%; width: 12vw;
padding: 5px; padding: 5px;
font-size: 16px; font-size: 16px;
line-height: 1; line-height: 1;
@ -43,7 +44,8 @@
color: #67989A; color: #67989A;
margin: 0 auto; margin: 0 auto;
} }
.wvg-tools span { text-align: center; color: #FFF; font-family: 'Space Mono', monospace; margin: 0 auto;} .wvg-tools input { background: #333; width: 11.4vw; }
.wvg-tools span { text-align: center; color: #FFF; font-family: 'Space Mono', monospace; display: block; padding-right: 3vw; }
.wvg-first { display: block; } .wvg-first { display: block; }
#wrapper { height: inherit; width: 100%; } #wrapper { height: inherit; width: 100%; }
.active { display: block; } .active { display: block; }
@ -86,17 +88,22 @@
font-family: 'Space Mono', monospace; font-family: 'Space Mono', monospace;
color: #003133; color: #003133;
font-size: 14px; font-size: 14px;
font-weight: bolder;
width: 75%; width: 75%;
height: 4vh; height: 4vh;
padding: 3px; padding: 3px;
margin-top:1vh;
border: solid #67878A 1px; border: solid #67878A 1px;
text-decoration: none; text-decoration: none;
} }
.btn:hover { .btn:hover {
background: #0D4A4D; background: #0D4A4D;
text-decoration: none; text-decoration: none;
} }
.tool-header { font-weight: bold; padding-top: 5vh; display: block; }
.toolsep { margin-right: 1vw; padding:0; padding-top: 1vh; padding-bottom: 2.5vh; border-bottom: 1px #AAA solid; height: 1vh; display: block; width: 64%;}
.calc_data { padding-top: 2.5vh; font-size: 0.9em; }
</style> </style>
</head> </head>
<body> <body>
@ -105,16 +112,47 @@
<div id="controls" class="wvg-controls active"> <div id="controls" class="wvg-controls active">
<div id="wrapper"> <div id="wrapper">
<ul class="wvg-navbar"> <ul class="wvg-navbar">
<li><a class="wvg-tablink wvg-tab-active" href='#' onclick="openTab(event,'Find');">Find</a></li> <li><a class="wvg-tablink wvg-tab-active" href='#' onclick="openTab(event,'Find');">Find & Calc</a></li>
<!-- <li><a class="wvg-tablink" href='#' onclick="openTab(event,'Tools');">Tools</a></li> -->
<li><a class="wvg-tablink" href='#' onclick="openTab(event,'Info');">Info</a></li> <li><a class="wvg-tablink" href='#' onclick="openTab(event,'Info');">Info</a></li>
</ul> </ul>
<div class="wvg-tools wvg-first" id="Find"> <div class="wvg-tools wvg-first" id="Find">
<span> Find Object By Name </span> <span class="tool-header"> Find Object By Name </span>
<span> <select id="findbyselect"> <span>
<select id="findbyselect">
<option value=''></option> <option value=''></option>
</select> </span> </select> <br />
<br/><input type="checkbox" name="objtype" id="cbp" value="planets" onclick="populateUserFields();"><label for="cbp"> Planets</label> <input type="checkbox" name="objtype" id="cbs" value="stations" onclick="populateUserFields();"> <label for="cbs">Stations</label> <input type="checkbox" name="objtype" id="cbp" value="planets" checked><label for="cbp"> Planets</label> <input type="checkbox" name="objtype" id="cbs" value="stations" onclick="populateUserFields();"> <label for="cbs">Stations</label>
<br /><button id="submitfindbyname" class="btn">Find</button> <button id="submitfindbyname" class="btn">Find</button>
</span>
<span class="toolsep"></span>
<span class="tool-header"> Travel Time & Distances </span>
<span>
<label for="pointa">Point A</label>
<select id="pointa" name="Point_A">
<!-- Options will generated in code -->
</select>
<br />
<label for="pointb"> Point B </label>
<select id="pointb" name="Point_B">
<!-- Options will generated in code -->
</select>
<label for="speed">Travel Speed</label>
<input type="text" id="speed" value="14">
<select id="speedunit" name="Speed Unit">
<option value='WF'>Warp Factor</option>
<option value='PC/s'>PC/s</option>
<option value='SU/s'>SU/s</option>
</select>
<br />
<button id="calctnd" class="btn">Calculate</button>
</span>
<span class="calc_data"><br />
From: <u><i id="cal_start">Empty</i></u> <br />
To: <u><i id="cal_end">Empty</i></u><br />
Distance: <u><i id="cal_dist">Unknown</i></u><br />
ETA @ <u><i id="cal_speed">Unknown</i></u> : <u><i id="cal_eta">Unknown</i></u>
</span>
</div> </div>
<div class="wvg-tools" id="Info"> <div class="wvg-tools" id="Info">
<span> This tool was designed by Frey @ ATSMUSH. It is based on MapView for ATS with data used from the Navcomp MUSHClient plugin with permission. </span> <span> This tool was designed by Frey @ ATSMUSH. It is based on MapView for ATS with data used from the Navcomp MUSHClient plugin with permission. </span>