--- title: "Triangles" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Triangles} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) ``` ```{r setup} library(nara) ``` `{nara}` has three ways to draw triangles: * `nr_polygon()` * `nr_tri_mesh()` * `nr_tri_coords()` For single triangles, `nr_polygon()` is sufficient. For large numbers of polygons, the `nr_tri_*` functions will be much much faster. This vignette demonstrates the drawing of two triangles using each of these functions. ## Demo setup Define 5 points on the image which will be used as the vertices of two triangles ```{r} #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Define image size #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ w <- h <- 300 th <- 16 # text height #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Define 5 points within the canvas #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ax <- w/2 ; ay <- 0 + th bx <- w/2 ; by <- h/2 cx <- th/2; cy <- h/2 dx <- w/2 ; dy <- h - th/2 ex <- w - th/2; ey <- h/2 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Label the points in an image #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ nr <- nr_new(w, h) nr_text_mono(nr, ax, ay, 'A', fontsize = th) nr_text_mono(nr, bx, by, 'B', fontsize = th) nr_text_mono(nr, cx, cy, 'C', fontsize = th) nr_text_mono(nr, dx, dy, 'D', fontsize = th) nr_text_mono(nr, ex, ey, 'E', fontsize = th) plot(nr) ``` # Render triangles with `nr_polygon()` Render two triangles by using two calls to `nr_polygon()`. ```{r echo = FALSE} nr <- nr_new(w, h) nr_polygon(nr, c(ax, bx, cx), c(ay, by, cy), fill = "blue") nr_polygon(nr, c(bx, dx, ex), c(by, dy, cy), fill = "red") plot(nr) ``` # Render triangles with `nr_tri_mesh()` `nr_tri_mesh()` expects the triangles to be defined in two parts: 1. A matrix of vertex coordinates * `x` values in the first row, `y` values in the second row. (Further rows are ignored) 2. An integer matrix of indices. * The first 3 values in each column define the columns in the `vertices` matrix which define the triangle. This mesh data definition is a similar format to the `mesh3d` class of data defined in the `{rgl}` package. ```{r} # define all the vertex coordinates vertices <- rbind( c(ax, bx, cx, dx, ex), c(ay, by, cy, dy, ey) ) # Define the indices. Each column in this matrix represents 1 triangle. # The three numbers reprsent the column index in the `vertices` data indices <- rbind( # 1 2 c(1, 2), c(2, 4), c(3, 5) ) nr <- nr_new(w, h) nr_tri_mesh(nr, vertices, indices, c('blue', 'red')) plot(nr) ``` # Render triangles with `nr_tri_coords()` `nr_tri_coords()` requires just the raw coordinates of all vertices in a single matrix. The first row has the `x` coordinates, the second row has the `y` coordinates. Each group of 3 columns defines a triangle ```{r} coords <- rbind( # <<< 1 >>> <<< 2 >>>> c(ax, bx, cx, bx, dx, ex), c(ay, by, cy, by, dy, ey) ) nr <- nr_new(w, h) nr_tri_coords(nr, coords, color = c('blue', 'red')) plot(nr) ```