Given a point and a set of line segments representing a convex or alpha hull, calculate the closest point on the segments.
project.onto.segments <- function
### Given a point and a set of line segments representing a convex or
### alpha hull, calculate the closest point on the segments.
(m,
### m is 1 row, a center of a point cloud, we need to find the
### distance to the closest point on each segment of the convex
### hull.
h,
### Data frame describing the line segments of the convex or alpha
### hull.
debug=FALSE,
...
### ignored
){
h$s <- (h$y2-h$y1)/(h$x2-h$x1)
## the closest point on the line formed by expanding this line
## segment (this expression is calculated by finding the minimum
## of the distance function).
h$xstar <- (m$x + m$y*h$s + h$x1*h$s^2 - h$s*h$y1)/(h$s^2+1)
h$minval <- apply(cbind(h$x1,h$x2),1,min)
h$maxval <- apply(cbind(h$x1,h$x2),1,max)
## xopt is the closest point on the line segment
h$xopt <- ifelse(h$xstar<h$minval,h$minval,
ifelse(h$xstar>h$maxval,h$maxval,h$xstar))
h$yopt <- h$s*(h$xopt-h$x1)+h$y1
## distance to each point on line segment from the center
h$d <- (m$x-h$xopt)^2+(m$y-h$yopt)^2
i <- which.min(h$d)
result <- with(h[i,],data.frame(x=xopt,y=yopt))
if(debug){
grid.segments(m$x,m$y,result$x,result$y,default.units="cm")
}
result
}
| Please contact Toby Dylan Hocking if you are using directlabels or have ideas to contribute, thanks! |
| Documentation website generated from source code version 2021.2.24 (git revision bb6db07 Mon, 14 Jun 2021 22:38:45 +0530) using inlinedocs. |
| validate |