# (1) Euklidovske vzdalenosti # nacteni dat do dataframe data = read.table('data-3d-base-xyz.txt', header=T) # kontrola dobre nactenych dat if(any(dim(data) != c(60, 14))) stop('Spatne nactene data') # vypsani prvnich 5 radku head(data) # vypsani nazvu sloupcu names(data) # vytahneme si x, y, z souradnice landmarku POdx = data[,c('x.POdx', 'y.POdx', 'z.POdx')] POsin = data[,c('x.POsin', 'y.POsin', 'z.POsin')] BA = data[,c('x.BA', 'y.BA', 'z.BA')] head(POdx) # kontrola if(!(is.data.frame(POsin) && all(dim(POsin) == c(60, 3)))) stop('Spatne nacteny POsin') if(!(is.data.frame(POsin) && all(dim(BA) == c(60, 3)))) stop('Spatne nacteny BA') # prevedeme dataframe na matice POdx = as.matrix(POdx) POsin = 'TODO' BA = 'TODO' # rozdily souradnic BA.POdx.diff = 'TODO' BA.POsin.diff = 'TODO' POdx.POsin.diff = 'TODO' # funkce pro euklidovskou vzdalenost euclid.vzdalenost = function(d){ # d je rozdil dvou vektoru vektory, funkce spocita jejich vzdalenost dist = 'TODO' return(dist) } # vyzkousime funkci na prvnim bodu stopifnot(round(euclid.vzdalenost(BA.POdx.diff[,1]), 2) == 443.88) # pro pouziti na vsechny radky pouzijeme funkci apply podel dimenze TODO dist.podx.ba = apply(BA.POdx.diff, 'TODO', euclid.vzdalenost) dist.posin.ba = 'TODO' dist.podx.posin = 'TODO' # podle zadani se ma vzdalenost jmenovat base.B base.B = dist.podx.posin stopifnot(length(dist.podx.ba) == 60) stopifnot(round(base.B[1], 2) == 113.64) # (2) Prumerne delky stran a smerodatne odchylky... dist.podx.ba.zeny = dist.podx.ba[data$sex == 'F'] cat('Prumerna vzdalenost POdx - BA pro zeny: ', mean(dist.podx.ba.zeny), 'mm', '\n') cat('Smerodatna odchylka POdx - BA pro zeny: ', 'TODO', 'mm', '\n') 'TODO - dalsi vzdalenosti + pro muze' # alternativni reseni tapply(dist.podx.ba, data$sex, mean) # (3) Vypocitejte vnitrni uhly trojuhelniku... uhol.cos.veta = function(a, b, c){ # TODO } rad.na.stupne = function(rad){ # TODO } stupne.na.rad = # TODO stopifnot(round(rad.na.stupne(stupne.na.rad(100))) == 100) uhel.rad.ba = uhol.cos.veta('TODO') 'TODO' 'TODO' # ze zadani base.A = rad.na.stupne(uhel.rad.ba) stopifnot(all(ba.stupne > 130)) # (4) Nakreslete histogram hodnot z uhlu na kruznici... library(circular) # nejdrive nakreslime pouze uhel BA x = circular('TODO', type="angles", units="radians", template="none", rotation="counter") rose.diag(x, col='TODO', prop=2, shrink=1.5) lines(density.circular(x, bw=7.5)) # nakreslime vsechny tri vedle sebe par(mar=c(0,0,0,0), mfcol=c(1,3)) 'TODO' 'TODO' 'TODO' # (5.1) Vypocitejte vysku lebecni baze base.H 'TODO' # (5.2) Vypocitejte vysku lebky skull.H 'TODO' skull.H = 'TODO' # (6) Linearne-uhlovy korelacni koeficient skull.H a base.A r.lin.uhl = function(x, y){ # linearne-uhlovy Pearsonuv korelacni koeficient rxc = cor(x, cos(y)) rxs = cor(x, sin(y)) rsc = cor(cos(y), sin(y)) r = sqrt((rxc^2 + rxs^2 - 2*rxc*rxs*rsc) / (1 - rsc^2)) return(r) } base.A.rad = stupne.na.rad(base.A) r.skull.base = r.lin.uhl(skull.H, base.A.rad) stopifnot(r.skull.base > 0.6) r.skull.base.zeny = r.lin.uhl('TODO') cat('Lin-uhl korelacni koeficient pro zeny:', r.skull.base.zeny) 'TODO pro muze' # (A) plot(skull.H[data$sex == 'M'], cos(base.A.rad[data$sex == 'M']), pch=16, xlab='TODO', ylab='TODO', xlim=c(115, 150), ylim=c(-0.95, -0.65)) points(skull.H[data$sex == 'F'], cos(base.A.rad[data$sex == 'F'])) legend('bottomright', legend = c("f", "m"), pch=c(16, 1)) # (B) # TODO pro sin