xxxxxxxxxx
275
class cPoint {
constructor(x, y) {
this.x = x;
this.y = y;
}
draw() {
strokeWeight(5);
point(O[0] + this.x * sX, O[1] - this.y * sY);
strokeWeight(1);
}
}
class fun {
constructor(a, b) {
this.a = a;
this.b = b;
}
value(x) {
return this.a * x + this.b;
}
graph(a, b) {
a = a || -O[0] / sX;
b = b || (w - O[0]) / sX;
line(
O[0] + a * sX, //O[0]+a-O[0])*
O[1] - this.value(a) * sY,
O[0] + b * sX,
O[1] - this.value(b) * sY
);
}
reg(a) {
if (a.length > 1) {
let sX = 0;
let sY = 0;
let sXY = 0;
let sXX = 0;
for (let i = 0; i < a.length; i++) {
sX += a[i].x;
sY += a[i].y;
sXY += a[i].x * a[i].y;
sXX += sq(a[i].x);
}
this.a = (a.length * sXY - sX * sY) / (a.length * sXX - sq(sX));
this.b = (sXX * sY - sX * sXY) / (a.length * sXX - sq(sX));
}
}
res(a) {
let b = [];
for (let i = 0; i < a.length; i++) {
b.push(a[i].y - this.value(a[i].x));
}
return b;
}
rSq(a) {
let Sr = 0;
let Sy = 0;
let My = 0;
for (let i = 0; i < a.length; i++) {
Sy += a[i].y;
}
My = Sy / a.length;
Sy = 0;
for (let i = 0; i < a.length; i++) {
Sr += sq(this.res(a)[i]);
Sy += sq(a[i].y - My);
}
return 1 - Sr / Sy;
}
}
function mousePressed() {
mX = mouseX;
mY = mouseY;
}
function mouseReleased() {
dX = mouseX - mX;
dY = mY - mouseY;
if (keyIsDown(16)) {
sX = sX * pow(1.01, dX);
O[0] = (w / 2) * (1 - pow(1.01, dX)) + O[0] * pow(1.01, dX);
sY = sY * pow(1.01, dY);
O[1] = (h / 2) * (1 - pow(1.01, dY)) + O[1] * pow(1.01, dY);
} else {
O[0] += mouseX - mX;
O[1] += mouseY - mY;
}
}
let xIn;
let yIn;
let uXin;
let uYin;
let P = [];
let eP = [];
let pP = [];
let f = new fun(1, 0);
let sXm = 0;
let sYm = 0;
let e = 0;
let p = 0;
let nE = 0;
let nP = 0;
let tX = 40;
let tY = 0;
let t1w = 50;
let t2w = 40;
let m = 20;
let PmiX;
let PmaX;
let w = 900;
let h = 750;
let O = [w / 2, h / 2];
let sX = 1;
let sY = 1;
let rP = 200;
function setup() {
createCanvas(w, h + rP);
xIn = createInput("");
xIn.position(tX, tY + 2 * m);
xIn.size(t1w);
yIn = createInput("");
yIn.position(tX, tY + 20 + 2 * m);
yIn.size(t1w);
uXin = createInput("");
uXin.position(tX + t1w, tY + 2 * m);
uXin.size(t2w);
uYin = createInput("");
uYin.position(tX + t1w, tY + 20 + 2 * m);
uYin.size(t2w);
}
function draw() {
background(220);
textSize(20);
text("Funktionsforskriften er", tX + t1w + t2w + 10, tY + 20 + 2 * m);
if (keyIsDown(13) && xIn.value() != "" && yIn.value() != "") {
P.push(new cPoint(float(xIn.value()), float(yIn.value())));
f.reg(P);
PmiX = min(PmiX, float(xIn.value()));
PmaX = max(PmaX, float(xIn.value()));
xIn.value("");
yIn.value("");
}
if (keyIsDown(69)) {
e = 1;
p = 0;
while (nE < P.length) {
eP.push(new cPoint(P[nE].x, log(P[nE].y)));
nE++;
}
f.reg(eP);
}
if (keyIsDown(80)) {
p = 1;
e = 0;
while (nP < P.length) {
pP.push(new cPoint(log(P[nP].x), log(P[nP].y)));
nP++;
}
f.reg(pP);
}
if (keyIsDown(76)) {
e = 0;
p = 0;
f.reg(P);
}
if (e == 1) {
for (let i = 0; i < eP.length; i++) {
eP[i].draw();
text(
"(" + round(eP[i].x, 2) + "," + round(eP[i].y, 2) + ")",
tX,
tY + 20 * (i + 3) + 2 * m
);
}
text(
"f(x)=" + round(exp(f.b), 2) + "⋅" + round(exp(f.a), 2) + "^x",
tX + t1w + t2w + 10,
tY + 40 + 2 * m
);
} else if (p == 1) {
text(
"f(x)=" + round(exp(f.b), 2) + "x^" + round(f.a, 2),
tX + t1w + t2w + 10,
tY + 40 + 2 * m
);
for (let i = 0; i < pP.length; i++) {
strokeWeight(5);
pP[i].draw();
text(
"(" + round(pP[i].x, 2) + "," + round(pP[i].y, 2) + ")",
tX,
tY + 20 * (i + 3) + 2 * m
);
}
} else {
for (let i = 0; i < P.length; i++) {
P[i].draw();
text("(" + P[i].x + "," + P[i].y + ")", 2 * m, 2 * m + 20 * (i + 3));
strokeWeight(5);
point(
m + ((w - 2 * m) / (PmaX - PmiX)) * (P[i].x - PmiX),
h +
rP / 2 -
(((rP - m) / max(max(f.res(P)), -min(f.res(P)))) * f.res(P)[i]) / 2
);
strokeWeight(1);
}
text(
"f(x)=" + round(f.a, 2) + "x+" + round(f.b, 2),
tX + t1w + t2w + 10,
tY + 40 + 2 * m
);
text("r^2=" + f.rSq(P), tX + t1w + t2w + 10, tY + 60 + 2 * m);
line(0, h + rP / 2, w, h + rP / 2);
}
strokeWeight(1);
text(
"(" +
round((m - O[0]) / sX, 1) +
"," +
round((O[1] - h + 20) / sY, 1) +
")",
30,
h - m - 10
);
textAlign(RIGHT);
text(
"(" + round((w - m - O[0]) / sX, 1) + "," + round((O[1] - m) / sY, 1) + ")",
w - m - 10,
m + 20
);
f.graph();
if (O[0] < m) {
stroke(150);
line(m, 0, m, h);
stroke(0);
text(uYin.value(), m + 10, m + 5);
} else if (O[0] > w - m) {
stroke(150);
line(w - m, 0, w - m, h);
stroke(0);
textAlign(RIGHT);
text(uYin.value(), w - 3 * m, m + 5);
textAlign(LEFT);
} else {
stroke(0);
line(O[0], 0, O[0], h);
text(uYin.value(), O[0] + 5, m + 5);
}
stroke(150);
if (O[1] > h - m) {
line(0, h - m, w, h - m);
stroke(0);
textAlign(RIGHT);
text(uXin.value(), w - m + 5, h - 3 * m);
textAlign(LEFT);
} else if (O[1] < m) {
line(0, m, w, m);
stroke(0);
textAlign(RIGHT);
text(uXin.value(), w - m + 5, 2 * m + 10);
textAlign(LEFT);
} else {
stroke(0);
line(0, O[1], w, O[1]);
textAlign(RIGHT);
text(uXin.value(), w - m + 5, O[1] - m * 0.5);
textAlign(LEFT);
}
stroke(150);
line(m, 0, m, h);
line(w - m, 0, w - m, h);
line(0, m, w, m);
line(0, h - m, w, h - m);
stroke(0);
}