Гладкие затененные концентрические формы, основанные на уравнениях - PullRequest
20 голосов
/ 01 июля 2011

Фон

Глядя для создания интересных видеопереходов (в оттенках серого).

Проблема

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

Пример

Рассмотрим следующие уравнения:

x = 16 * sin(t)^3
y = 13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t)
t = [0:2 * pi]

При нанесении на график:

image

When shaded, it would resemble (not shown completely shaded, but sufficient to show the idea):

image

Notice that shading is darkest on the outside (e.g., #000000 RGB hex), then lightens as it fills to the centre. The centre would be a white (e.g., #FFFFFF) dot.

Questions

  1. What would be the most expedient way to produce high-resolution, concentrically shaded grayscale images, such as the shaded heart above?
  2. What are such closed, symmetrical shapes formally called?

Thank you!

Ideas

  • Use a library such as http://code.google.com/p/jmathplot/
  • Использовать GNUPlot
  • Использовать R
  • Сюжет с использованием Wolfram Alpha, используйте ImageMagick для создания меньших концентрических версий

Ответы [ 2 ]

31 голосов
/ 01 июля 2011

Попробуйте это в R:

# create palette
greyScale <- colorRampPalette(c("black","white"))

# function to draw shape
plotHeart <- function(r, col){
  t <- seq(0,2*pi,length.out=100)
  x <- r*sin(t)^3
  y <- (13*r/16)*cos(t) - (5*r/16)*cos(2*t) - (2*r/16)*cos(3*t) - (r/16)*cos(4*t)
  polygon(x,y,col=col,border=NA)
}



# create new plot canvas
plot.new()
# limits are approximate here
plot.window(xlim=c(-16,16),ylim=c(-16,13))

# use mapply to loop
mapply(plotHeart,seq(16,0,length.out=100),greyScale(100))

Что приводит к:

Filled heart plot

Это работает путем повторного рисования заполненных многоугольников уменьшающегося размера и разных цветов поверх друг друга. Чтобы ответить на ваши вопросы:

(1) Это было сделано моей машиной (скромным ноутбуком Core 2 Duo) за 0,09 секунды. Это могут быть другие языки / реализации, которые работают быстрее, но мне это кажется достаточно быстрым.

(2) Плоская форма, состоящая из линий, которые не пересекают другие, обычно называется простым многоугольником.

1 голос
/ 01 июля 2011

Использование 2D-графики , этот пример изменяет прозрачность концентрических окружностей с использованием drawOval() для достижения аналогичного эффекта, но подход может быть расширен до draw() любой класс, реализующий интерфейс Shape. Метод createTransformedShape() AffineTransform может использоваться для преобразования и масштабирования контура концентрически.

...