方程驱动的平滑着色同心形状

2022-09-02 09:41:30

背景

希望创建有趣的视频过渡(灰度)。

问题

给定表示封闭对称形状的方程,绘制轮廓并将形状同心着色到其中心。

请考虑以下等式:

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 十六进制),然后在填充到中心时变亮。中心将是一个白色(例如,#FFFFFF)点。

问题

  1. 生成高分辨率、同心阴影灰度图像(如上面的阴影心形)的最便捷方法是什么?
  2. 这种封闭的对称形状正式被称为什么?

谢谢!

想法


答案 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双核笔记本电脑)在0.09秒内生产的。它们可能是其他更快的语言/实现,但这对我来说似乎足够快。

(2)由不与其他线相交的线组成的平面形状通常称为简单多边形。


答案 2

此示例使用 2D 图形更改同心圆的透明度,以实现类似的效果,但该方法可以扩展到实现 Shape 接口的任何类。仿射变形的方法可用于同心平移和缩放轮廓。drawOval()draw()createTransformedShape()