Sample points within JamPolygon

sample_JamPolygon(
  jp,
  n = 100,
  xyratio = 1.2,
  spread = FALSE,
  n_ratio = 1,
  pattern = c("offset", "rectangle"),
  buffer = -0.2,
  width_buffer = 0.1,
  max_width_buffer = 10,
  byCols = c("-y", "x"),
  algorithm = c("split", "seq"),
  do_plot = FALSE,
  verbose = FALSE,
  ...
)

Arguments

jp

JamPolygon

n

integer number of points required

xyratio

numeric adjustment for the x/y ratio, numbers larger than 1 make the x-axis spacing larger than the y-axis spacing.

spread

logical (default FALSE) when more then n points are defined than the target number of points, spread indicates whether the subset of n points returned is defined using the first n points (spread=FALSE) or an even spread from start to end (spread=TRUE),

  • spread=TRUE can produce unusual distributions, with potential improvementwhen filling an irregular polygon.

  • spread=FALSE produces more "regular" placement of labels, also without gaps.

n_ratio

numeric ratio which must be 1 or higher, default 1, how many total valid points should be defined before choosing a subset of points to use.

  • n_ratio=1 - defines n points as closely as possible.

  • n_ratio=2 - defines twice the points, then takes a subset to use, based upon argument spread. It may be beneficial when trying to fill an irregularly shaped polygon to use a higher n_ratio, thereby forcing the discovery of many more possible points. That said, the subset of points may not be "ideally" distributed relative to other labels, and relative to the polygon shape.

pattern

character string indicating how to array the points:

  • "offset" (default) uses a rectangular grid where alternating points on each row are offset slightly on the y-axis.

  • "rectangle" uses a rectangular grid with points on each row that share the same y-axis value.

buffer

numeric optional buffer used to adjust the jp polygon size overall, where negative values will slightly shrink the polygon border. Points are sampled after this adjustment.

byCols

character passed to jamba::mixedSortDF() to determine how to sort the resulting coordinates. Default byCols=c("-y", "x") sorts top-to-bottom, then left-to-right.

algorithm

character string, default "split"

  • "split": newer approach that starts with large step increases in n, then subdivides between failure/success to find the optimal final n. During testing it was substantially faster and more accurate than the previous algorithm "seq".

  • "seq": attempts a linear sequence of n values with gradual increases. The approach is slow, testing values iteratively without regard to the relative success, number of "points in polygon" compared to the number requested. It also used a fixed "step size" which sometimes produced more valid points than requested, and required using a subset of points, see argument spread.

do_plot

logical indicating whether to create a plot to illustrate the process.

verbose

logical indicating whether to print verbose output.

...

additional arguments are ignored.

Details

This function arrays points across solid portions of polygons provided in jp.

Todo:

  1. Enable polygon buffer to guarantee minimum spacing from borders.

  2. Allow different spatial patterns, currently square or rectangular. In future, consider hexagonal, diamond, or diagonal.

Examples

df3 <- data.frame(name=c("polygon1", "polygon2"),
   label=c("polygon1", "polygon2"),
   x=I(list(
      list(c(1, 6, 6, 1),
         c(2, 5, 5, 2),
         c(3, 4, 4, 3)),
      list(#c(11, 16, 16, 11),
         c(12, 15, 15, 12),
         c(13, 14, 14, 13))
      )),
   y=I(list(
      list(c(1, 1, 6, 6),
         c(2, 2, 5, 5),
         c(3, 3, 4, 4)),
      list(#c(1, 1, 6, 6),
         c(2, 2, 5, 5),
         c(3, 3, 4, 4))
      )),
   fill=c("gold", "firebrick"))
jp3 <- new("JamPolygon", polygons=df3);

sample_JamPolygon(jp3[1,], n=40, do_plot=TRUE, algorithm="seq")

sample_JamPolygon(jp3[1,], n=40, do_plot=TRUE, algorithm="split")

sample_JamPolygon(jp3[1,], n=60, buffer=-0.3, spread=FALSE, do_plot=TRUE)

sample_JamPolygon(jp3[1,], n=60, buffer=-0.3, spread=FALSE, do_plot=TRUE, algorithm="split")

sample_JamPolygon(jp3[1,], n=60, buffer=-0.3, spread=FALSE, do_plot=TRUE, algorithm="seq")


sample_JamPolygon(jp3[1,], n=40, xyratio=1.5, do_plot=TRUE)


sample_JamPolygon(jp3[1,], n=40, xyratio=1/1.5, do_plot=TRUE)