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.
338 lines
8.5 KiB
338 lines
8.5 KiB
6 years ago
|
|
||
|
function CartesianFunction(txtFct){
|
||
|
|
||
|
this.setFct = function(txt){
|
||
|
this.fct = txt;
|
||
|
this.f = new Function("x", "y", "return "+this.fct);
|
||
|
}
|
||
|
|
||
|
if(txtFct){
|
||
|
this.setFct(txtFct);
|
||
|
}
|
||
|
this.couleur = fct.couleur;
|
||
|
this.width = document.getElementById("inputTaille").value;
|
||
|
this.aire = document.getElementById("checkAire").checked ? true : false;
|
||
|
this.derivee1 = document.getElementById("checkDerivee1").checked ? true : false;
|
||
|
this.couleurDerivee1 = "rgba(255,128,0,1)";
|
||
|
this.derivee2 = document.getElementById("checkDerivee2").checked ? true : false;
|
||
|
this.couleurDerivee2 = "rgba(255,255,0,1)";
|
||
|
this.primitive1 = document.getElementById("checkPrimitive1").checked ? true : false;
|
||
|
this.couleurPrimitive1 = "rgba(255,50,0,1)";
|
||
|
this.conditionInitiale = 0;
|
||
|
this.style = document.getElementById("selectStyle").value;
|
||
|
|
||
|
this.getX = function(x){
|
||
|
return x;
|
||
|
};
|
||
|
|
||
|
this.getY = function(x){
|
||
|
return this.f(x);
|
||
|
};
|
||
|
|
||
|
this.set = function(f){
|
||
|
this.setFct(fct.remplacer(fct.verifier(f.fct)));
|
||
|
this.couleur = f.couleur;
|
||
|
this.couleurDerivee1 = f.couleurD1;
|
||
|
this.couleurDerivee2 = f.couleurD2;
|
||
|
this.couleurPrimitive1 = f.couleurP1;
|
||
|
this.width = f.width;
|
||
|
this.style = f.style;
|
||
|
this.aire = f.aire;
|
||
|
this.derivee1 = f.derivee1;
|
||
|
this.derivee2 = f.derivee2;
|
||
|
this.primitive1 = f.primitive1;
|
||
|
this.conditionInitiale = f.conditionInitiale;
|
||
|
return this;
|
||
|
};
|
||
|
|
||
|
this.get = function(){
|
||
|
var f = {};
|
||
|
f.type = "cartesian";
|
||
|
f.fct = this.fct;
|
||
|
f.couleur = this.couleur;
|
||
|
f.couleurD1 = this.couleurDerivee1;
|
||
|
f.couleurD2 = this.couleurDerivee2;
|
||
|
f.couleurP1 = this.couleurPrimitive1;
|
||
|
f.width = this.width;
|
||
|
f.style = this.style;
|
||
|
f.aire = this.aire;
|
||
|
f.derivee1 = this.derivee1;
|
||
|
f.derivee2 = this.derivee2;
|
||
|
f.primitive1 = this.primitive1;
|
||
|
f.conditionInitiale = this.conditionInitiale;
|
||
|
return f;
|
||
|
};
|
||
|
|
||
|
this.readableText = function(){
|
||
|
return "f(x) = " + this.fct;
|
||
|
};
|
||
|
|
||
|
this.plot = function(ctx, precision, affichage){
|
||
|
var x, y;
|
||
|
var pointX, pointY;
|
||
|
var nonDefini;
|
||
|
|
||
|
if(this.style == "points"){
|
||
|
precision *= 2;
|
||
|
}
|
||
|
|
||
|
// Dérivée première
|
||
|
if(this.derivee1){
|
||
|
ctx.beginPath();
|
||
|
ctx.strokeStyle = this.couleurDerivee1;
|
||
|
ctx.fillStyle = this.couleurDerivee1;
|
||
|
ctx.moveTo(-100,-100);
|
||
|
nonDefini = 1;
|
||
|
var pente;
|
||
|
var x0 = affichage.xGauche-precision;
|
||
|
var y0 = this.f(x0);
|
||
|
|
||
|
for(x = affichage.xGauche-precision*2; x <= affichage.xDroite+precision; x+=precision){
|
||
|
// Evaluer la valeur y du point x
|
||
|
y = this.f(x);
|
||
|
if(!isNaN(y)){
|
||
|
// Transformation des coordonnées
|
||
|
pente = (y-y0)/precision;
|
||
|
pointX = (x-precision/2 - affichage.xGauche) * affichage.multX;
|
||
|
pointY = affichage.hauteur - (pente - affichage.yBas) * affichage.multY;
|
||
|
y0 = y;
|
||
|
|
||
|
// Dessiner la dérivée
|
||
|
if(nonDefini>0){
|
||
|
nonDefini--;
|
||
|
ctx.moveTo(pointX, pointY);
|
||
|
}
|
||
|
else{
|
||
|
if(this.style == "continu"){
|
||
|
ctx.lineTo(pointX, pointY);
|
||
|
}
|
||
|
else if(this.style == "points"){
|
||
|
ctx.beginPath();
|
||
|
ctx.arc(pointX, pointY, this.width, 0, 2*Math.PI, true);
|
||
|
ctx.fill();
|
||
|
}
|
||
|
else{
|
||
|
ctx.lineTo(pointX, pointY);
|
||
|
nonDefini = 1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else{
|
||
|
nonDefini = 2;
|
||
|
}
|
||
|
}
|
||
|
if(this.style != "points"){
|
||
|
ctx.stroke();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Dérivée seconde
|
||
|
if(this.derivee2){
|
||
|
ctx.beginPath();
|
||
|
ctx.strokeStyle = this.couleurDerivee2;
|
||
|
ctx.fillStyle = this.couleurDerivee2;
|
||
|
ctx.moveTo(-100,-100);
|
||
|
nonDefini = 1;
|
||
|
var pente, pente2;
|
||
|
var x0 = affichage.xGauche-precision;
|
||
|
var y0 = this.f(x0);
|
||
|
var p0 = 0;
|
||
|
|
||
|
for(x = affichage.xGauche-precision*3; x <= affichage.xDroite+precision; x+=precision){
|
||
|
// Evaluer la valeur y du point x
|
||
|
y = this.f(x);
|
||
|
if(!isNaN(y)){
|
||
|
// Transformation des coordonnées
|
||
|
p = (y-y0)/precision;
|
||
|
pente = (p-p0)/precision;
|
||
|
pointX = (x-precision/2 - affichage.xGauche) * affichage.multX;
|
||
|
pointY = affichage.hauteur - (pente - affichage.yBas) * affichage.multY;
|
||
|
y0 = y;
|
||
|
p0 = p;
|
||
|
|
||
|
// Dessiner la dérivée seconde
|
||
|
if(nonDefini>0){
|
||
|
nonDefini--;
|
||
|
ctx.moveTo(pointX, pointY);
|
||
|
}
|
||
|
else{
|
||
|
if(this.style == "continu"){
|
||
|
ctx.lineTo(pointX, pointY);
|
||
|
}
|
||
|
else if(this.style == "points"){
|
||
|
ctx.beginPath();
|
||
|
ctx.arc(pointX, pointY, this.width, 0, 2*Math.PI, true);
|
||
|
ctx.fill();
|
||
|
}
|
||
|
else{
|
||
|
ctx.lineTo(pointX, pointY);
|
||
|
nonDefini = 1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else{
|
||
|
nonDefini = 3;
|
||
|
}
|
||
|
}
|
||
|
if(this.style != "points"){
|
||
|
ctx.stroke();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Primitive première
|
||
|
if(this.primitive1){
|
||
|
ctx.beginPath();
|
||
|
ctx.strokeStyle = this.couleurPrimitive1;
|
||
|
ctx.fillStyle = this.couleurPrimitive1;
|
||
|
ctx.moveTo(-affichage.xGauche*affichage.multX,affichage.hauteur-(this.conditionInitiale-affichage.yBas)*affichage.multY);
|
||
|
nonDefini = 0;
|
||
|
var pente, y0;
|
||
|
var conditionInitiale = this.conditionInitiale;
|
||
|
// precision /= 4;
|
||
|
|
||
|
// Partie droite
|
||
|
y0 = conditionInitiale;
|
||
|
for(x = precision; x <= affichage.xDroite+precision; x+=precision){
|
||
|
// Evaluer la valeur y du point x
|
||
|
pente = this.f(x);
|
||
|
if(!isNaN(pente)){
|
||
|
// Transformation des coordonnées
|
||
|
y = y0 + pente * precision;
|
||
|
|
||
|
pointX = (x - affichage.xGauche) * affichage.multX;
|
||
|
pointY = affichage.hauteur - (y - affichage.yBas) * affichage.multY;
|
||
|
y0 = y;
|
||
|
|
||
|
// Dessiner la primitive
|
||
|
if(nonDefini>0){
|
||
|
nonDefini--;
|
||
|
ctx.moveTo(pointX, pointY);
|
||
|
}
|
||
|
else{
|
||
|
if(this.style == "continu"){
|
||
|
ctx.lineTo(pointX, pointY);
|
||
|
}
|
||
|
else if(this.style == "points"){
|
||
|
ctx.beginPath();
|
||
|
ctx.arc(pointX, pointY, this.width, 0, 2*Math.PI, true);
|
||
|
ctx.fill();
|
||
|
}
|
||
|
else{
|
||
|
ctx.lineTo(pointX, pointY);
|
||
|
nonDefini = 1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else{
|
||
|
nonDefini = 2;
|
||
|
}
|
||
|
}
|
||
|
if(this.style != "points"){
|
||
|
ctx.stroke();
|
||
|
}
|
||
|
// Partie gauche
|
||
|
ctx.beginPath();
|
||
|
ctx.moveTo(-affichage.xGauche*affichage.multX,affichage.hauteur-(this.conditionInitiale-affichage.yBas)*affichage.multY);
|
||
|
nonDefini = 0;
|
||
|
y0 = conditionInitiale;
|
||
|
for(x = -precision; x >= affichage.xGauche-precision; x-=precision){
|
||
|
// Evaluer la valeur y du point x
|
||
|
pente = this.f(x);
|
||
|
if(!isNaN(pente)){
|
||
|
// Transformation des coordonnées
|
||
|
y = y0 - pente * precision;
|
||
|
|
||
|
pointX = (x - affichage.xGauche) * affichage.multX;
|
||
|
pointY = affichage.hauteur - (y - affichage.yBas) * affichage.multY;
|
||
|
y0 = y;
|
||
|
|
||
|
// Dessiner la primitive
|
||
|
if(nonDefini>0){
|
||
|
nonDefini--;
|
||
|
ctx.moveTo(pointX, pointY);
|
||
|
}
|
||
|
else{
|
||
|
if(this.style == "continu"){
|
||
|
ctx.lineTo(pointX, pointY);
|
||
|
}
|
||
|
else if(this.style == "points"){
|
||
|
ctx.beginPath();
|
||
|
ctx.arc(pointX, pointY, this.width, 0, 2*Math.PI, true);
|
||
|
ctx.fill();
|
||
|
}
|
||
|
else{
|
||
|
ctx.lineTo(pointX, pointY);
|
||
|
nonDefini = 1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else{
|
||
|
nonDefini = 2;
|
||
|
}
|
||
|
}
|
||
|
if(this.style != "points"){
|
||
|
ctx.stroke();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Fonction
|
||
|
ctx.beginPath();
|
||
|
ctx.lineWidth = this.width;
|
||
|
if(affichage.methode == "uniboard"){
|
||
|
ctx.lineWidth *= 3;
|
||
|
}
|
||
|
ctx.strokeStyle = this.couleur;
|
||
|
ctx.fillStyle = this.couleur;
|
||
|
ctx.moveTo(-100,-100);
|
||
|
nonDefini = true;
|
||
|
for(x = affichage.xGauche-precision; x <= affichage.xDroite+precision; x+=precision){
|
||
|
// Evaluer la valeur y du point x
|
||
|
y = this.f(x);
|
||
|
if(!isNaN(y) && y <= affichage.yHaut+Math.abs(affichage.yHaut) && y >= affichage.yBas-Math.abs(affichage.yBas)){
|
||
|
// Transformation des coordonnées
|
||
|
pointX = (x - affichage.xGauche) * affichage.multX;
|
||
|
pointY = affichage.hauteur - (y - affichage.yBas) * affichage.multY;
|
||
|
|
||
|
// Dessiner la fonction
|
||
|
if(nonDefini){
|
||
|
nonDefini = false;
|
||
|
ctx.moveTo(pointX, pointY);
|
||
|
}
|
||
|
else{
|
||
|
if(this.style == "continu"){
|
||
|
ctx.lineTo(pointX, pointY);
|
||
|
}
|
||
|
else if(this.style == "points"){
|
||
|
ctx.beginPath();
|
||
|
ctx.arc(pointX, pointY, this.width, 0, 2*Math.PI, true);
|
||
|
ctx.fill();
|
||
|
}
|
||
|
else{
|
||
|
ctx.lineTo(pointX, pointY);
|
||
|
nonDefini = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Dessiner l'aire sous la fonction
|
||
|
if(this.aire){
|
||
|
var zero = affichage.hauteur + affichage.yBas * affichage.multY;
|
||
|
var l = precision*affichage.multX;
|
||
|
ctx.fillStyle = "rgba(0,180,255,0.3)";
|
||
|
ctx.fillRect(pointX-l/2, zero, l , pointY-zero);
|
||
|
ctx.fillStyle = this.couleur;
|
||
|
}
|
||
|
}
|
||
|
else{
|
||
|
nonDefini = true;
|
||
|
}
|
||
|
}
|
||
|
if(this.style != "points"){
|
||
|
ctx.stroke();
|
||
|
}
|
||
|
|
||
|
if(this.style == "points"){
|
||
|
precision /= 2;
|
||
|
}
|
||
|
};
|
||
|
}
|