Подтвердить что ты не робот

Как иметь только любую другую границу в persp

Я хотел бы сделать следующее

set.seed(1)
x <- seq(-10, 10, length= 600)
y <- x
f <- function(x, y) { r <- sqrt(x^2+y^2); 10 * sin(r)/r }
z <- outer(x, y, f)
persp(x, y, z, theta = 30, phi = 30, expand = 0.5, col = "lightblue")

Но сетка слишком тонкая, поэтому граница доминирует (вы можете подтвердить, что это действительно граница, а не освещение, используя border = NA. Она становится синей):

enter image description here

Одним из способов решения этой проблемы является, конечно, использование не очень тонкой сетки (например, если вы меняете length = 600 на length= 50, это выглядит очень приятным и на самом деле является примером в? persp). Но я хочу такую ​​же форму и ровную ровность, как эта тонкая сетка. Я просто не хочу рисовать все границы, может быть, только 1/5 из них, например (или половина, которую я предполагаю, что я могу настроить).

4b9b3361

Ответ 1

Проблема с построением гладкой формы и последующим построением сетки поверх нее состоит в том, что вы можете видеть форму по сетке на другой стороне. Чтобы решить эту проблему, вы можете начать с построения сетки курса поверх белого объекта, то есть вы не можете видеть обратную сторону сетки, сохраняя результат в файле.

x <- seq(-10, 10, length=50)
y <- x
z <- outer(x, y, f)
png("top.png")
print(persp(x, y, z, theta = 30, phi = 30, expand = 0.5, border="black", col="white"))
dev.off()

enter image description here

Затем вы можете нарисовать сглаженное изображение, а затем сетку со всеми белыми цветами, полностью прозрачными.

x <- seq(-10, 10, length= 600)
y <- x
f <- function(x, y) { r <- sqrt(x^2+y^2); 10 * sin(r)/r }
z <- outer(x, y, f)
png("bottom.png")
print(persp(x, y, z, theta = 30, phi = 30, expand = 0.5, border="lightblue", col="lightblue"))
dev.off()

par(oma=c(0, 0, 0, 0), mar=c(0, 0, 0, 0))
library(png)
top.img <- readPNG("top.png")
top.img[,,4][top.img[,,1] + top.img[,,2] + top.img[,,3] > 2] <- 0

plot.new()
rasterImage(bottom.img, 0, 0, 1, 1)
rasterImage(top.img, 0, 0, 1, 1)

enter image description here

Ответ 2

У меня есть два решения, но я думаю, что оба они не совсем то, что вы ищете. Я делаю оверлей линий, но он не перекрывается поверхностью.

set.seed(1)
x <- seq(-10, 10, length= 600)
y <- x
f <- function(x, y) { r <- sqrt(x^2+y^2); 10 * sin(r)/r }
z <- outer(x, y, f)
persp(x, y, z, theta = 30, phi = 30, expand = 0.5, col = "lightblue", border=NA, shade=0.75,  ticktype = "detailed")

par(new=T)

set.seed(1)
x <- seq(-10, 10, length=20)
y <- x
f <- function(x, y) { r <- sqrt(x^2+y^2); 10 * sin(r)/r }
z <- outer(x, y, f)
persp(x, y, z, theta = 30, phi = 30, expand = 0.5, col = NA, border="green")

cornered line overlay

set.seed(1)
x <- seq(-10, 10, length= 600)
y <- x
f <- function(x, y) { r <- sqrt(x^2+y^2); 10 * sin(r)/r }
z <- outer(x, y, f)
res <- persp(x, y, z, theta = 30, phi = 30, expand = 0.5, col = "lightblue", border=NA, shade=0.75,  ticktype = "detailed")

library(grDevices)
xlines <- seq(1, length(x), length.out=20)
for(line in xlines){
  lines (trans3d(x=x[line], y = y, z = z[line, ], pmat = res), col = 3, lwd=2)
}

ylines <- seq(1, length(y), length.out=20)
for(line in ylines){
  lines (trans3d(x=x, y = y[line], z = z[,line], pmat = res), col = 3, lwd=2)
}

curved overlay

Ответ 3

Вот два подхода, ни один из которых не идеален. Вы можете использовать NA, чтобы нарисовать прозрачные "линии" на поверхности (подход 1) или использовать NA, чтобы избавиться от всех, кроме "линий сетки" (подход 2)

Подход 1:

z2 <- z
lin.seq<- seq(10, 600, 10)
z2[lin.seq,] <- NA
z2[,lin.seq] <- NA
persp(x, y, z2, theta = 30, phi = 30, expand = 0.5,
      border=NA, col="lightblue", box=TRUE)

enter image description here

Затем вы можете наложить надпись сверху на сплошную черную поверхность:

# using original example data
persp(x, y, z, theta = 30, phi = 30, expand = 0.5, col = "black", border=NA)

par(new=TRUE)
z2 <- z
lin.seq<- seq(10, 600, 10)
z2[lin.seq,] <- NA
z2[,lin.seq] <- NA
persp(x, y, z2, theta = 30, phi = 30, expand = 0.5,
      border=NA, col="lightblue", box=FALSE)

enter image description here

Подход 2:

# using original example data
persp(x, y, z, theta = 30, phi = 30, expand = 0.5, col = "lightblue", border=NA)

z3 <- matrix(ncol=600, nrow=600)               # NA matrix
lin.seq <- seq(25, 600, 25)                    # spacing of "grid lines"
lin.seq <- c(lin.seq, lin.seq-1, lin.seq-2)    # to make lines a bit thicker

# replace some NAs on "grid lines" with values from z.    
z3[lin.seq,] <- z[lin.seq,]
z3[,lin.seq] <- z[,lin.seq]

par(new=TRUE)
persp(x, y, z3, theta = 30, phi = 30, expand = 0.5,
      border=NA, col="black", box=FALSE)

enter image description here