Für Vorlesungen, bitte die Webseite verwenden. https://flavigny.de/lecture
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

80 line
2.3KB

  1. # Josua Kugler, Christian Merten
  2. poly1 <- structure(
  3. list(sides = c(2, 2, 2, 2), angles = c(pi/3, 2*pi/3, pi/3, 2*pi/3)),
  4. class = c("Quadrilateral", "Polygon"))
  5. poly2 <- structure(
  6. list(sides = c(3, 4, 3, 4), angles = rep(pi/2, 4)),
  7. class = c("Rectangle", "Quadrilateral", "Polygon"))
  8. poly3 <- structure(
  9. list(sides = c(2, 2, 2), angles = rep(pi/3, 3)),
  10. class = c("Triangle", "Polygon"))
  11. poly4 <- structure(
  12. list(sides = rep(1, 5), angles = rep(3/5*pi, 5)),
  13. class = c("Polygon"))
  14. get_corners <- function(x) {
  15. n <- length(x$sides)
  16. if (n < 3) return(invisible(NULL))
  17. out <- matrix(ncol = 2, nrow = length(x$sides))
  18. direction <- c(1, 0)
  19. point <- c(0, 0)
  20. out[1, ] <- point
  21. for (i in 1:(n-1)) {
  22. point <- point + direction * x$sides[i]
  23. out[i+1, ] <- point
  24. a <- pi - x$angles[i]
  25. direction <- matrix(c(cos(a), sin(a), -sin(a), cos(a)), ncol=2) %*% direction
  26. }
  27. out
  28. }
  29. plot_polygon <- function(x) {
  30. corners <- get_corners(x)
  31. plot(range(corners[,1]), range(corners[,2]), type = 'n', axes=FALSE, ann=FALSE, asp=1)
  32. polygon(corners[,1], corners[,2], lwd = 3)
  33. }
  34. # a)
  35. plot.Polygon <- plot_polygon
  36. # b)
  37. Rectangle <- function(w, h) structure(
  38. list(sides = c(w, h, w, h), angles = rep(pi/2, 4)),
  39. class = c("Rectangle", "Quadrilateral", "Polygon"))
  40. Triangle <- function(s1, s2, a1) {
  41. b <- sqrt(s1^2 + s2^2 - 2*s1*s2*cos(a1))
  42. a2 <- acos((b^2 + s2^2 - s1^2)/(2 * s2 * b))
  43. structure(list(sides = c(s1, s2, b),
  44. angles = c(a1, a2, 2*pi-a1-a2)),
  45. class = c("Triangle", "Polygon"))
  46. }
  47. # c)
  48. validate_Triangle <- function(x) {
  49. stopifnot("no triangle" = "Triangle" %in% class(x))
  50. tri <- Triangle(x$sides[1], x$sides[2], x$angles[1])
  51. stopifnot("side and angles do not fit" = identical(c(tri$angles, tri$sides), c(x$angles, x$sides)))
  52. }
  53. # d)
  54. circumference <- function(obj) {
  55. UseMethod("circumference")
  56. }
  57. circumference.Polygon <- function(p) sum(p$sides)
  58. # e)
  59. area <- function(obj) {
  60. UseMethod("area")
  61. }
  62. area.Triangle <- function(p) {
  63. h <- p$sides[1] * sin(p$angles[1])
  64. p$sides[2]*h*0.5
  65. }
  66. area.Quadrilateral <- function(p)
  67. 1/2 * (p$sides[1]*p$sides[4]*sin(p$angles[4]) + p$sides[2]*p$sides[3]*sin(p$angles[2]))