# Denne udgave er ISO-Latin1 kodet - velegnet til Windows. # # Funktion der tegner et 3D overfladeplot for en funktion af to variable. # Med musen kan man ændre betragtningsvinkel. Venstreklik nær en af kanterne # i plotvinduet drejer grafen. Højreklik for slut. Ved slut returneres en # liste med de sidst anvendte vinkler (usynligt, d.v.s. resultatet skrives # ikke i R Console). # Bruger "persp" til at plotte. # Parametre: # f: Funktionen af to variable som skal plottes. # x.min, x.max: Interval for den første variabel (x). # y.min, y.max: Interval for den anden variable (y). # n: Antal støttepunkter (både langs første- og andenaksen). # x.n, y.n: Antal støttepkt. langs hhv. første- og andenaksen (i.s.f. n). # x.interval: Interval for den første variabel (i stedet for x.min, x.max). # y.interval: Interval for den anden variabel (i stedet for y.min, y.max). # x: Støttepunkter langs førsteaksen (i.s.f. interval og antal). # y: Støttepunkter langs andenaksen (i.s.f. interval og antal). # interactive: Hvis interactive=FALSE tegnes overfladen og funktionen # returnerer øjeblikkeligt derefter. D.v.s. at man ikke har # mulighed for at dreje grafen med musen. # showhelp: Hvis showhelp=FALSE får man ikke den lille hjælpetekst der # forklarer brugen af musen. # showangles: Hvis showangles=TRUE skrives de aktuelle værdier af # betragtningsvinklerne phi og theta løbende i R Console # ...: Videre parametre til persp. # # Morten Larsen, 2006, 2009 # overflade <- function(f, x.min=min(x.interval), x.max=max(x.interval), y.min=min(y.interval), y.max=max(y.interval), n=50, x.n=n, y.n=n, x.interval=c(0,1), y.interval=c(0,1), x=seq(x.min, x.max, length=x.n), y=seq(y.min, y.max, length=y.n), theta=0, phi=15, interactive=TRUE, showhelp=TRUE, showangles=FALSE, ... ) { # Vis eventuelt hjælpetekst i R Console: if(interactive && showhelp) { cat("Drej grafen ved venstreklik nær kanterne af grafvinduet.\n") cat("Afslut med højreklik i grafvinduet eller Esc-tasten.\n"); flush.console() } # Udregn støttepunkter: z <- outer(x, y, f) # Tegn overfladen (første gang): persp(x, y, z, theta=theta, phi=phi, ...) # Vis evt. betragtningsvinkel (første gang): if (showangles) { cat("phi:",phi," theta:",theta,"\n"); flush.console(); } # Hvis interaktiv brug så gå i løkke styret af museklik: if (interactive) { pos <- locator(1); # Vent på første klik... while (length(pos)==2) { # Udregn relativ position af klik i grafvinduet ved at # normalisere i forhold til grænserne for 2D koordinatsystemet. extent <- par("usr") xrel <- (pos$x-extent[1])/(extent[2]-extent[1]) yrel <- (pos$y-extent[3])/(extent[4]-extent[3]) # Fortegn for vinkelændring bestemmes af klikposition i forhold # til midten: if (xrel>0.5) { xdir <- 1; xdist <- 1-xrel; } else { xdir <- -1; xdist <- xrel; } # Større vinkelændring hvis klikket er tæt på kanten: if (xdist<0.1) xdir<-xdir*5 # Fortegn for vinkelændring bestemmes af klikposition i forhold # til midten: if (yrel>0.5) { ydir <- 1; ydist <- 1-yrel; } else { ydir <- -1; ydist <- yrel; } # Større vinkelændring hvis klikket er tæt på kanten: if (ydist<0.1) ydir<-ydir*5 # Afhængigt af hvilken kant klikket var tættest på # ændres enten phi eller theta: if (xdist