xxxxxxxxxx
444
let reset;
let ex = 0;
let randoms = [0, 1, 2];
let points = 0;
let punkter = [];
let numb = [0, 1, 2];
let func = numb;
let gridn2 = [0, 1, 2];
let inputs = [];
let scale = [1, 1];
let origin = [0, 0];
let a = [0, 0, 0, 0, 0, 0, 0];
let b = 0;
let r = [];
let rm = 0;
let tt = 0;
let rt = 0;
let rv = 0;
let menu = [];
let grids;
let mouse;
let trans = 0;
let vink;
let valg = ["Back", "Space Geometry", "Arbitrary Triangles", "Right Triangles","Projections"];
function setup() {
createCanvas(1190, 700);
scale = [height / 20, height / 20];
origin = [width / 2, height / 2];
mouse = [width / 2, height / 2];
reset = createButton("Gæt");
reset.mousePressed(resets);
grids = new grid(origin, scale);
punkter.push(new vector([0, 0, 0]));
punkter.push(new vector([0, 0, 0]));
punkter.push(new vector([0, 0, 0]));
punkter.push(new vector([0, 0, 0]));
punkter.push(new vector([0, 0, 0]));
punkter.push(new vector([0, 0, 0]));
for (let i = 0; i < valg.length; i++) {
menu.push(createButton(valg[i]));
menu[i].mousePressed(() => cEx(i));
menu[i].position(((i + 5) * 200 + 100) % width, 100);
}
for (let i = 0; i < 14; i++) {
inputs.push(createInput(""));
inputs[i].size(100);
inputs[i].style("color", "white");
}
}
function draw() {
background(220);
line(-1, -1, -1, height);
if (ex == 0) {
menu[0].hide();
for (let i = 1; i < valg.length; i++) {
menu[i].show();
}
} else {
grids.drw();
menu[0].show();
for (let i = 1; i < valg.length; i++) {
menu[i].hide();
}
if (mouseIsPressed) {
origin[0] += mouseX - mouse[0];
origin[1] += mouseY - mouse[1];
mouse = [mouseX, mouseY];
}
strokeWeight(2);
stroke(0);
line(origin[0], 0, origin[0], height);
line(0, origin[1], width, origin[1]);
if (ex == 1||ex==4) {
vink = [punkter[0].ang(punkter[1])];
if(ex==1){
fill("purple");
noStroke();
beginShape();
vertex(origin[0], origin[1]);
vertex(origin[0] + punkter[0].r * scale[0], origin[1]);
vertex(
origin[0] +
punkter[0].r * scale[0] +
scale[0] * punkter[1].r * cos(vink[0]),
origin[1] - scale[1] * punkter[1].r * sin(vink[0])
);
vertex(
origin[0] + scale[0] * punkter[1].r * cos(vink[0]),
origin[1] - scale[1] * punkter[1].r * sin(vink[0])
);
vertex(origin[0], origin[1]);
endShape();
stroke("green");
arc(origin[0], origin[1], 50, 50, -vink[0], 0);
}
strokeWeight(3);
noFill();
stroke("orange");
line(
origin[0],
origin[1],
origin[0] + punkter[0].r * scale[0],
origin[1]
);
stroke("blue");
line(
origin[0],
origin[1],
origin[0] + scale[0] * punkter[1].r * cos(vink[0]),
origin[1] - scale[1] * punkter[1].r * sin(vink[0])
);
if(ex==4){
vink.push(punkter[0].ang(punkter[3]))
vink.push(punkter[0].ang(punkter[2]))
vink.push(punkter[0].ang(punkter[4]))
vink.push(punkter[0].ang(punkter[5]))
strokeWeight(2)
stroke("red");
line(
origin[0],
origin[1],
origin[0] + scale[0] * punkter[3].r * cos(vink[1]),
origin[1] - scale[1] * punkter[3].r * sin(vink[1])
);
stroke("yellow");
line(
origin[0],
origin[1],
origin[0] + scale[0] * punkter[2].r * cos(vink[2]),
origin[1] - scale[1] * punkter[2].r * sin(vink[2])
);
stroke("green");
line(
origin[0],
origin[1],
origin[0] + scale[0] * punkter[4].r * cos(vink[3]),
origin[1] - scale[1] * punkter[4].r * sin(vink[3])
);
stroke("purple");
line(
origin[0],
origin[1],
origin[0] + scale[0] * punkter[5].r * cos(vink[4]),
origin[1] - scale[1] * punkter[5].r * sin(vink[4])
);
}
strokeWeight(1);
stroke(0)
text("Point:" + points, 10, 20);
} else if (ex < 4) {
vink = [
punkter[1].sub(punkter[0]).a[1],
punkter[2].sub(punkter[1]).a[1],
punkter[0].sub(punkter[2]).a[1],
];
noFill();
strokeWeight(2);
stroke("blue");
linje(punkter[1], punkter[2]);
arc(
coord(punkter[0])[0],
coord(punkter[0])[1],
50,
50,
vink[2] + PI - vink[0] < 0 ? -vink[0] : -PI - vink[2],
vink[2] + PI - vink[0] < 0 ? -vink[2] - PI : -vink[0]
);
stroke("red");
linje(punkter[0], punkter[1]);
arc(
coord(punkter[2])[0],
coord(punkter[2])[1],
50,
50,
vink[1] + PI - vink[2] < 0 ? -vink[2] : -PI - vink[1],
vink[1] + PI - vink[2] < 0 ? -vink[1] - PI : -vink[2]
);
stroke("green");
linje(punkter[0], punkter[2]);
arc(
coord(punkter[1])[0],
coord(punkter[1])[1],
50,
50,
vink[0] + PI * (1 - 2 * (vink[0] > 0)) - vink[1] > PI
? -vink[1]
: -(vink[0] + PI * (1 - 2 * (vink[0] > 0))),
vink[0] + PI * (1 - 2 * (vink[0] > 0)) - vink[1] > PI
? -(vink[0] + PI * (1 - 2 * (vink[0] > 0)))
: -vink[1]
);
} else if (ex==4){
//print(punkter[0])
stroke('orange')
strokeWeight(3)
line(origin[0],origin[1],coord(punkter[0])[0],coord(punkter[0])[1])
stroke('blue')
line(origin[0],origin[1],coord(punkter[1])[0],coord(punkter[1])[1])
strokeWeight(2)
stroke('yellow')
line(origin[0],origin[1],coord(punkter[2])[0],coord(punkter[2])[1])
stroke('red')
line(origin[0],origin[1],coord(punkter[3])[0],coord(punkter[3])[1])
stroke('green')
line(origin[0],origin[1],coord(punkter[4])[0],coord(punkter[4])[1])
stroke('purple')
line(origin[0],origin[1],coord(punkter[5])[0],coord(punkter[5])[1])
}
}
}
function resets() {
if (
ex == 1 &&
abs(float(inputs[2].value())- punkter[0].ang(punkter[1])*180/PI) < 1 ||
inputs[3].value() == str(punkter[2].x[0]) ||
inputs[4].value() == str(punkter[2].x[1]) ||
inputs[5].value() == str(punkter[2].x[2]) ||
abs(float(inputs[6].value()) - punkter[2].r) < 0.1
) {
points++;
} else if (ex == 2 && inputs[0].value() == str(punkter[1].sub(punkter[0]).r) &&
inputs[1].value() == str(punkter[2].sub(punkter[1]).r) &&
inputs[3].value() == str(punkter[2].x[0]) &&
inputs[4].value() == str(punkter[2].x[1]) &&
inputs[5].value() == str(punkter[2].x[2])) {
points++;
} else if(ex==4){
let p=abs(float(inputs[2].value())-punkter[2].x[0])<0.5+abs(float(inputs[3].value())-punkter[2].x[1])<0.5+abs(float(inputs[4].value())-punkter[2].x[2])<0.5+abs(float(inputs[5].value())-punkter[3].x[0])<0.5+abs(float(inputs[6].value())-punkter[3].x[1])<0.5+abs(float(inputs[7].value())-punkter[3].x[2])<0.5+abs(float(inputs[8].value())-punkter[4].x[0])<0.5+abs(float(inputs[9].value())-punkter[4].x[1])<0.5+abs(float(inputs[10].value())-punkter[4].x[2])<0.5+abs(float(inputs[11].value())-punkter[5].x[0])<0.5+abs(float(inputs[12].value())-punkter[5].x[1])<0.5+abs(float(inputs[13].value())-punkter[5].x[2])<0.5
points+=pow(2,p)
}
rand();
}
function coord(x) {
return [x.x[0] * scale[0] + origin[0], origin[1] - x.x[1] * scale[1]];
}
class vector {
constructor(x) {
this.x = x;
let S = 0;
for (let i = 0; i < x.length; i++) {
S += sq(x[i]);
}
this.r = sqrt(S);
this.a = [
acos(x[2] / this.r),
sgn(x[1]) * acos(x[0] / sqrt(sq(x[0]) + sq(x[1]))),
];
//print(this.a)
}
add(v) {
return new vector([
this.x[0] + v.x[0],
this.x[1] + v.x[1],
this.x[2] + v.x[2],
]);
}
mult(k) {
return new vector([this.x[0] * k, this.x[1] * k, this.x[2] * k]);
}
sub(v) {
return this.add(v.mult(-1));
}
co() {
return new vector([-this.x[1], this.x[0]]);
}
mag() {
let S = 0;
for (let i = 0; i < this.x.length; i++) {
S += sq(this.x[i]);
}
return sqrt(S);
}
outside() {
return (
this.x[0] < 0 || this.x[0] > width || this.x[1] < 0 || this.x[1] > height
);
}
dot(v) {
let S = 0;
for (let i = 0; i < this.x.length; i++) {
S += this.x[i] * v.x[i];
}
return S;
}
det(v) {
return this.dot(v.co());
}
ang(v) {
return acos(this.dot(v) / this.r / v.r);
}
cross(v) {
v = v || new vector([0, 0, 1]);
return new vector([
this.x[1] * v.x[2] - this.x[2] * v.x[1],
this.x[2] * v.x[0] - this.x[0] * v.x[2],
this.x[0] * v.x[1] - this.x[1] * v.x[0],
]);
}
tvaer(v){
let w=this.cross(v)
return w.cross(v).mult(1/w.mag())
}
dis(v) {
return this.sub(v).r;
}
proj(v){
return v.mult(this.dot(v)/sq(v.mag()))
}
}
function linje(v, w) {
line(coord(v)[0], coord(v)[1], coord(w)[0], coord(w)[1]);
}
function dis(v, w) {
return sqrt(sq(v.x[0] - w.x[0]) + sq(v.x[1] - w.x[1]));
}
function sgn(x) {
return x / abs(x);
}
function rand() {
r = random(randoms);
mouse = [((ex + 5) * 200 + 100) % width, 100];
for (let i = 0; i < 3; i++) {
punkter[i] = new vector([
round(32 * (random() - 0.5)),
round(20 * (random() - 0.5)),
((ex == 1)+(ex==4)) * round(20 * (random() - 0.5)),
]);
}
inputs[0].style("background-color", "blue");
inputs[3].style("background-color", "red");
inputs[1].style("background-color", "red");
inputs[4].style("background-color", "green");
inputs[2].style("background-color", "green");
inputs[5].style("background-color", "blue");
inputs[6].style("background-color", "purple");
for (let i = 0; i < 7; i++) {
inputs[i].value("");
}
if (ex == 1) {
punkter[2] = new vector(punkter[0].cross(punkter[1]).x);
a[0] = punkter[0].dot(punkter[1]);
inputs[0].value(
"(" +
punkter[0].x[0] +
"," +
punkter[0].x[1] +
"," +
punkter[0].x[2] +
")"
);
inputs[1].value(
"(" +
punkter[1].x[0] +
"," +
punkter[1].x[1] +
"," +
punkter[1].x[2] +
")"
);
} else if (ex == 3) {
punkter[2] = punkter[0].sub(punkter[1]).cross().add(punkter[1]);
} else if (ex == 4) {
punkter[2] = punkter[0].proj(punkter[1])
punkter[3] = punkter[0].proj(punkter[0].tvaer(punkter[1]))
punkter[4] = punkter[1].proj(punkter[0])
punkter[5] = punkter[1].proj(punkter[1].tvaer(punkter[0]))
inputs[0].style("background-color","orange")
inputs[0].value('('+punkter[0].x[0]+','+punkter[0].x[1]+','+punkter[0].x[2]+')')
inputs[1].style("background-color","blue")
inputs[1].value('('+punkter[1].x[0]+','+punkter[1].x[1]+','+punkter[1].x[2]+')')
inputs[2].style("background-color","yellow")
inputs[3].style("background-color","yellow")
inputs[4].style("background-color","yellow")
inputs[5].style("background-color","red")
inputs[6].style("background-color","red")
inputs[7].style("background-color","red")
inputs[8].style("background-color","green")
inputs[9].style("background-color","green")
inputs[10].style("background-color","green")
inputs[11].style("background-color","purple")
inputs[12].style("background-color","purple")
inputs[13].style("background-color","purple")
for(let i=0;i<punkter.length;i++){
print(punkter[i])
}
}
rt = random([0, 1, 2]);
rv = random([3, 4, 5]);
}
function cEx(i) {
ex = i;
rand();
}
function mousePressed() {
mouse = [mouseX, mouseY];
}
class grid {
constructor(o, s) {
this.o = o;
this.s = s;
this.n = [
floor(this.o[0] / s[0]),
floor((width - this.o[0]) / s[0]),
floor(this.o[1] / s[1]),
floor((height - this.o[0]) / s[1]),
];
}
drw() {
this.o = origin;
this.n = [
floor(this.o[0] / this.s[0]),
ceil((width - this.o[0]) / this.s[0]),
floor(this.o[1] / this.s[1]),
ceil((height - this.o[1]) / this.s[1]),
];
stroke("grey");
strokeWeight(1);
for (let i = -this.n[0]; i < this.n[1]; i++) {
line(origin[0] + i * scale[0], 0, origin[0] + i * scale[0], height);
}
for (let i = -this.n[2]; i < this.n[3]; i++) {
line(0, origin[1] + i * scale[1], width, origin[1] + i * scale[1]);
}
}
}
function mouseWheel() {
if (!keyIsPressed || keyIsDown(SHIFT)) {
scale[0] *= 1 + (1 - 2 * keyIsDown(SHIFT)) / 100;
scale[1] *= 1 + (1 - 2 * keyIsDown(SHIFT)) / 100;
} else {
scale[0] *= 1 + (keyIsDown(RIGHT_ARROW) - keyIsDown(LEFT_ARROW)) / 100;
scale[1] *= 1 + (keyIsDown(UP_ARROW) - keyIsDown(DOWN_ARROW)) / 100;
}
}
/*
function mouseReleased(){
if(keyIsDown(SHIFT)){
origin[0]+=mouse[0]-mouseX,
O[1]+=mouse[0]-mouseY
mouse=[0,0]
}
}*/