diff --git a/Frontend Angular 4/src/app/layout/plotter/graph2D/graph2D.component.html b/Frontend Angular 4/src/app/layout/plotter/graph2D/graph2D.component.html index fc9a2b5b3800faa7479227368e0a653fade8496e..705acb8a48baccaf4c1345e53f402639ee28ed2c 100755 --- a/Frontend Angular 4/src/app/layout/plotter/graph2D/graph2D.component.html +++ b/Frontend Angular 4/src/app/layout/plotter/graph2D/graph2D.component.html @@ -1,5 +1,8 @@ <div class="card"> - <div class="card-block contenedor-canvas" > + <div class="card-block contenedor-canvas" > + <button ngbPopover="Zoom +" triggers="mouseenter:mouseleave" data-placement="bottom" class="btn btn-sm btn-secondary" style="float:right; margin-right: 165px; margin-top: -55px" (click)=zoomMas() ><i class="fa fa-plus"></i></button> + <button ngbPopover="Zoom -" data-placement="bottom" triggers="mouseenter:mouseleave" class="btn btn-sm btn-secondary" style="float:right; margin-right: 132px; margin-top: -55px" (click)=zoomMenos() ><i class="fa fa-minus"></i></button> + <div id="graph2D-container" style="height: 100%; width: 100%;"> </div> </div> diff --git a/Frontend Angular 4/src/app/layout/plotter/graph2D/graph2D.component.ts b/Frontend Angular 4/src/app/layout/plotter/graph2D/graph2D.component.ts index 57118bf4f06255b79f257e381a0df067b1b06326..25025926daf54b26edcd8700fe07f3d916c55dd4 100755 --- a/Frontend Angular 4/src/app/layout/plotter/graph2D/graph2D.component.ts +++ b/Frontend Angular 4/src/app/layout/plotter/graph2D/graph2D.component.ts @@ -1,63 +1,64 @@ import { Component } from '@angular/core'; -import { GHCIService } from '../../../shared/services/ghci.service'; -import functionPlot from 'function-plot'; - +import { GHCIService } from '../../../shared/services/ghci.service'; +import functionPlot from 'function-plot'; + @Component({ moduleId: module.id, selector: 'graph2D-component', templateUrl: './graph2D.component.html', host: { - + } }) export class Graph2DComponent { + + private instance: {}; + public constructor(private ghciService: GHCIService) { ghciService.messages.subscribe( - canvas=>{ - - if (canvas.tipo == 'graph'){ + canvas => { + + if (canvas.tipo == 'graph') { var jsonCanvas = JSON.parse(canvas.resultado); let fun = eval(this.generarFuncion(jsonCanvas)); - - var conjs = this.obtenerConjunto(jsonCanvas.funs[0]); - var d = conjs+"}"; - + var d = conjs + "}"; + var obj = JSON.parse(d); //Para las funciones - if (obj.conj.sets.fdom == "function(x)"){ + if (obj.conj.sets.fdom == "function(x)") { var nom = jsonCanvas.funs[0].dom; - var elemento = this.recursionfuncion(jsonCanvas.funs[0].sets,nom); - obj.conj.sets.fdom = function (x) { return eval(elemento)} + var elemento = this.recursionfuncion(jsonCanvas.funs[0].sets, nom); + obj.conj.sets.fdom = function (x) { return eval(elemento) } } - if (obj.conj.sets.fcod == "function(x)"){ + if (obj.conj.sets.fcod == "function(x)") { var nom = jsonCanvas.funs[0].cod; - var elemento = this.recursionfuncion(jsonCanvas.funs[0].sets,nom); - obj.conj.sets.fcod = function (x) { return (eval(elemento))} + var elemento = this.recursionfuncion(jsonCanvas.funs[0].sets, nom); + obj.conj.sets.fcod = function (x) { return (eval(elemento)) } } //para Enumerados - if(obj.conj.dom == 'Numer'){ + if (obj.conj.dom == 'Numer') { var cantElementos = obj.conj.sets.fdom.length; var j = 0; - for (var fun of obj.conj.sets.fdom) { + for (var fun of obj.conj.sets.fdom) { //var newstr = nuevo2.replace(fun, j); j = j + 1; } } - if(obj.conj.cod == 'Numer'){ + if (obj.conj.cod == 'Numer') { var cantElementos = obj.conj.sets.fcod.length; var j = 0; - for (var fun of obj.conj.sets.fcod) { + for (var fun of obj.conj.sets.fcod) { //var newstr = nuevo2.replace(fun, j); j = j + 1; } } - var colores = ['pink','red','blue','orange','green'] - var num = this.getRandomArbitrary(0,4); + var colores = ['pink', 'red', 'blue', 'orange', 'green'] + var num = this.getRandomArbitrary(0, 4); var color = colores[num]; var tipoGraf; @@ -66,192 +67,235 @@ export class Graph2DComponent { }else{ tipoGraf = 'polyline'; } - functionPlot({ - target: '#graph2D-container', - width: 620, - height: 450, - conj:obj.conj, - data: [{ - sampler: 'builtIn', - fn: function(scope) { - return fun(scope.x) - }, - graphType: tipoGraf, - color: color - }] - }) + this.instance = functionPlot({ + target: '#graph2D-container', + width: 620, + height: 450, + conj:obj.conj, + data: [{ + sampler: 'builtIn', + fn: function(scope) { + return fun(scope.x) + }, + graphType: tipoGraf, + color: color + }], + plugins: [ + functionPlot.plugins.zoomBox() + ] + }) + + // EXAMPLE - SHAPE + // this.instance = functionPlot({ + // target: '#graph2D-container', + // width: 700, + // height: 700, + // xAxis: { + // label: 'x - axis', + // scale: 'linear', + // domain: { + // initial: [-10, 10], + // type: 'discrete' + // } + // }, + // data: [{ + // shape: { + // w : 6.0, + // h : 3.0, + // x : 0, + // y : 0, + // color :"red", + // rotation : 0.125 + // }, + // graphType: 'shape', + // shapeType: 'rect' + // }], + // plugins: [ + // functionPlot.plugins.zoomBox() + // ] + // }) } - }, - error=>{ - - }) + }, + error => { + + }) + } + + public zoomMenos = function () { + this.instance.zoomOut(); } + public zoomMas = function () { + this.instance.zoomIn(); + } - getRandomArbitrary= function (min, max) { + getRandomArbitrary = function (min, max) { return Math.round(Math.random() * (max - min) + min); } - generarFuncion = function(graph) { - var funcionString = ''; - var grafica; - for (var fun of graph.funs) { - funcionString = 'var ' + fun.fun + ' = function(' + fun.args.join() + '){\n return ' + this.generarExpresion(fun.bdy) + '}\n' + funcionString; - - if (fun.fun == graph.graph) { - funcionString += 'return ' + fun.fun + '(' + fun.args.join() + ');\n' - grafica = fun; - } + + generarFuncion = function (graph) { + var funcionString = ''; + var grafica; + for (var fun of graph.funs) { + funcionString = 'var ' + fun.fun + ' = function(' + fun.args.join() + '){\n return ' + this.generarExpresion(fun.bdy) + '}\n' + funcionString; + + if (fun.fun == graph.graph) { + funcionString += 'return ' + fun.fun + '(' + fun.args.join() + ');\n' + grafica = fun; } - funcionString = '(' + grafica.args.join() + ',delta,hayPunto)=>{\n' + funcionString + '}'; - - return funcionString; } + funcionString = '(' + grafica.args.join() + ',delta,hayPunto)=>{\n' + funcionString + '}'; + + return funcionString; + } - generarExpresion = function(exp) { + generarExpresion = function (exp) { var expresion = ''; if (exp.kind == 'cnd') { - expresion = ' (' + this.generarExpresion(exp.cond) + '?' + this.generarExpresion(exp.exp1) + ':' + this.generarExpresion(exp.exp2) + ') '; + expresion = ' (' + this.generarExpresion(exp.cond) + '?' + this.generarExpresion(exp.exp1) + ':' + this.generarExpresion(exp.exp2) + ') '; } else if (exp.kind == 'bop') { - if (exp.op == '==') { - expresion = ' Math.abs((' + this.generarExpresion(exp.exp1) + ') - (' + this.generarExpresion(exp.exp2) + ')) < delta && hayPunto() '; - } else if (exp.op == '/=') { - expresion = ' Math.abs((' + this.generarExpresion(exp.exp1) + ') - (' + this.generarExpresion(exp.exp2) + ')) > delta || Math.abs((' + this.generarExpresion(exp.exp1) + ') - (' + this.generarExpresion(exp.exp2) + ')) < delta && !hayPunto() '; - } else if (exp.op == '^') { - expresion = ' Math.pow(' + this.generarExpresion(exp.exp1) + ',' + this.generarExpresion(exp.exp2) + ') '; - } else { - expresion = ' (' + this.generarExpresion(exp.exp1) + ')' + exp.op + '(' + this.generarExpresion(exp.exp2) + ') '; - } + if (exp.op == '==') { + expresion = ' Math.abs((' + this.generarExpresion(exp.exp1) + ') - (' + this.generarExpresion(exp.exp2) + ')) < delta && hayPunto() '; + } else if (exp.op == '/=') { + expresion = ' Math.abs((' + this.generarExpresion(exp.exp1) + ') - (' + this.generarExpresion(exp.exp2) + ')) > delta || Math.abs((' + this.generarExpresion(exp.exp1) + ') - (' + this.generarExpresion(exp.exp2) + ')) < delta && !hayPunto() '; + } else if (exp.op == '^') { + expresion = ' Math.pow(' + this.generarExpresion(exp.exp1) + ',' + this.generarExpresion(exp.exp2) + ') '; + } else { + expresion = ' (' + this.generarExpresion(exp.exp1) + ')' + exp.op + '(' + this.generarExpresion(exp.exp2) + ') '; + } } else if (exp.kind == 'uop') { - expresion = ' ' + exp.op + ' ' + this.generarExpresion(exp.exp) + ' '; + expresion = ' ' + exp.op + ' ' + this.generarExpresion(exp.exp) + ' '; } else if (exp.kind == 'app') { - if (exp.fun == 'cos') { - exp.fun = 'Math.cos' - } else if (exp.fun == 'sin') { - exp.fun = 'Math.sin' - } else if (exp.fun == 'round') { - exp.fun = 'Math.round' - } - expresion = ' ' + exp.fun + '(' + exp.args.map(e => this.generarExpresion(e)).join() + ') '; + + if (exp.fun == 'cos') { + exp.fun = 'Math.cos' + } else if (exp.fun == 'sin') { + exp.fun = 'Math.sin' + } else if (exp.fun == 'round') { + exp.fun = 'Math.round' + } + expresion = ' ' + exp.fun + '(' + exp.args.map(e => this.generarExpresion(e)).join() + ') '; + } else if (exp.kind == 'tup') { - expresion = ' (' + exp.exps.map(e => this.generarExpresion(e)).join() + ') '; + expresion = ' (' + exp.exps.map(e => this.generarExpresion(e)).join() + ') '; } else if (exp.kind == 'lit') { - expresion = ' ' + exp.val + ' '; + expresion = ' ' + exp.val + ' '; } else if (exp.kind == 'var') { - expresion = ' ' + exp.var+' '; + expresion = ' ' + exp.var + ' '; } else { - expresion = ' undefined '; + expresion = ' undefined '; } - + return expresion; } - - //Nuevo 20-07-2018 + + //Nuevo 20-07-2018 - obtenerConjunto= function(grf){ + obtenerConjunto = function (grf) { var setf = '\"sets\": {'; - var dominio = '{\"conj\": {'; - if (grf.dom == 'R'){ + var dominio = '{\"conj\": {'; + if (grf.dom == 'R') { dominio += "\"radio\": 0.3, \"baseDom\": \"R\", \"dom\": \"R\""; setf += "\"fdom\": \"R\","; - }else if(grf.dom == 'Z'){ + } else if (grf.dom == 'Z') { dominio += "\"radio\": 2, \"baseDom\": \"Z\", \"dom\": \"Z\""; setf += "\"fdom\": \"Z\","; - }else if(grf.dom == 'N'){ + } else if (grf.dom == 'N') { dominio += "\"radio\":2, \"baseDom\": \"N\", \"dom\": \"N\""; setf += "\"fdom\": \"N\","; - }else{ + } else { var nom = grf.dom; - if (Array.isArray(grf.sets[0][nom])){ + if (Array.isArray(grf.sets[0][nom])) { var arreglo = grf.sets[0][nom]; var arreglo2 = []; - for (var item of arreglo){ - arreglo2.push("\""+item+"\""); + for (var item of arreglo) { + arreglo2.push("\"" + item + "\""); } dominio += "\"radio\":2, \"baseDom\": \"N\", \"dom\": \"Numer\""; setf += "\"fdom\": [" + arreglo2 + "], "; - }else{ - - dominio += this.recursivoDom(grf.sets,nom); + } else { + + dominio += this.recursivoDom(grf.sets, nom); setf += "\"fdom\":\"function(x)\","; - } + } } - dominio += ", "; - if (grf.cod == 'R'){ + dominio += ", "; + if (grf.cod == 'R') { dominio += "\"baseCod\": \"R\", \"cod\": \"R\" ,"; setf += "\"fcod\": \"R\""; - }else if(grf.cod == 'Z'){ + } else if (grf.cod == 'Z') { dominio += "\"baseCod\": \"Z\", \"cod\": \"Z\" ,"; setf += "\"fcod\": \"Z\""; - }else if(grf.cod == 'N'){ + } else if (grf.cod == 'N') { dominio += "\"baseCod\": \"N\", \"cod\": \"N\" ,"; setf += "\"fcod\": \"N\""; - }else{ + } else { var nom = grf.cod; - if (Array.isArray(grf.sets[0][nom])){ + if (Array.isArray(grf.sets[0][nom])) { var arreglo = grf.sets[0][nom]; var arreglo2 = []; - for (var item of arreglo){ - arreglo2.push("\""+item+"\""); + for (var item of arreglo) { + arreglo2.push("\"" + item + "\""); } dominio += "\"baseCod\": \"N\", \"cod\": \"Numer\" ,"; - setf += '\"fcod\":[' + arreglo2+']'; - }else{ - dominio += this.recursivoCod(grf.sets,nom); + setf += '\"fcod\":[' + arreglo2 + ']'; + } else { + dominio += this.recursivoCod(grf.sets, nom); setf += "\"fcod\": \"function(x)\""; - } + } } return dominio + setf + "}}"; } - recursionfuncion = function(func,nombre){ + recursionfuncion = function (func, nombre) { var fun = func[0][nombre].set; var resul = ""; - if (fun == 'R' || fun == 'Z' || fun == 'N'){ - resul += this.generarF(func[0][nombre].cond); - }else { - resul += this.generarF(func[0][nombre].cond) + " && " + this.recursionfuncion(func,fun); - + if (fun == 'R' || fun == 'Z' || fun == 'N') { + resul += this.generarF(func[0][nombre].cond); + } else { + resul += this.generarF(func[0][nombre].cond) + " && " + this.recursionfuncion(func, fun); + } return resul; } - recursivoDom = function (sets,nom){ + recursivoDom = function (sets, nom) { var domin = ""; - if (sets[0][nom].set == 'R'){ + if (sets[0][nom].set == 'R') { domin += "\"radio\": 0.3, \"baseDom\": \"R\", \"dom\": \"Func\""; - }else if(sets[0][nom].set == 'Z'){ + } else if (sets[0][nom].set == 'Z') { domin += "\"radio\": 2, \"baseDom\": \"Z\", \"dom\": \"Func\""; - }else if(sets[0][nom].set == 'N'){ + } else if (sets[0][nom].set == 'N') { domin += "\"radio\": 2, \"baseDom\": \"N\", \"dom\": \"Func\""; - }else{ + } else { var nombre = sets[0][nom].set; - domin = this.recursivoDom(sets,nombre); + domin = this.recursivoDom(sets, nombre); } return domin; } - - recursivoCod = function (sets,nom){ + + recursivoCod = function (sets, nom) { var coodo = ""; - if (sets[0][nom].set == 'R'){ + if (sets[0][nom].set == 'R') { coodo += "\"baseCod\": \"R\", \"cod\": \"Func\","; - }else if(sets[0][nom].set == 'Z'){ + } else if (sets[0][nom].set == 'Z') { coodo += "\"baseCod\": \"Z\", \"cod\": \"Func\","; - }else if(sets[0][nom].set == 'N'){ + } else if (sets[0][nom].set == 'N') { coodo += "\"baseCod\": \"N\", \"cod\": \"Func\","; - }else{ + } else { var nombre = sets[0][nom].set; - coodo += this.recursivoDom(sets,nombre); + coodo += this.recursivoDom(sets, nombre); } return coodo; } - - generarF = function(exp) { + + generarF = function (exp) { var expresion = ''; if (exp.kind == 'cond') { - expresion = ' (' + this.generarF(exp.cond) + '?' + this.generarF(exp.exp1) + ':' + this.generarF(exp.exp2) + ') '; + expresion = ' (' + this.generarF(exp.cond) + '?' + this.generarF(exp.exp1) + ':' + this.generarF(exp.exp2) + ') '; } else if (exp.kind == 'bop') { if (exp.op == '==') { expresion = ' Math.abs((' + this.generarF(exp.exp1) + ') - (' + this.generarF(exp.exp2) + ')) == 0 '; @@ -278,15 +322,15 @@ export class Graph2DComponent { } else if (exp.kind == 'lit') { expresion = ' ' + exp.val + ' '; } else if (exp.kind == 'var') { - expresion = ' ' + exp.var+' '; + expresion = ' ' + exp.var + ' '; } else { - expresion = ' undefined '; + expresion = ' undefined '; } - + return expresion; } - generarFun = function(graph) { + generarFun = function (graph) { var funcionString = ''; var grafica; for (var fun of graph.funs) { @@ -297,10 +341,10 @@ export class Graph2DComponent { grafica = fun; } } - funcionString = '(' + grafica.args.join() + ')=>{\n' + funcionString + '}'; + funcionString = '(' + grafica.args.join() + ')=>{\n' + funcionString + '}'; return funcionString; } - + }