Triangles

library(nara)

{nara} has three ways to draw triangles:

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

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 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().

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.

# 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

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)