372 lines
12 KiB
JavaScript
372 lines
12 KiB
JavaScript
class Sensor {
|
|
constructor(id, posx, posy, angle, anglerad) {
|
|
this.id= id;
|
|
this.posx=posx;
|
|
this.posy=posy;
|
|
this.angle=angle;
|
|
this.anglerad = anglerad;
|
|
}
|
|
}
|
|
|
|
class Ray {
|
|
constructor(id, signal, angle){
|
|
this.id = id;
|
|
this.signal = signal;
|
|
this.angle = angle;
|
|
}
|
|
}
|
|
|
|
var sensorData ="";
|
|
var sensors = [];
|
|
var rays = [];
|
|
var canvas;
|
|
var ctx;
|
|
var grid;
|
|
var ctxFOV = "rgba(0,0,255,0.1)";
|
|
var sensorChecker = "";
|
|
var previousx = 0;
|
|
var previousy = 0;
|
|
|
|
function getSensor() {
|
|
var xhr = new XMLHttpRequest();
|
|
xhr.onreadystatechange = function() {
|
|
if (this.readyState == 4 && this.status == 200) {
|
|
if (this.status == 200) {
|
|
sensorData = this.responseText;
|
|
splitSensorData(sensorData);
|
|
start();
|
|
}
|
|
}
|
|
};
|
|
xhr.open('POST', 'http://bitkozpont.mik.uni-pannon.hu/Vigyazz3SensorData.php', true);
|
|
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
|
|
xhr.send(JSON.stringify({
|
|
request: 'sensors'
|
|
}));
|
|
}
|
|
|
|
function getSensorDataV1() {
|
|
if (previousx != aFeherHatteruKozepenElhelyezkedoNegyzetAlakuVaszononMegjelenitettTelitettFeketenKitoltottKorVizszintesPozicioja || previousy != aFeherHatteruKozepenElhelyezkedoNegyzetAlakuVaszononMegjelenitettTelitettFeketenKitoltottKorFuggolegesPozicioja)
|
|
{
|
|
var xhr = new XMLHttpRequest();
|
|
xhr.onreadystatechange = function() {
|
|
if (this.readyState == 4 && this.status == 200) {
|
|
if (this.status == 200) {
|
|
sensorChecker = this.responseText;
|
|
splitDetectedSensorData(sensorChecker);
|
|
}
|
|
}
|
|
};
|
|
xhr.open('POST', 'http://bitkozpont.mik.uni-pannon.hu/Vigyazz3SensorData.php', true);
|
|
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
|
|
xhr.send(JSON.stringify({
|
|
request: 'sensordata',
|
|
version: 1,
|
|
posx: aFeherHatteruKozepenElhelyezkedoNegyzetAlakuVaszononMegjelenitettTelitettFeketenKitoltottKorVizszintesPozicioja,
|
|
posy: aFeherHatteruKozepenElhelyezkedoNegyzetAlakuVaszononMegjelenitettTelitettFeketenKitoltottKorFuggolegesPozicioja
|
|
}));
|
|
}
|
|
previousx = aFeherHatteruKozepenElhelyezkedoNegyzetAlakuVaszononMegjelenitettTelitettFeketenKitoltottKorVizszintesPozicioja;
|
|
previousy = aFeherHatteruKozepenElhelyezkedoNegyzetAlakuVaszononMegjelenitettTelitettFeketenKitoltottKorFuggolegesPozicioja;
|
|
}
|
|
|
|
function getSensorDataV2() {
|
|
var xhr = new XMLHttpRequest();
|
|
xhr.onreadystatechange = function() {
|
|
if (this.readyState == 4 && this.status == 200) {
|
|
if (this.status == 200) {
|
|
sensorChecker = this.responseText;
|
|
splitDetectedSensorData(sensorChecker);
|
|
}
|
|
}
|
|
};
|
|
xhr.open('POST', 'http://bitkozpont.mik.uni-pannon.hu/Vigyazz3SensorData.php', true);
|
|
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
|
|
xhr.send(JSON.stringify({
|
|
request: 'sensordata',
|
|
version: 2,
|
|
}));
|
|
}
|
|
//R.I.P nyikon dzsézönje :D
|
|
|
|
|
|
// function splitSensorData(rtrnValue){
|
|
// var str = rtrnValue.split("[")[1].split("]")[0];
|
|
// var snsrs = str.split("}");
|
|
// var sensors = [];
|
|
// for (var i = 0; i < snsrs.length - 1; i++){
|
|
// sensor = snsrs[i].split("{")[1];
|
|
// var data = sensor.split(",");
|
|
// sensors.push(new Sensor(data[0].split(":")[1], data[1].split(":")[1], data[2].split(":")[1], data[3].split(":")[1]), data[4].split(":")[1]);
|
|
// }
|
|
//
|
|
//
|
|
// for (var i = 0; i < sensors.length; i++){
|
|
// alert(sensors[i].id + ";", sensors[i].posx + ";", sensors[i].posy + ";", sensors[i].angle + ";", sensors[i].anglerad + ";");
|
|
// }
|
|
// }
|
|
|
|
function splitSensorData(json_text){
|
|
var jsn = JSON.parse(json_text);
|
|
for (var i = 0; i < 4; i++) {
|
|
var sensor = jsn.data[i];
|
|
|
|
sensors.push(new Sensor(sensor.id, sensor.posx, sensor.posy, sensor.angle, sensor.anglerad));
|
|
}
|
|
}
|
|
|
|
var startX1;
|
|
var startY1;
|
|
var startX2;
|
|
var startY2;
|
|
var endX1;
|
|
var endY1;
|
|
var endX2;
|
|
var endY2;
|
|
var rectX;
|
|
var rectY;
|
|
|
|
function splitDetectedSensorData(json_text){
|
|
var sensorCount = 0;
|
|
var rayIDs = [];
|
|
rays = [];
|
|
var jsn = JSON.parse(json_text);
|
|
for (var i = 0; i < 4; i++) {
|
|
var ray = jsn.data[i];
|
|
rays.push(new Ray(ray.id, ray.signal, ray.angle));
|
|
// console.log(rays[i].id + ";" + rays[i].signal + ";" + rays[i].angle);
|
|
if (ray.signal && sensorCount < 2) {
|
|
rayIDs[sensorCount] = ray.id;
|
|
sensorCount++;
|
|
}
|
|
}
|
|
if (sensorCount == 2)
|
|
{ //Ilyeneket nem tanultunk!
|
|
startX1 = sensors[rayIDs[0]].posx;
|
|
startY1 = sensors[rayIDs[0]].posy;
|
|
startX2 = sensors[rayIDs[1]].posx;
|
|
startY2 = sensors[rayIDs[1]].posy;
|
|
endX1 = startX1 + Math.cos((sensors[rayIDs[0]].angle + rays[rayIDs[0]].angle) * Math.PI / 180) * 400;
|
|
endY1 = startY1 + Math.sin((sensors[rayIDs[0]].angle + rays[rayIDs[0]].angle) * Math.PI / 180) * 400;
|
|
endX2 = startX2 + Math.cos((sensors[rayIDs[1]].angle + rays[rayIDs[1]].angle) * Math.PI / 180) * 400;
|
|
endY2 = startY2 + Math.sin((sensors[rayIDs[1]].angle + rays[rayIDs[1]].angle) * Math.PI / 180) * 400;
|
|
//console.log(startX1 + ", " + startY1 + " " + endX1 + ", " + endY1 + " " + startX2 + ", " + startY2 + " " + endX2 + ", " + endY2);
|
|
|
|
// var b_angle = 90 - rays[rayIDs[0]].angle + sensors[rayIDs[0]].angle;
|
|
// var a_side = (Math.sin(sensors[rayIDs[0]].angle + rays[rayIDs[0]].angle*Math.PI/180) * 400) / Math.sin(90*Math.PI/180);
|
|
// var b_side = (Math.sin(b_angle*Math.PI/180) * 400) / Math.sin(90*Math.PI/180);
|
|
//
|
|
// endX1 = startX1 + b_side;
|
|
// endY1 = startY1 + a_side;
|
|
//
|
|
// var b_angle = 90 - rays[rayIDs[1]].angle + sensors[rayIDs[0]].angle;
|
|
// var a_side = (Math.sin(sensors[rayIDs[0]].angle + rays[rayIDs[1]].angle*Math.PI/180) * 400) / Math.sin(90*Math.PI/180);
|
|
// var b_side = (Math.sin(b_angle*Math.PI/180) * 400) / Math.sin(90*Math.PI/180);
|
|
|
|
// endX2 = startX2 + b_side;
|
|
// endY2 = startY2 + a_side;
|
|
var pos = detectIntersection(startX1, startY1, endX1, endY1, startX2, startY2, endX2, endY2);
|
|
drawSquare(Math.floor(pos[0] / 100) * 100, Math.floor(pos[1] / 100) * 100);
|
|
rectX = Math.floor(pos[0] / 100) * 100;
|
|
rectY = Math.floor(pos[1] / 100) * 100;
|
|
}
|
|
else {
|
|
rectX = -101;
|
|
rectY = -101;
|
|
}
|
|
}
|
|
function start() {
|
|
modal();
|
|
canvas = document.getElementById("myCanvas");
|
|
ctx = canvas.getContext("2d");
|
|
grid = canvas.getContext("2d");
|
|
versionPicker();
|
|
var canvasRefresher = setInterval(refreshCanvas, 35);
|
|
}
|
|
|
|
function refreshCanvas() {
|
|
var canvasHeight=canvas.offsetHeight;
|
|
var canvasWidth=canvas.offsetWidth;
|
|
ctx.clearRect(0, 0, canvasHeight, canvasWidth);
|
|
drawGrid();
|
|
drawFOV();
|
|
drawDetection();
|
|
drawSensors();
|
|
drawSquare();
|
|
if (version){
|
|
drawCircle();
|
|
}
|
|
}
|
|
|
|
function drawSquare() {
|
|
ctx.fillStyle = "rgba(255, 255, 0, 0.6)";
|
|
ctx.fillRect(rectX + 1, rectY + 1, 99, 99);
|
|
}
|
|
|
|
function drawGrid(){
|
|
var p = 0;
|
|
for (var x = 0; x <= 500; x += 100) {
|
|
grid.moveTo(0.5 + x + p, p);
|
|
grid.lineTo(0.5 + x + p, 500 + p);
|
|
}
|
|
|
|
for (var x = 0; x <= 500; x += 100) {
|
|
grid.moveTo(p, 0.5 + x + p);
|
|
grid.lineTo(500 + p, 0.5 + x + p);
|
|
}
|
|
grid.strokeStyle = "black";
|
|
grid.stroke();
|
|
}
|
|
|
|
function drawSensors() {
|
|
ctx.fillStyle = "darkred";
|
|
for (var si=0; si<sensors.length; si++){
|
|
var anglerad=sensors[si].angle*Math.PI/180;
|
|
ctx.beginPath();
|
|
ctx.arc(sensors[si].posx, sensors[si].posy, 10, 0, 2 * Math.PI);
|
|
ctx.fill();
|
|
var jsAngleStart=anglerad-Math.PI/4;
|
|
var jsAngleEnd=anglerad+Math.PI/4;
|
|
if (jsAngleStart<0) jsAngleStart+=Math.PI*2;
|
|
else if (jsAngleStart>Math.PI*2) jsAngleStart-=Math.PI*2;
|
|
if (jsAngleEnd<0) jsAngleEnd+=Math.PI*2;
|
|
else if (jsAngleEnd>Math.PI*2) jsAngleEnd-=Math.PI*2;
|
|
ctx.beginPath();
|
|
ctx.moveTo(sensors[si].posx, sensors[si].posy);
|
|
ctx.lineTo(sensors[si].posx+Math.cos(anglerad-Math.PI/4)*20, sensors[si].posy+Math.sin(anglerad-Math.PI/4)*20);
|
|
ctx.lineTo(sensors[si].posx+Math.cos(anglerad+Math.PI/4)*20, sensors[si].posy+Math.sin(anglerad+Math.PI/4)*20);
|
|
ctx.lineTo(sensors[si].posx, sensors[si].posy);
|
|
ctx.fill();
|
|
}
|
|
}
|
|
|
|
function drawFOV() {
|
|
ctx.fillStyle = ctxFOV;
|
|
for (var i = 0; i < 4; i++)
|
|
{
|
|
ctx.moveTo(sensors[i].posx, sensors[i].posy);
|
|
ctx.beginPath();
|
|
ctx.arc(sensors[i].posx, sensors[i].posy, 400, (sensors[i].angle - 45) * Math.PI / 180, (sensors[i].angle + 45) * Math.PI / 180);
|
|
ctx.lineTo(sensors[i].posx, sensors[i].posy);
|
|
ctx.fill();
|
|
};
|
|
}
|
|
|
|
function fovonoff() {
|
|
if (document.getElementById("fovswitch").checked)
|
|
{
|
|
ctxFOV = "rgba(0,0,255,0.1)";
|
|
}
|
|
else {
|
|
ctxFOV = "rgba(0,0,0,0)";
|
|
}
|
|
}
|
|
|
|
var refreshSensorData2;
|
|
var refreshSensorData1;
|
|
function versionPicker() {
|
|
if (document.getElementById("versionswitch").checked)
|
|
{
|
|
clearInterval(refreshSensorData1);
|
|
getSensorDataV2();
|
|
refreshSensorData2 = setInterval(getSensorDataV2, 1000);
|
|
version = false;
|
|
}
|
|
else {
|
|
clearInterval(refreshSensorData2);
|
|
refreshSensorData1 = setInterval(getSensorDataV1, 35);
|
|
version = true;
|
|
}
|
|
}
|
|
|
|
function drawDetection() {
|
|
ctx.fillStyle = "rgba(255,0,0,0.2)";
|
|
for (var i = 0; i < 4; i++)
|
|
{
|
|
if (rays[i] != undefined) {
|
|
if (rays[i].signal) {
|
|
ctx.moveTo(sensors[i].posx, sensors[i].posy);
|
|
ctx.beginPath();
|
|
ctx.arc(sensors[i].posx, sensors[i].posy, 400, (sensors[i].angle + rays[i].angle - 2) * Math.PI / 180, (sensors[i].angle + rays[i].angle + 2) * Math.PI / 180);
|
|
ctx.lineTo(sensors[i].posx, sensors[i].posy);
|
|
ctx.fill();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
var aFeherHatteruKozepenElhelyezkedoNegyzetAlakuVaszononMegjelenitettTelitettFeketenKitoltottKorVizszintesPozicioja = 250;
|
|
var aFeherHatteruKozepenElhelyezkedoNegyzetAlakuVaszononMegjelenitettTelitettFeketenKitoltottKorFuggolegesPozicioja = 250;
|
|
|
|
function drawCircle(){
|
|
ctx.strokeStyle = "rgba(0, 0, 0, 0)";
|
|
ctx.fillStyle = "black";
|
|
ctx.beginPath();
|
|
ctx.arc(aFeherHatteruKozepenElhelyezkedoNegyzetAlakuVaszononMegjelenitettTelitettFeketenKitoltottKorVizszintesPozicioja, aFeherHatteruKozepenElhelyezkedoNegyzetAlakuVaszononMegjelenitettTelitettFeketenKitoltottKorFuggolegesPozicioja, 4, 0, Math.PI*2, true);
|
|
ctx.fill()
|
|
}
|
|
|
|
window.addEventListener("keydown", moveObject, false);
|
|
|
|
function moveObject(e) {
|
|
var step=8;
|
|
switch(e.keyCode) {
|
|
case 37:
|
|
if (aFeherHatteruKozepenElhelyezkedoNegyzetAlakuVaszononMegjelenitettTelitettFeketenKitoltottKorVizszintesPozicioja - step >= 0)
|
|
aFeherHatteruKozepenElhelyezkedoNegyzetAlakuVaszononMegjelenitettTelitettFeketenKitoltottKorVizszintesPozicioja -= step;
|
|
break;
|
|
case 38:
|
|
if (aFeherHatteruKozepenElhelyezkedoNegyzetAlakuVaszononMegjelenitettTelitettFeketenKitoltottKorFuggolegesPozicioja - step >= 0)
|
|
aFeherHatteruKozepenElhelyezkedoNegyzetAlakuVaszononMegjelenitettTelitettFeketenKitoltottKorFuggolegesPozicioja -= step;
|
|
break;
|
|
case 39:
|
|
if (aFeherHatteruKozepenElhelyezkedoNegyzetAlakuVaszononMegjelenitettTelitettFeketenKitoltottKorVizszintesPozicioja + step <= 500)
|
|
aFeherHatteruKozepenElhelyezkedoNegyzetAlakuVaszononMegjelenitettTelitettFeketenKitoltottKorVizszintesPozicioja += step;
|
|
break;
|
|
case 40:
|
|
if (aFeherHatteruKozepenElhelyezkedoNegyzetAlakuVaszononMegjelenitettTelitettFeketenKitoltottKorFuggolegesPozicioja + step <= 500)
|
|
aFeherHatteruKozepenElhelyezkedoNegyzetAlakuVaszononMegjelenitettTelitettFeketenKitoltottKorFuggolegesPozicioja += step;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
function modal() {
|
|
var modal = document.getElementById("myModal");
|
|
var btn = document.getElementById("myBtn");
|
|
var span = document.getElementsByClassName("close")[0];
|
|
|
|
btn.onclick = function() {
|
|
modal.style.display = "block";
|
|
}
|
|
span.onclick = function() {
|
|
modal.style.display = "none";
|
|
}
|
|
window.onclick = function(event) {
|
|
if (event.target == modal) {
|
|
modal.style.display = "none";
|
|
}
|
|
}
|
|
}
|
|
|
|
//[0, 0], [0, 0]
|
|
function detectIntersection(x1, y1, x2, y2, x3, y3, x4, y4){
|
|
denominator = ((y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1));
|
|
if (denominator === 0) {
|
|
return false;
|
|
}
|
|
|
|
let ua = ((x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3)) / denominator;
|
|
let ub = ((x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3)) / denominator;
|
|
|
|
if (ua < 0 || ua > 1 || ub < 0 || ub > 1) {
|
|
return false;
|
|
}
|
|
|
|
let x = x1 + ua * (x2 - x1);
|
|
let y = y1 + ua * (y2 - y1);
|
|
|
|
return [x, y];
|
|
|
|
}
|