Управляйте цветами границы сетки Persp - PullRequest
0 голосов
/ 04 декабря 2018

У меня проблемы с созданием перспективного графика, который выглядит именно так, как я хочу, чтобы он выглядел.В частности, я стараюсь, чтобы сетка не была видна вообще.Если вы посмотрите на изображение слева, вы можете увидеть слабые линии между плитками.Я хочу, чтобы оно выглядело как правильное изображение без видимых линий:

enter image description here

Я специально хочу решение с graphics::persp или другой базовой функцией R.Меня не интересуют сторонние пакеты, такие как rgl.

. Я получил право, используя polygon и указав цвет border, соответствующий цвету col.Если я оставлю border=NA с polygon, то получу тот же результат, что и с persp.Однако кажется, что persp просто берет первое значение границы и использует его повторно, в отличие от polygon, который сопоставляет цвета с полигонами.

Этот код используется для генерации изображения:

nr <- nc <- 10
mx <- matrix(numeric(nr * nc), nr)
par(mai=numeric(4))
col <- gray((row(mx[-1,-1]) * col(mx[-1,-1])/((nr-1)*(nc-1))))

par(mfrow=c(1,3), mai=c(0, 0, .25, 0), pty='s')
persp(
  mx, phi=90, theta=0, border=NA, col=col, r=1e9, zlim=c(0,1),
  axes=FALSE, box=FALSE
)
title('Persp border=NA')
persp(
  mx, phi=90, theta=0, border=col, col=col, r=1e9, zlim=c(0,1),
  axes=FALSE, box=FALSE
)
title('Persp border=col')
plot.new()

mxpoly.x <- rbind(
  c(row(mx)[-nr, -nc]), c(row(mx)[-1, -nc]), c(row(mx)[-1, -1]),
  c(row(mx)[-nr, -1]), NA
)
mxpoly.y <- rbind(
  c(col(mx)[-nr, -nc]), c(col(mx)[-1, -nc]), c(col(mx)[-1, -1]),
  c(col(mx)[-nr, -1]), NA
)
title('Polygon')
polygon(
  ((mxpoly.x - 1) / (max(mxpoly.x,na.rm=TRUE) - 1)),
  ((mxpoly.y - 1) / (max(mxpoly.y,na.rm=TRUE) - 1)),
  col=col, border=col
)

1 Ответ

0 голосов
/ 05 декабря 2018

Это похоже на результат сглаживания.Когда отрисовывается каждая ячейка, фон имеет белый цвет, поэтому сглаживание означает, что пиксели границы отображаются более светлым цветом.

На Mac это можно исправить, отключив сглаживание.Ваш первый пример дает

screenshot with antialiasing

по умолчанию, но если я открою графическое устройство, используя

quartz(antialias = FALSE)

, а затем запустите идентичныйкод, я получаю

screenshot with no antialiasing

Отключение сглаживания может привести к появлению неровных краев, так что это может не быть приемлемым решением вашей реальной проблемы, если оно имеет диагональлинии.

Возможно, вы сможете заставить вещи работать, дважды нарисовав поверхность с помощью сглаживания: первый раз покажет границы, второй раз все равно может что-то показать, но должен показывать меньше.Тем не менее, persp() не имеет аргумента add = TRUE, поэтому рисовать вещи во второй раз, вероятно, будет сложно.

Если вы не на Mac, вам нужно прочитать об устройстве, которое выЯ использую его, чтобы определить, позволяет ли он управлять сглаживанием.

Отредактировано, чтобы добавить: Я пытался изменить источник C для функции persp, чтобы рисовать поверхность 2 или 3 раза.Границы все еще были слегка видны, когда он был нарисован дважды, но не видны при 3-х рисованиях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...