Гладко затененные концентрические формы
Фон
Глядя на создание интересных видеопереходов (в оттенках серого).
Проблема
Учитывая уравнения, которые представляют собой замкнутую симметричную форму, нарисуйте контур и концентрично зачеркните фигуру по направлению к ее центру.
Пример
Рассмотрим следующие уравнения:
x = 16 * sin(t)^3
y = 13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t)
t = [0:2 * pi]
При построении графика:
![u0qja.png]()
При затенении он будет напоминать (не показан полностью заштрихованный, но достаточно, чтобы показать эту идею):
![oRwFy.png]()
Обратите внимание, что затенение темнее снаружи (например, # 000000 RGB hex), затем светится, когда он заполняется до центра. Центр будет белым (например, #FFFFFF).
Вопросы
- Каким будет наиболее целесообразный способ создания изображений с высоким разрешением, концентрически затененных изображений в оттенках серого, например, заштрихованного сердца выше?
- Что представляют собой такие замкнутые, симметричные формы, которые формально называются?
Спасибо!
Идеи
- Используйте библиотеку, такую как http://code.google.com/p/jmathplot/
- Использовать GNUPlot
- Использовать R
- Участок с использованием Wolfram Alpha, используйте ImageMagick для создания небольших концентрических версий.
Ответы
Ответ 1
Попробуйте это в 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) Плоская форма, состоящая из линий, которые не пересекаются с другими, обычно называется простым многоугольником.
Ответ 2
Используя 2D-графика, этот пример изменяет прозрачность концентрических окружностей с использованием drawOval()
для достижения аналогичного эффекта, но этот подход может быть расширен до draw()
любого класса, реализующего интерфейс Shape
, Метод createTransformedShape()
AffineTransform
может использоваться для перевода и масштабирования контура концентрически.