```{r pkgs, message = FALSE, warning = FALSE}
library(ggplot2)
```


### Exercise 3.1: Convex hull Stat

* Create a new stat called `stat_chull` that returns the convex hull of a set of points 
* The default geom for this new stat can be `GeomPolygon` so when `stat_chull()` is added to a scatter plot, it will draw a border around all points

```{r, echo = FALSE}
StatChull <- ggproto("StatChull", Stat,
                     compute_group = function(data, scales) {
                       data[chull(data$x, data$y), , drop = FALSE]
                     },
                     required_aes = c("x", "y"))
stat_chull <- function(mapping = NULL, data = NULL, geom = "polygon",
                       position = "identity", na.rm = FALSE, show.legend = NA, 
                       inherit.aes = TRUE, ...) {
  layer(
    stat = StatChull, data = data, mapping = mapping, geom = geom, 
    position = position, show.legend = show.legend, inherit.aes = inherit.aes,
    params = list(na.rm = na.rm, ...)
  )
}
```
```{r, eval = FALSE}
# fill the XXX in the code below
StatChull <- ggproto("StatChull", Stat,
                     compute_group = function(data, scales) {
                       data[chull(data$x, data$y), , drop = FALSE]
                     },
                     required_aes = XXX)

stat_chull <- function(mapping = NULL, data = NULL, geom = XXX,
                       position = "identity", na.rm = FALSE, show.legend = NA, 
                       inherit.aes = TRUE, ...) {
  layer(
    stat = XXX, data = data, mapping = mapping, geom = geom, 
    position = position, show.legend = show.legend, inherit.aes = inherit.aes,
    params = list(na.rm = na.rm, ...)
  )
}
```


```{r day1-exercise-03-01A}
ggplot(cars, aes(speed, dist)) +
  geom_point() +
  stat_chull(fill = "transparent", color = "black")
```

### Exercise 3.2: `geom_point` from scratch

* Code your own `geom_point` called `geom_simple_point`

```{r, eval = FALSE}
# fill the XXX in the code below
GeomSimplePoint <- ggproto("GeomSimplePoint", Geom,
  required_aes = XXX
  default_aes = aes(shape = 19, colour = "black"),
  draw_panel = function(data, panel_params, coord) {
    coords <- coord$transform(data, panel_params)
    grid::pointsGrob(
      coords$x, XXX,
      pch = coords$shape,
      gp = grid::gpar(col = coords$colour)
    )
  }
)

geom_simple_point <- function(mapping = NULL, data = NULL, stat = "identity",
                              position = "identity", na.rm = FALSE, show.legend = NA, 
                              inherit.aes = TRUE, ...) {
  layer(
    geom = XXX, mapping = mapping,  data = data, stat = stat, 
    position = position, show.legend = show.legend, inherit.aes = inherit.aes,
    params = list(na.rm = na.rm, ...)
  )
}
```
```{r, echo = FALSE}
GeomSimplePoint <- ggproto("GeomSimplePoint", Geom,
  required_aes = c("x", "y"),
  default_aes = aes(shape = 19, colour = "black"),
  draw_panel = function(data, panel_params, coord) {
    coords <- coord$transform(data, panel_params)
    grid::pointsGrob(
      coords$x, coords$y,
      pch = coords$shape,
      gp = grid::gpar(col = coords$colour)
    )
  }
)

geom_simple_point <- function(mapping = NULL, data = NULL, stat = "identity",
                              position = "identity", na.rm = FALSE, show.legend = NA, 
                              inherit.aes = TRUE, ...) {
  layer(
    geom = GeomSimplePoint, mapping = mapping,  data = data, stat = stat, 
    position = position, show.legend = show.legend, inherit.aes = inherit.aes,
    params = list(na.rm = na.rm, ...)
  )
}
```


```{r day1-exercise-03-02A}
ggplot(cars, aes(speed, dist)) + 
  geom_simple_point()
```

