You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
226 lines
5.7 KiB
226 lines
5.7 KiB
|
|
var fct = {
|
|
list : [],
|
|
couleur : "rgba(193,255,0,1)",
|
|
colorsList : ["rgba(255,0,0,1)","rgba(255,128,0,1)","rgba(255,255,0,1)","rgba(128,255,0,1)","rgba(0,255,0,1)","rgba(0,255,128,1)","rgba(0,255,255,1)","rgba(0,128,255,1)","rgba(0,0,255,1)","rgba(128,0,255,1)","rgba(255,0,255,1)","rgba(255,0,128,1)"],
|
|
interdit : [";", "interdit", "'", '"', "eval", "new", "uniboard", "sankore", "=", "document", "window", "alert", "fct", "affichage", "colorPicker", "languages"],
|
|
|
|
functionFromObject: function(f){
|
|
if(f.type == "cartesian"){
|
|
return new CartesianFunction().set(f);
|
|
}
|
|
else if(f.type == "implicit"){
|
|
return new ImplicitFunction().set(f);
|
|
}
|
|
else if(f.type == "polar"){
|
|
return new PolarFunction().set(f);
|
|
}
|
|
else if(f.type == "parametric"){
|
|
return new ParametricFunction().set(f);
|
|
}
|
|
console.err("Unknown function:", f);
|
|
},
|
|
|
|
addCartesian : function(txt){
|
|
var txtFct = this.remplacer(this.verifier(txt));
|
|
if(txtFct == ""){
|
|
return false;
|
|
}
|
|
|
|
var f = new CartesianFunction(txtFct);
|
|
this.add(f, true);
|
|
|
|
return true;
|
|
},
|
|
|
|
addImplicit : function(txtFct){
|
|
var equalPos = txtFct.indexOf("=");
|
|
if(equalPos >= 0){
|
|
txtFct = txtFct.replace("=", "-(") + ")";
|
|
}
|
|
txtFct = this.remplacer(this.verifier(txtFct));
|
|
if(txtFct == ""){
|
|
return false;
|
|
}
|
|
|
|
var f = new ImplicitFunction(txtFct);
|
|
this.add(f, true);
|
|
|
|
return true;
|
|
},
|
|
|
|
addPolar : function(txt){
|
|
var txtFct = this.remplacer(this.verifier(txt));
|
|
if(txtFct == ""){
|
|
return false;
|
|
}
|
|
|
|
var f = new PolarFunction(txtFct);
|
|
this.add(f, true);
|
|
|
|
return true;
|
|
},
|
|
|
|
addParametric : function(txtX, txtY){
|
|
var fctX = this.remplacer(this.verifier(txtX));
|
|
var fctY = this.remplacer(this.verifier(txtY));
|
|
if(fctX == "" || fctY == ""){
|
|
return false;
|
|
}
|
|
|
|
var f = new ParametricFunction(fctX, fctY);
|
|
this.add(f, true);
|
|
|
|
return true;
|
|
},
|
|
|
|
add : function(f, useRandomColor){
|
|
this.list.unshift(f);
|
|
if(useRandomColor){
|
|
f.couleur = this.colorsList[alea(0,this.colorsList.length-1)];
|
|
}
|
|
historique.ajouter(f);
|
|
this.updateList();
|
|
editeur.editer(0);
|
|
},
|
|
|
|
ajouter : function(){
|
|
var type = document.getElementById("functionType").value;
|
|
if(type == "cartesian"){
|
|
var input = document.getElementById("input");
|
|
if(this.addCartesian(input.value)){
|
|
input.value = "";
|
|
}
|
|
}
|
|
else if(type == "implicit"){
|
|
var input = document.getElementById("implicitInput");
|
|
if(this.addImplicit(input.value)){
|
|
input.value = "";
|
|
}
|
|
}
|
|
else if(type == "polar"){
|
|
var input = document.getElementById("polarInput");
|
|
if(this.addPolar(input.value)){
|
|
input.value = "";
|
|
}
|
|
}
|
|
else if(type == "parametric"){
|
|
var inputX = document.getElementById("parametricInputX");
|
|
var inputY = document.getElementById("parametricInputY");
|
|
if(this.addParametric(inputX.value, inputY.value)){
|
|
inputX.value = "";
|
|
inputY.value = "";
|
|
}
|
|
}
|
|
},
|
|
|
|
changeType : function(type){
|
|
document.getElementById("cartesianDiv").style.display = "none";
|
|
document.getElementById("implicitDiv").style.display = "none";
|
|
document.getElementById("polarDiv").style.display = "none";
|
|
document.getElementById("parametricDiv").style.display = "none";
|
|
document.getElementById(type+"Div").style.display = "initial";
|
|
},
|
|
|
|
enlever : function(id){
|
|
this.list.splice(id, 1);
|
|
this.updateList();
|
|
},
|
|
|
|
dupliquer : function(id){
|
|
var newFct = this.functionFromObject(this.list[id].get());
|
|
newFct.couleur = this.colorsList[alea(0,this.colorsList.length-1)];
|
|
this.list.splice(id+1, 0, newFct);
|
|
this.updateList();
|
|
},
|
|
|
|
etudier : function(id){
|
|
etude.etudier(this.list[id].fct);
|
|
afficherMenu("menuEtude");
|
|
},
|
|
|
|
updateList : function(){
|
|
var texteFctSupp = "";
|
|
for(var i=0; i<this.list.length; i++){
|
|
var className = "spanFonction";
|
|
if(i == editeur.idFct){
|
|
className += " spanFonctionSelect";
|
|
}
|
|
texteFctSupp += '<div class="'+className+'" onclick="editeur.editer('+i+')" style="text-shadow: 0px 0px 3px '+this.list[i].couleur+'">'+this.list[i].fct+'</div>';
|
|
}
|
|
document.getElementById("fonctionsSupp").innerHTML = texteFctSupp;
|
|
affichage.dessiner();
|
|
saveOptions();
|
|
},
|
|
|
|
verifier : function(txtFonction){
|
|
for(var i=0; i<this.interdit.length; i++){
|
|
var condition = "";
|
|
for(var k=0; k<this.interdit[i].length; k++){
|
|
if(k==0){
|
|
condition = condition + "txtFonction.charAt(j) == this.interdit[i].charAt(0)";
|
|
}
|
|
else{
|
|
condition = condition + "&& txtFonction.charAt(j+"+k+") == this.interdit[i].charAt("+k+")";
|
|
}
|
|
}
|
|
for(var j=0; j<txtFonction.length; j++){
|
|
if(eval(condition)){
|
|
document.getElementById("spanFctInterdite").innerHTML = this.interdit[i];
|
|
afficherMenu("fctInterdite");
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
return txtFonction;
|
|
},
|
|
|
|
remplacer : function(txtFonction){
|
|
// Remplace a^b par pow(a, b)
|
|
var start = 0;
|
|
var end = 0;
|
|
var pos1, pos2;
|
|
|
|
while(true){
|
|
// start = end;
|
|
end = txtFonction.indexOf("^",0);
|
|
if(end != -1){
|
|
pos1 = txtFonction.getLastIndexOf(["+", "-", "*", "/", "%", "(", ","], start, end);
|
|
if(pos1 == -1){
|
|
pos1 = start-1;
|
|
}
|
|
|
|
pos2 = txtFonction.getIndexOf(["+", "-", "*", "/", "%", "^"], end+1);
|
|
if(pos2 == -1){
|
|
pos2 = txtFonction.length;
|
|
}
|
|
|
|
txtFonction = txtFonction.substring(0,pos1+1)+"pow("+txtFonction.substring(pos1+1,end)+","+txtFonction.substring(end+1,pos2)+")"+txtFonction.substring(pos2,txtFonction.length);
|
|
// alert(txtFonction)
|
|
}
|
|
else{
|
|
break;
|
|
}
|
|
}
|
|
return txtFonction;
|
|
},
|
|
|
|
get : function(){
|
|
var list = [];
|
|
for(var i=0; i<this.list.length; i++){
|
|
list.push(this.list[i].get());
|
|
}
|
|
return {list: list};
|
|
},
|
|
|
|
set: function(obj){
|
|
var list = obj.list;
|
|
for(var i=0; i<list.length; i++){
|
|
this.list.push(fct.functionFromObject(list[i]));
|
|
}
|
|
this.updateList();
|
|
if(this.list.length > 0){
|
|
editeur.editer(0);
|
|
}
|
|
}
|
|
};
|
|
|