xxxxxxxxxx
242
class punkt{
constructor(x,y){
this.x=x
this.y=y
}
place(){
strokeWeight(5)
point(O[0]+skalX*this.x,O[1]-skalY*this.y)
}
}
class lin{
constructor(a,b){
this.a=a
this.b=b
}
værdi(x){
return this.a*x+this.b
}
graf(){
strokeWeight(1)
line(0,O[1]-this.værdi(-O[0]/skalX)*skalY,w,O[1]-this.værdi((w-O[0])/skalX)*skalY)
}
reg(p){
let sXY=0
let sX=0
let sY=0
let sXX=0
for(let i=0;i<p.length;i++){
sXY+=p[i].x*p[i].y
sX+=p[i].x
sY+=p[i].y
sXX+=sq(p[i].x)
}
this.a=(p.length*sXY-sX*sY)/(p.length*sXX-sq(sX))
this.b=(sXX*sY-sX*sXY)/(p.length*sXX-sq(sX))
}
res(a) {
let b = [];
for (let i = 0; i < a.length; i++) {
b.push(a[i].y - this.værdi(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;
}
}
let xIn;
let yIn;
let uXin;
let uYin;
let f = new lin(2, 4);
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 rP=200
let PmiX
let PmaX
let P=[]
let skalX=50
let skalY=50
let w=900
let h=550
let O=[w/2,h/2]
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 punkt(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(RIGHT_ARROW)) {
if (keyIsDown(16)) {
sX = sX * 1.01;
O[0]=-w/2*0.01+O[0]*1.01
} else {
O[0] += 1;
}
}
if (keyIsDown(LEFT_ARROW)) {
if (keyIsDown(16)) {
sX = sX / 1.01;
O[0]=w/2*0.01/1.01+O[0]/1.01
} else {
O[0] -= 1;
}
}
if (keyIsDown(UP_ARROW)) {
if (keyIsDown(16)) {
sY = sY * 1.01;
O[1]=-h/2*0.01+O[1]*1.01
} else {
O[1] -= 1;
}
}
if (keyIsDown(DOWN_ARROW)) {
if (keyIsDown(16)) {
sY = sY *0.99;
O[1]=h/2*0.01/1.01+O[1]/1.01
} else {
O[1] += 1;
}
}
for(let i=0;i<P.length;i++){
P[i].place()
strokeWeight(1)
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);
text(
"(" +
round((m - O[0]) / skalX, 1) +
"," +
round((O[1] - h + 20) / skalY, 1) +
")",
30,
h - m - 10
);
textAlign(RIGHT);
text(
"(" + round((w - m - O[0]) / skalX, 1) + "," + round((O[1] - m) / skalY, 1) + ")",
w - m - 10,
m + 20
);
f.graf()
strokeWeight(1);
if (O[0] < m) {
line(m, 0, m, h);
stroke(0);
text(uYin.value(), m + 10, m + 5);
} else if (O[0] > w - m) {
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);
}
function mousePressed() {
mX = mouseX;
mY = mouseY;
}
function mouseReleased() {
dX = mouseX - mX;
dY = mY - mouseY;
if (keyIsDown(16)) {
skalX = skalX * pow(1.01, dX);
O[0] = (w / 2) * (1 - pow(1.01, dX)) + O[0] * pow(1.01, dX);
skalY = skalY * 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;
}
}