var fonction3D = false; var outilPrecedent = ""; function activer3D(){ if(fonction3D){ // Si activé alors on le désative fonction3D = false; outil.choisir(outilPrecedent); document.getElementById('onglet3D').innerHTML = "3D"; document.getElementById('zoomButtons').style.display = "block"; document.getElementById('toolButtons').style.display = "block"; affichage.init(); outil.init(); affichage.initZoom2(document.getElementById('zoomDefaut').value); } else{ // Sinon on l'active fonction3D = true; outilPrecedent = outil.actuel; outil.choisir("deplacement"); document.getElementById('onglet3D').innerHTML = "2D"; document.getElementById('zoomButtons').style.display = "none"; document.getElementById('toolButtons').style.display = "none"; display3D.init(); outil.liste = []; outil.init(); message.supprimer(); } cacherMenu(); if(fonction3D){ if(document.getElementById('input3D').value == ""){ afficherMenu('menuFonctions3D'); } else{ display3D.draw(); } } saveOptions(); } var display3D = { canvas: null, ctx: null, width: 0, height: 0, centerX: 0, centerY: 0, scale: 50, linePrecision: 0.02, functionPrecision: 0.2, angle: Math.PI/8, zoomValue: 1, left: -6.5, right: 6.5, rouge3D: 0, vert3D: 1, bleu3D: 2, couleurGenerale: 0, background: "rgba(0, 0, 0, 0.5)", init: function(width, height){ var displayElement = document.getElementById("affichage"); // Clear displayElement content if(displayElement.hasChildNodes()){ while(displayElement.childNodes.length >= 1 ){ displayElement.removeChild(displayElement.firstChild); } } // Setup sizes this.width = width || displayElement.clientWidth; this.height = height || displayElement.clientHeight; this.centerX = this.width / 2; this.centerY = this.height / 2; // Create canvas this.canvas = document.createElement("canvas"); this.canvas.width = this.width; this.canvas.height = this.height; displayElement.appendChild(this.canvas); this.ctx = this.canvas.getContext('2d'); this.clear(); }, clear: function(){ var ctx = this.ctx; ctx.clearRect(0, 0, this.width, this.height); ctx.fillStyle = this.background; ctx.fillRect(0, 0, this.width, this.height); this.axes(); }, draw: function(){ // var ti = new Date().getTime(); // this.init(); this.clear(); var txtFct = fct.remplacer(fct.verifier(document.getElementById("input3D").value)); if(txtFct == ""){ return; } var func = new CartesianFunction(txtFct); if(document.getElementById("selectAffichage3D").value == "points"){ var coordX, coordY, coordZ; for(var x=this.left; xthis.left; x1-=this.functionPrecision){ for(var y1=this.right; y1>this.left; y1-=this.functionPrecision){ x = x1; y = y1; z1 = func.f(x,y); x2 = x1 - this.functionPrecision; y2 = y1; x = x2; //y = y2; z2 = func.f(x,y); x3 = x2; y3 = y2 - this.functionPrecision; //x = x3; y = y3; z3 = func.f(x,y); x4 = x3 + this.functionPrecision; y4 = y3; x = x4; //y = y4; z4 = func.f(x,y); if(isNaN(z1)||isNaN(z2)||isNaN(z3)||isNaN(z4)){ continue; } this.polygone3D(x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4); } } } } // var tf = new Date().getTime(); // window.console.log(tf-ti); }, // Dessine un point à la position (x, y, z) point3D: function(x, y, z){ var posX = (Math.sin(this.angle)*x + Math.cos(this.angle)*y)*this.scale; var posZ = -(z - Math.cos(this.angle)*x/2.6 + Math.sin(this.angle)*y/2.6)*this.scale; var opacity = Math.round((1-((5+y*Math.sin(this.angle)-x*Math.cos(this.angle)) / 450)*this.scale)*1000)/1000; var couleur = new Array(); couleur[0] = Math.round((5+z)*this.scale); couleur[1] = Math.round(510 - (5+z)*this.scale); couleur[2] = this.couleurGenerale; if(opacity > 1){ opacity = 1; } if(opacity < 0){ opacity = 0; } if(couleur[0] > 255){ couleur[0] = 255; } if(couleur[0] < 0){ couleur[0] = 0; } if(couleur[1] > 255){ couleur[1] = 255; } if(couleur[1] < 0){ couleur[1] = 0; } var ctx = this.ctx; ctx.save(); ctx.translate(this.centerX, this.centerY); ctx.scale(this.zoomValue, this.zoomValue); ctx.fillStyle = "rgba("+couleur[this.rouge3D]+","+couleur[this.vert3D]+", "+couleur[this.bleu3D]+", "+opacity+")"; ctx.fillRect(posX-1, posZ-1, 2, 2); ctx.restore(); }, // Dessine un polygone qui a comme sommets : (x1, y1, z1) , (x2, y2, z2), (x3, y3, z3) et (x4, y4, z4) polygone3D: function(x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4){ var ctx = this.ctx; ctx.save(); ctx.translate(this.centerX, this.centerY); ctx.scale(this.zoomValue, this.zoomValue); ctx.beginPath(); ctx.moveTo((Math.sin(this.angle)*x1 + Math.cos(this.angle)*y1)*this.scale , -(z1 - Math.cos(this.angle)*x1/2.6 + Math.sin(this.angle)*y1/2.6)*this.scale); ctx.lineTo((Math.sin(this.angle)*x2 + Math.cos(this.angle)*y2)*this.scale , -(z2 - Math.cos(this.angle)*x2/2.6 + Math.sin(this.angle)*y2/2.6)*this.scale); ctx.lineTo((Math.sin(this.angle)*x3 + Math.cos(this.angle)*y3)*this.scale , -(z3 - Math.cos(this.angle)*x3/2.6 + Math.sin(this.angle)*y3/2.6)*this.scale); ctx.lineTo((Math.sin(this.angle)*x4 + Math.cos(this.angle)*y4)*this.scale , -(z4 - Math.cos(this.angle)*x4/2.6 + Math.sin(this.angle)*y4/2.6)*this.scale); var opacity = Math.round((1-((5+y1*Math.sin(this.angle)-x1*Math.cos(this.angle)) / 450)*this.scale)*1000)/1000; var couleur = new Array(); couleur[0] = Math.round((5+z1)*this.scale); couleur[1] = Math.round(510 - (5+z1)*this.scale); couleur[2] = this.couleurGenerale; if(opacity > 1){ opacity = 1; } if(opacity < 0){ opacity = 0; } // for(var i=0; i 255){ couleur[0] = 255; } if(couleur[0] < 0){ couleur[0] = 0; } if(couleur[1] > 255){ couleur[1] = 255; } if(couleur[1] < 0){ couleur[1] = 0; } ctx.fillStyle = "rgba("+couleur[this.rouge3D]+","+couleur[this.vert3D]+", "+couleur[this.bleu3D]+", "+opacity+")"; ctx.strokeStyle = "rgba(0,0,0,0.1)"; ctx.closePath(); ctx.fill(); ctx.stroke(); ctx.restore(); }, // Dessine les axes axes: function(){ for(var i=-5; i<5; i+=this.linePrecision){ this.point3D(0, 0, i); } for(var i=-5.5; i<5.5; i+=this.linePrecision){ this.point3D(i, 0, 0); } for(var i=-5.5; i<5.5; i+=this.linePrecision){ this.point3D(0, i, 0); } }, cube: function(x, y, z, r){ // Face de devant for(var i=0; i 255){ this.couleurGenerale = 255; } switch(document.getElementById("selectRouge3D").value){ case "plus": this.rouge3D = 0; rouge = 255; sensRouge = -1; break; case "moins": this.rouge3D = 1; rouge = 0; sensRouge = 1; break; case "tout": this.rouge3D = 2; rouge = this.couleurGenerale; sensRouge = 0; break; } switch(document.getElementById("selectVert3D").value){ case "plus": this.vert3D = 0; vert = 255; sensVert = -1; break; case "moins": this.vert3D = 1; vert = 0; sensVert = 1; break; case "tout": this.vert3D = 2; vert = this.couleurGenerale; sensVert = 0; break; } switch(document.getElementById("selectBleu3D").value){ case "plus": this.bleu3D = 0; bleu = 255; sensBleu = -1; break; case "moins": this.bleu3D = 1; bleu = 0; sensBleu = 1; break; case "tout": this.bleu3D = 2; bleu = this.couleurGenerale; sensBleu = 0; break; } document.getElementById("apercuCouleur3D").innerHTML = "."; for(var i=0; i."; } if(this.ctx){ this.draw(); } }, zoom: function(value){ if(!fonction3D){ return; } this.zoomValue *= value; this.left /= value; this.right /= value; this.functionPrecision /= value; this.linePrecision /= value; //alert(this.zoomValue+" ; "+this.left+" ; "+this.right+" ; "+this.functionPrecision+" ; "+this.linePrecision); this.draw(); }, move: function(value){ this.angle += Math.PI/32 * value; this.draw(); }, initZoom: function(){ this.angle = Math.PI/8; this.zoomValue = 1; this.left = -6.5; this.right = 6.5; this.draw(); } };