Генерация вафельной карты с использованием не радиального полинома Зерника в R
Я смоделировал вафельную карту, используя радиальный зерник, используя код ниже.
library(data.table)
library(dplyr)
.odd <- function(n,m) {
if (((n-m)%%2) == 0) return(FALSE)
else return(TRUE)
}
rzernike <- function(rho, theta, n, m){
if ((n<0) || (m<0) || (n<m) || (.odd(n,m))) stop("Bad argument to rzernike")
#if ((n==0) && (m==0))return(0*rho)
#if (n==m) return(n*rho^(n-1))
#if (m==0) dr <- 0*rho else dr <- m*rho^(m-1)
rmn <- 0
for(l in seq(0, (n-m)/2, by=1)){
num <- ((-1)^l * factorial(n-l))* rho^(n-(2*l))
den <- factorial(l)*factorial((0.5*(n+m))-l)*factorial((0.5*(n-m))-l)
r <- num/den
rmn <- rmn + r
#print(rmn)
}
z <- rmn * cos(m*theta)
return(z)
}
### creating a grid of (x,y,z)
refx <- -0.0046
refy <- 0.5042
pitchx <- 11.021679
pitchy <- 15.291358
rho_vec <- c()
theta_vec <- c()
xvec <- c()
yvec <- c()
for(i in seq(-20,20,by=1)){
for(j in seq(-20,20, by=1)){
x <- refx + (pitchx * i)
y <- refy + (pitchy * j)
rad <- (x^2 + y^2)^0.5
if(rad < 150){
rho <- rad/1000
theta <- atan(y/x)
rho_vec <- c(rho_vec, rho)
theta_vec <- c(theta_vec, theta)
xvec <- c(xvec,x)
yvec <- c(yvec,y)
}
}
}
z1 <- rzernike(rho_vec, theta_vec, 2, 0)
z <- z1
df <- as.data.frame(cbind(xvec,yvec,z))
ggplot(df , aes(x = xvec, y = yvec)) +
geom_raster(aes(fill = z), interpolate=TRUE) +
#geom_text(aes(label = round(Coord/100, 0))) +
scale_fill_gradientn(colors=rainbow(10))+
guides(fill=guide_legend(title='Legend'))+
theme(
panel.background = element_rect(fill= 'white', color = 'white'),
panel.grid.major = element_line(color='#E0E0E0'),
panel.grid.minor = element_line(color='#E0E0E0')
#,aspect.ratio=6/4
)
Я получаю идеальную первичную сферическую вафельную карту из приведенного выше кода. Теперь я хочу создать вафельную карту не радиального шаблона, как шаблоны, показанные на рисунке ниже. Я пробовал использовать комбинации разных зерников, но они не дают мне ничего ближе к приведенным ниже схемам. Буду признателен за любую помощь здесь. Спасибо