xxxxxxxxxx
107
w=800
h=500
O = [w/2, h/2];
s = 1;
class matrix {
constructor(a11, a12, a21, a22) {
this.a11 = a11;
this.a12 = a12;
this.a21 = a21;
this.a22 = a22
}
mul(v){
return new punkt(this.a11*v.x+this.a12*v.y,this.a21*v.x+this.a22*v.y)
}
}
class punkt {
constructor(x, y) {
this.x = x;
this.y = y;
}
tegn() {
point(O[0] + this.x, O[1] - this.y);
}
mul(A) {
let a = this.x;
let b = this.y;
this.x = A.a11 * a + A.a12 * b;
this.y = A.a21 * a + A.a22 * b;
}
}
function matmul(A, v) {
return new punkt(A.a11* v.x + A.a12 * v.y, A.a21 * v.x + A.a22 * v.y);
}
function rot(t){
return new matrix(cos(t),-sin(t),sin(t),cos(t))
}
let uc = [];
let A;
let n = 0;
let u=0
let r=0
let tuc=[]
let d=0
function setup() {
createCanvas(w, h);
A = new matrix(1, 0, 0, 1);
}
function draw() {
background(220);
stroke(150)
line(0,h/2,w,h/2)
line(w/2,0,w/2,h)
line((w-h)/2,h,(w+h)/2,0)
line((w-h)/2,0,(w+h)/2,h)
noFill()
circle(w/2,h/2,h)
if (mouseIsPressed) {
if (uc.length <= n) {
uc.push([]);
tuc.push([])
} else {
uc[n].push(new punkt(mouseX - O[0], O[1] - mouseY));
tuc[n].push(A.mul(new punkt(mouseX - O[0], O[1] - mouseY)))
}
} else {
n = uc.length + 1;
}
for (let j = 0; j < uc.length; j++) {
for (let i = 0; i < uc[j].length - 1; i++) {
stroke('green')
line(
O[0] + uc[j][i].x,
O[1] - uc[j][i].y,
O[0] + uc[j][i + 1].x,
O[1] - uc[j][i + 1].y
);
stroke('red')
line(
O[0] + tuc[j][i].x,
O[1] - tuc[j][i].y,
O[0] + tuc[j][i + 1].x,
O[1] - tuc[j][i + 1].y
);
}
}
A.a11+=pow(0,!keyIsDown(UP_ARROW)+!keyIsDown(LEFT_ARROW))*pow(-1,keyIsDown(SHIFT))/100
A.a12+=pow(0,!keyIsDown(UP_ARROW)+!keyIsDown(RIGHT_ARROW))*pow(-1,keyIsDown(SHIFT))/100
A.a21+=pow(0,!keyIsDown(DOWN_ARROW)+!keyIsDown(LEFT_ARROW))*pow(-1,keyIsDown(SHIFT))/100
A.a22+=pow(0,!keyIsDown(DOWN_ARROW)+!keyIsDown(RIGHT_ARROW))*pow(-1,keyIsDown(SHIFT))/100
for (let j = 0; j < uc.length; j++) {
for (let i = 0; i < uc[j].length; i++) {
tuc[j][i]=A.mul(uc[j][i])
uc[j][i].x+=r
uc[j][i].y+=u
}
}
if(keyIsDown(90)&&keyIsDown(CONTROL)&&d==0){
uc.pop()
tuc.pop()
n=uc.length+1
d=1
}else if(!keyIsDown(90)){d=0}
stroke('black')
textSize(20)
text('A=('+round(A.a11,2)+','+round(A.a12,2)+','+round(A.a21,2)+','+round(A.a22,2)+')',20,20)
}