smocking_pattern.pngPremise
My wife asked me to come up with some graph paper for creating smocking patterns. After a couple of minutes playing around with R-base graphics functions, it occurred to me that several functions in the sp package would simplify grid-based operations. Some example functions, along with a simple approach to generating "interesting" patterns, are listed below.

Function Definitions

# make a nice grid from given grid topology
gg <- function(x)
{
# convert to spatial grid
x.sg <- SpatialGrid(x)
# extract grid axes
x.cv <- coordinatevalues(x)
# setup plot region
xy.min <- sapply(x.cvmin)
xy.max <- sapply(x.cvmax)
plot(1,1cex=0.25type='n'xlim=c(xy.min[1]xy.max[1])ylim=c(xy.min[2]xy.max[2])axes=FALSE)
# add grid
abline(h=x.cv$s2v=x.cv$s1col='grey'lty=1)
abline(h=seq(-0.5max(x.cv$s2)by=4)col='grey'lty=1lwd=2)
# make axis labels
y.axis.at <- seq(from=xy.max[2]to=xy.min[2]by=-4)
y.axis.lab <- seq(along=y.axis.at)
axis(side=2at=y.axis.atlabels=y.axis.lablwd=NAlas=2pos=-1)
# return grid information
return(list(xy.min=xy.minxy.max=xy.maxoffset=x@cellcentre.offset))
}
# plot a point on the grid
# referenced from the upper-left corner
# this function is vectorized, because points() is vectorized
gp <- function(x,ygrid.pars, ...)
{
x.prime <- x
y.prime <- (grid.pars$xy.max[2] - grid.pars$offset[2]) - (y - 1)
points(x.primey.prime, ...)
}
gs <- function(x.1y.1x.2y.2grid.pars, ...)
{
x.1.prime <- x.1
x.2.prime <- x.2
y.1.prime <- (grid.pars$xy.max[2] - grid.pars$offset[2]) - (y.1 - 1)
y.2.prime <- (grid.pars$xy.max[2] - grid.pars$offset[2]) - (y.2 - 1)
segments(x.1.primey.1.primex.2.primey.2.prime, ...)
}
# make something more interesting
gsin <- function(grid.parsx_startx_lengthdxx_lagy_starty_phase_iy_phase_fy_amp_iy_amp_f, ...)
{
# generate x-coordinate sequence       
x.i <- seq(x_startx_lengthby=dx)
x.f <- x.i + x_lag
# generate y-coordinate sequence
y.i <- round(y_start + sin(x.i + y_phase_i) * y_amp_i1)
y.f <- round(y_start + sin(x.f + y_phase_f) * y_amp_f,1 )
# plot segments
gs(x.iy.ix.fy.fgrid.pars, ...)
# why not add a point at the strting point of every 10th stitch
gp(x.i[seq(along=x.iby=10)]y.i[seq(along=x.iby=10)]grid.parspch=1cex=0.5col='red')
# return segment information
return(list(x.i=x.iy.i=y.ix.f=x.fy.f=y.f))
}
X

Example Application

library(sp)
# setup grid topology
x <- GridTopology(
cellcentre.offset=c(0.5,0.5),
cellsize=c(1,1),
cells.dim=c(60,40)
)
# init a new grid
grid.pars <- gg(x)
# neat design
gsin(grid.pars155.2542.5pipi22col='blue')
gsin(grid.pars155126.5pi/4pi22col='blue')
gsin(grid.pars1551210.5pi2*pi22col='blue')
gsin(grid.pars1551214.5pi/2pi22col='blue')
gsin(grid.pars1551219pipi20.5col='blue')
gsin(grid.pars15510.523.52*pipi11col='blue')
gsin(grid.pars15510.526.5pipi1.51.5col='blue')
gsin(grid.pars1550.5230.5pi/2pi/212col='blue')
gsin(grid.pars155.75334.5pi/22*pi11col='blue')
gsin(grid.pars155.5.2539pi/4pi/20.52col='blue')
X

Attachment:

smocking_pattern.pdf