This function takes a matrix of points, calculates the cumulative distance from start to end and then uses the cumulative distance and intermediate points to generate evenly spaced points between the start and end points. Linear interpolation is used between neighboring points, so the returned points will either coincide with the input points or fall on straight lines between consecutive points.
a matrix or landmark list of points of any number of dimensions. If input is a list, only the first element is used.
the number of points to generate, including the start and end points.
The function first removes all
NA values. Then, the cumulative distance is calculated from the first to last point. The last value is taken as the total length of the line or curve, defined by matrix
x. This total length is divided by
n-1 to find a uniform segment length that will separate
n evenly spaced points, including the first and last non-
NA values in
The function iterates through
x, finding the point that is at a distance equal to or just less than the segment length from the previous point. If the selected point is at a distance less than the segment length from the previous point, a point is chosen on the line between this point and the next to complete the full segment length. In this way, returned points will either coincide with the input points or fall on straight lines between consecutive points.
In the simplest implementation,
pointsAtEvenSpacing() can be used for linear interpolation (see first example below). Define the start and end points in
x as a two-row matrix and then select the number of points to include on the line.
x represents densely sampled points on a curve (see the second example below) and if the curve can be approximated by straight lines between consecutive points, then
pointsAtEvenSpacing() will provide comparable results to other methods, such as function fitting. This is especially useful for curves not easily fit by a mathematical function.
a matrix of
n points. The start and end points correspond to the first and last non-NA values in
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
## LINEAR INTERPOLATION ## ## CREATE A MATRIX OF TWO POINTS two_points <- matrix(c(0, 10, 0, 10), nrow=2, ncol=2) ## GENERATE 20 POINTS ALONG THE LINE pts_aes <- pointsAtEvenSpacing(x=two_points, n=20) ## PLOT THE LINE plot(two_points, type='l') ## AND THE POINTS ALONG THE LINE points(pts_aes, col='red') ## POINTS ALONG A CURVE ## ## GET FILE DIRECTORY FOR PACKAGE FILES fdir <- paste0(path.package("StereoMorph"), "/extdata/") ## GET 3D LANDMARK AND CURVE POINT FILE AND READ INTO A MATRIX lm.matrix <- readLandmarksToMatrix(paste0(fdir, "lm_3d_a2.txt"), row.names=1) ## PLOT THE LANDMARKS AND CURVE POINTS pts <- na.omit(lm.matrix) r <- abs(apply(pts, 2, 'max') - apply(pts, 2, 'min')) ## Not run: ## PLOT USING THE RGL PACKAGE plot3d(pts, aspect=c(r/r, r/r, 1), size=0.5) ## End(Not run) ## CONVERT LANDMARKS TO LIST FORMAT TO EASILY ACCESS CURVE POINTS lm.list <- landmarkMatrixToList(lm.matrix) ## CREATE 10 EVENLY SPACED POINTS ALONG ONE CURVE lm.list$pterygoid_crest_R <- pointsAtEvenSpacing(x=lm.list$pterygoid_crest_R, n=10) ## CREATE 15 ALONG ANOTHER lm.list$tomium_R <- pointsAtEvenSpacing(x=lm.list$tomium_R, n=15) ## CONVERT BACK TO MATRIX lm.matrix <- landmarkListToMatrix(lm.list) ## Not run: ## PLOT NEW EVENLY SPACED POINTS WITH PREVIOUS POINTS plot3d(lm.matrix, add=T, size=4, col='red') ## End(Not run)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.