用 echarts4r 包绘制嵌套环形图时遇到图层叠加问题
yuanfan 早年间有段时期论坛里有一股用 R “不务正业”的风气,我看这股歪风时隔十几年又要刮起来了。
yuanfan 用我残存的一点初中三角函数知识勉强算了一下坐标。我只是路过手痒,上桌搓一把就走,麻将你们继续。我估计楼主的多数花都可以这样蛮力画出来,只是太杀时间了。
# 将坐标矩阵逆时针旋转 theta 度
rotate = function(m, theta) {
ct = cos(theta); st = sin(theta)
as.matrix(m) %*% matrix(c(ct, -st, st, ct), 2)
}
# 一层花瓣的坐标矩阵
petal_one = function(n = 8, init = 0, r = 1, N = 100) {
a = 2 * pi / n / 2 # 每片花瓣夹角的一半
x1 = r * cos(a)
y1 = r * sin(a)
r2 = r * tan(a)
a2 = pi/2 - a
x2 = r2 * cos(a2)
t = seq(-pi/2 - a, pi/2 + a, length.out = N)
x3 = x1 + x2 + r2 * cos(t)
y3 = r2 * sin(t)
xa = c(0, x1, x3, x1, 0)
ya = c(0, -y1, y3, y1, 0)
xy = cbind(xa, ya)
res = lapply(init + 2 * pi * (seq(n) - 1)/n, function(theta) {
rbind(rotate(xy, theta), NA)
})
do.call(rbind, res)
}
petal_all = function(L = 3, n = 8, ...) {
res = NULL
for (i in L:1) {
init = if (i %% 2 == 0) pi/n else 0
res = rbind(res, petal_one(n, init, 2 + i/L, ...))
}
res
}
# 参数:L 为层数,n 为花瓣数量
draw_flower = function(...) {
xy = petal_all(...)
par(mar = rep(1, 4), bg = '#FFFFE0')
plot(xy, type = 'n', asp = 1, ann = FALSE, axes = FALSE)
polygon(xy, col = '#FF6A6A', border = 'white', lwd = 5)
points(0, 0, cex = 10, col = 'white', bg = '#FFA500', pch = 21, lwd = 3)
}
# 默认 3 层 8 瓣
draw_flower()
# 4 层 16 瓣
draw_flower(4, 16)
# 锐化花瓣(五角花瓣)
draw_flower(N = 5)
楼主的花蕊左上角有一段白弧,估计是无意渲染出来的,但造成了画花点晶的光线效果;我画的花蕊缺了那一丁点用来表示亮晶晶的白色反光,相比之下就土了一截。
- 已编辑
yihui 我之前看过贵厂 Thomas Lin Pedersen 用 R 画了很多艺术作品,甚是惊艳,BG 一下子上去了,见网站 https://www.data-imaginist.com/art
Thomas Lin Pedersen 说不会给出结果,因为那是创造力的杀手,我猜模拟一些二维或三维空间中的随机过程,有可能实现类似的效果。还有一些常、偏微分方程(组)的解也可能实现。要点是先找到有趣的方程。
楼上各位有兴趣的可以凑一桌麻将了。
楼上的小伙伴们这是要滑向艺术的深渊呐。
听闻谷歌开发了一个名为 Disco Diffusion 的工具,可以做到 AI 画画。出得去的小伙伴可以去瞅瞅,是不是输入一句古诗也能画出图来,比如:夜雨打金荷。
Cloud2016 又一位搞艺术创作的 R 语言画家 Danielle Navarro
19 天 后
- 已编辑
试了一下用 ggplot 画分型
15 天 后
又有一位搞生成艺术的 R 语言作家 Claus O. Wilke