Гладкие затененные концентрические формы, основанные на уравнениях

Фон

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

проблема

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

пример

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

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

Когда построено:

Когда оно затенено, оно будет выглядеть (не показано полностью затененным, но достаточно, чтобы показать идею):

Обратите внимание на то, что затенение является самым темным снаружи (например, #000000 RGB hex), а затем становится светлее по мере заполнения до центра. Центр будет белой (например, #FFFFFF) точкой.

Вопросы

  1. Каков был бы наиболее целесообразный способ получения изображений с высоким разрешением и оттенками серого с концентрическим оттенком, такими как изображение с затененным сердцем выше?
  2. Как называются такие замкнутые симметричные формы?

Спасибо!

идеи

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

2 ответа

Решение

Попробуйте это в 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))

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

Заполненный участок сердца

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

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

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

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

Другие вопросы по тегам