# [ dopo avere introdotto source("http://macosa.dima.unige.it/r.R") ] # Per traslare, ruotare, moltiplicare le coordinate dei punti posso usare i comandi: # MolTraRot(x,y, mx,my, tx,ty, ang) e RotTraMol(x,y, ang, tx,ty, mx,my). Dato (x,y) il # primo ne moltiplica le coordinate per mx ed my, poi lo trasla di tx,ty e infine lo # ruota attorno a (0,0) di ang. Il secondo invece prima lo ruota attorno a (0,0), poi # lo trasla e infine ne moltiplica le coordinate. # Ecco come generare la figura sotto riprodotta a sinistra. HF=4; BF=4 x_1 <- c(13,11,10, 9, 7,7.5, 7, 9,10,11,13,17,20,20.5,18.5,21,20,17,13) y_1 <- c(17,16,15,13,10, 13,16,13,11,10, 9, 9,11, 12, 13,13,15,17,17) x_2 <- c(13,12,15,14,17,13) y_2 <- c(17,20,17,20,17,17) x_3 <- c(17,14,15,12,13,17) y_3 <- c( 9, 6, 9, 6, 9, 9) c_1 <- "black"; c_2 <- "green"; c_3 <- "magenta" n1 = length(x_1); n2 = length(x_2); n3 = length(x_3) PIANO(-30,30,-30,30) # Il pesce giallo. spezzaC(x_1,y_1,"yellow") spezzata(x_1,y_1,c_1); spezzata(x_2,y_2,c_2); spezzata(x_3,y_3,c_3) # La trasformazione che ruota il pesce di 60° attorno a 0,0 xx_1=xx_2=xx_3=yy_1=yy_2=yy_3=0 # inzializzo le variabili for(i in 1:n1) {k = MolTraRot(x_1[i],y_1[i], 1,1, 0,0, 60); xx_1[i]=k[1]; yy_1[i]=k[2]} for(i in 1:n2) {k = MolTraRot(x_2[i],y_2[i], 1,1, 0,0, 60); xx_2[i]=k[1]; yy_2[i]=k[2]} for(i in 1:n3) {k = MolTraRot(x_3[i],y_3[i], 1,1, 0,0, 60); xx_3[i]=k[1]; yy_3[i]=k[2]} Spezzat(xx_1,yy_1, c_1); Spezzat(xx_2,yy_2,c_2); Spezzat(xx_3,yy_3,c_3) # Schiaccio il pesce orizzontalmente e lo allungo verticalmente, non lo traslo, lo # ruoto di 180° attorno a (0,0) for(i in 1:n1) {k = MolTraRot(x_1[i],y_1[i], 1/2,1.5, 0,0, 180); xx_1[i]=k[1]; yy_1[i]=k[2]} for(i in 1:n2) {k = MolTraRot(x_2[i],y_2[i], 1/2,1.5, 0,0, 180); xx_2[i]=k[1]; yy_2[i]=k[2]} for(i in 1:n3) {k = MolTraRot(x_3[i],y_3[i], 1/2,1.5, 0,0, 180); xx_3[i]=k[1]; yy_3[i]=k[2]} Spezzat(xx_1,yy_1, c_1); Spezzat(xx_2,yy_2,c_2); Spezzat(xx_3,yy_3,c_3) # Lo ruoto attorno a (0,0) di -90°, lo traslo di -15,15, ne raddoppio le ascisse for(i in 1:n1) {k = RotTraMol(x_1[i],y_1[i], -90, -15,15, 2,1); xx_1[i]=k[1]; yy_1[i]=k[2]} for(i in 1:n2) {k = RotTraMol(x_2[i],y_2[i], -90, -15,15, 2,1); xx_2[i]=k[1]; yy_2[i]=k[2]} for(i in 1:n3) {k = RotTraMol(x_3[i],y_3[i], -90, -15,15, 2,1); xx_3[i]=k[1]; yy_3[i]=k[2]} Spezzat(xx_1,yy_1, c_1); Spezzat(xx_2,yy_2,c_2); Spezzat(xx_3,yy_3,c_3) # Lo ruoto di -70°, non lo traslo, ne diminuisco ascisse e aumento ordinate. for(i in 1:n1) {k = RotTraMol(x_1[i],y_1[i], -70, 0,0, 0.75,1.25); xx_1[i]=k[1]; yy_1[i]=k[2]} for(i in 1:n2) {k = RotTraMol(x_2[i],y_2[i], -70, 0,0, 0.75,1.25); xx_2[i]=k[1]; yy_2[i]=k[2]} for(i in 1:n3) {k = RotTraMol(x_3[i],y_3[i], -70, 0,0, 0.75,1.25); xx_3[i]=k[1]; yy_3[i]=k[2]} Spezzat(xx_1,yy_1, c_1); Spezzat(xx_2,yy_2,c_2); Spezzat(xx_3,yy_3,c_3) # Tracciato un segmento o una freccia (con i comandi freccia, segm, linea, ...) le # coordinate del punto finale sono memorizzate in xpunta e ypunta. La cosa può essere # utile per costruire vari tipi di figure. Un punto inziale può essere tracciato con # punticino: le sue coordinate sono messe in xpunta, ypunta. Vedi qui sotto come # generare la figura sopra a destra. HF=3; BF=3; PIANO(-1,1,-1,1) punticino(1,0, 1) for(i in 1:500) {P = RotTraMol(xpunta*99/100,ypunta*99/100, 30, 0,0, 1,1); segm(xpunta,ypunta, P[1],P[2], i) } # # # Trasformazioni geometriche con una figura più semplice source("http://macosa.dima.unige.it/r.R") HF=5; BF=5 x <- c(13,11,10, 9, 7,7.5, 7, 9,10,11,13,17,20,20.5,18.5,21,20,17,13) y <- c(17,16,15,13,10, 13,16,13,11,10, 9, 9,11, 12, 13,13,15,17,17) c <- "black" n = length(x) PIANO(-25,30,-20,35) # Il pesce giallo, con bordo nero spezzaC(x,y,"yellow"); spezzata(x,y,c) xx = yy = 0 # inzializzo le variabili # Simmetria rispetto asse x (bordo marrone) for(i in 1:n) {xx[i]=y[i]; yy[i]=x[i]} spezzata(xx,yy, "brown") # Ribaltamento attorno all'asse x (bordo rosso) for(i in 1:n) {xx[i]=x[i]; yy[i]=-y[i]} spezzata(xx,yy, "red") # Ribaltamento attorno all'asse y (bordo verde mare) for(i in 1:n) {xx[i]=-x[i]; yy[i]=y[i]} spezzata(xx,yy, "seagreen") # Riduzione di scala (verde chiaro) for(i in 1:n) {xx[i]=x[i]/2; yy[i]=y[i]/2} spezzata(xx,yy, "green") linea(0,0, x[7],y[7], "red"); linea(0,0, x[12],y[12], "red") # Rotazione del pesce verde chiaro di 90° attorno a -1,1 (bordo arancione) # Prima lo traslo portando -1,1 nell'origine, poi ruoto e traslo in direzione opposta PUNTO(-1,1, "blue") for(i in 1:n) {xx[i]=xx[i]+1; yy[i]=yy[i]-1} for(i in 1:n) {k = RotTraMol(xx[i],yy[i], 90, -1,1, 1,1); xx[i]=k[1]; yy[i]=k[2]} spezzata(xx,yy, "orange") linea(-1,1, x[5]/2,y[5]/2, "blue"); linea(-1,1, xx[5],yy[5], "blue") # Dimezzamento delle x e raddoppio delle y del pesce iniziale (magenta) for(i in 1:n) {xx[i]=x[i]/2; yy[i]=y[i]*2} spezzata(xx,yy, "magenta") # Similitudine e ribaltamento (pesce grigio) for(i in 1:n) {xx[i]=y[i]*2-40; yy[i]=x[i]*2-10} spezzata(xx,yy, "grey")