add r this week
This commit is contained in:
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,14 @@
|
||||
# Josua Kugler, Christian Merten
|
||||
|
||||
mem_near <- function(f_in) {
|
||||
memo <- list(input=c(), value=c())
|
||||
function(x, nearest) {
|
||||
if (!nearest) {
|
||||
memo$input <<- c(memo$input, x)
|
||||
y <- f_in(x)
|
||||
memo$value <<- c(memo$value, y)
|
||||
return(y)
|
||||
}
|
||||
memo$value[apply(outer(memo$input, x, function(a, b) abs(a-b)), 2, which.min)]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
# Josua Kugler, Christian Merten
|
||||
|
||||
poly1 <- structure(
|
||||
list(sides = c(2, 2, 2, 2), angles = c(pi/3, 2*pi/3, pi/3, 2*pi/3)),
|
||||
class = c("Quadrilateral", "Polygon"))
|
||||
poly2 <- structure(
|
||||
list(sides = c(3, 4, 3, 4), angles = rep(pi/2, 4)),
|
||||
class = c("Rectangle", "Quadrilateral", "Polygon"))
|
||||
poly3 <- structure(
|
||||
list(sides = c(2, 2, 2), angles = rep(pi/3, 3)),
|
||||
class = c("Triangle", "Polygon"))
|
||||
poly4 <- structure(
|
||||
list(sides = rep(1, 5), angles = rep(3/5*pi, 5)),
|
||||
class = c("Polygon"))
|
||||
|
||||
get_corners <- function(x) {
|
||||
n <- length(x$sides)
|
||||
if (n < 3) return(invisible(NULL))
|
||||
out <- matrix(ncol = 2, nrow = length(x$sides))
|
||||
direction <- c(1, 0)
|
||||
point <- c(0, 0)
|
||||
out[1, ] <- point
|
||||
for (i in 1:(n-1)) {
|
||||
point <- point + direction * x$sides[i]
|
||||
out[i+1, ] <- point
|
||||
a <- pi - x$angles[i]
|
||||
direction <- matrix(c(cos(a), sin(a), -sin(a), cos(a)), ncol=2) %*% direction
|
||||
}
|
||||
out
|
||||
}
|
||||
|
||||
plot_polygon <- function(x) {
|
||||
corners <- get_corners(x)
|
||||
plot(range(corners[,1]), range(corners[,2]), type = 'n', axes=FALSE, ann=FALSE, asp=1)
|
||||
polygon(corners[,1], corners[,2], lwd = 3)
|
||||
}
|
||||
|
||||
# a)
|
||||
plot.Polygon <- plot_polygon
|
||||
|
||||
# b)
|
||||
Rectangle <- function(w, h) structure(
|
||||
list(sides = c(w, h, w, h), angles = rep(pi/2, 4)),
|
||||
class = c("Rectangle", "Quadrilateral", "Polygon"))
|
||||
|
||||
Triangle <- function(s1, s2, a1) {
|
||||
b <- sqrt(s1^2 + s2^2 - 2*s1*s2*cos(a1))
|
||||
a2 <- acos((b^2 + s2^2 - s1^2)/(2 * s2 * b))
|
||||
structure(list(sides = c(s1, s2, b),
|
||||
angles = c(a1, a2, 2*pi-a1-a2)),
|
||||
class = c("Triangle", "Polygon"))
|
||||
}
|
||||
|
||||
# c)
|
||||
validate_Triangle <- function(x) {
|
||||
stopifnot("no triangle" = "Triangle" %in% class(x))
|
||||
tri <- Triangle(x$sides[1], x$sides[2], x$angles[1])
|
||||
stopifnot("side and angles do not fit" = identical(c(tri$angles, tri$sides), c(x$angles, x$sides)))
|
||||
}
|
||||
|
||||
# d)
|
||||
circumference <- function(obj) {
|
||||
UseMethod("circumference")
|
||||
}
|
||||
|
||||
circumference.Polygon <- function(p) sum(p$sides)
|
||||
|
||||
# e)
|
||||
area <- function(obj) {
|
||||
UseMethod("area")
|
||||
}
|
||||
|
||||
area.Triangle <- function(p) {
|
||||
h <- p$sides[1] * sin(p$angles[1])
|
||||
p$sides[2]*h*0.5
|
||||
}
|
||||
|
||||
area.Quadrilateral <- function(p)
|
||||
1/2 * (p$sides[1]*p$sides[4]*sin(p$angles[4]) + p$sides[2]*p$sides[3]*sin(p$angles[2]))
|
||||
@@ -0,0 +1,58 @@
|
||||
# Josua Kugler, Christian Merten
|
||||
|
||||
library(R6)
|
||||
|
||||
compass <- c("N", "E", "S", "W")
|
||||
movement <- list(N = c(0, 1), S = c(0, -1), W = c(-1, 0), E = c(1, 0))
|
||||
|
||||
# helper because R indexing beginning at 1 is stupid
|
||||
get_dir <- function(k) {
|
||||
compass[(k-1) %% 4 + 1]
|
||||
}
|
||||
|
||||
arrow_coords <- function(n, coord) {
|
||||
(coord + 0.5) / n
|
||||
}
|
||||
|
||||
GridPath <- R6Class("GridPath", list(
|
||||
path = matrix(c(0,0), nrow=1),
|
||||
dir = character(0),
|
||||
initialize = function(dir) {
|
||||
self$dir <- dir
|
||||
},
|
||||
move = function(steps) {
|
||||
if (steps == 0) return(invisible(self))
|
||||
n <- nrow(self$path)
|
||||
self$path <- rbind(self$path,
|
||||
self$path[n,] + movement[[self$dir]])
|
||||
self$move(steps-1)
|
||||
},
|
||||
rotate_right = function() {
|
||||
self$dir <- get_dir(which(self$dir == compass) + 1)
|
||||
invisible(self)},
|
||||
rotate_left = function() {
|
||||
self$dir <- get_dir(which(self$dir == compass) - 1)
|
||||
invisible(self)
|
||||
},
|
||||
print = function() {
|
||||
n <- max(self$path)+1
|
||||
grid <- matrix(rep(F, n^2), nrow=n)
|
||||
apply(self$path, 1, function(r) grid[r[1]+1, r[2]+1] <<- T)
|
||||
image(grid, useRaster=T, asp=T, col=c("white", "black"),
|
||||
axes=F)
|
||||
final <- self$path[nrow(self$path),]
|
||||
print(final)
|
||||
mv <- movement[[self$dir]]
|
||||
coords <- c((final)/(n-1),
|
||||
(final + mv) / (n-1))
|
||||
arrows(coords[1], coords[2], coords[3], coords[4], col="red")
|
||||
}))
|
||||
|
||||
gpath3 <- GridPath$new("N")
|
||||
gpath3$move(7)$
|
||||
rotate_right()$move(8)$
|
||||
rotate_right()$move(7)$
|
||||
rotate_right()$move(6)$
|
||||
rotate_right()$move(5)
|
||||
|
||||
gpath3
|
||||
Reference in New Issue
Block a user