Web/erzekelo/javascript.js
2021-11-02 07:56:51 +01:00

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];
}