# 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]))