我和我的祖国之用 R 画国旗
楚新元 / 2019-10-08
国庆长假就这样过完了,国庆阅兵绝对是重点,借用别人的代码画个国旗吧1。
# 画五角星的函数
star = function(posXY, size = 1, theta = 0, color = "yellow") {
alpha = 2 * pi / 5
R = size
r = sin(pi / 10) * R / sin(7 * pi / 10)
pointpos = matrix(0, nrow = 10, ncol = 2)
Beta = (pi / 10 + theta) + (0:4) * alpha
pointpos[seq(1, 9, 2), ] = cbind(cos(Beta) * R + posXY[1], sin(Beta) *
R + posXY[2])
Beta = (3 * pi / 10 + theta) + (0:4) * alpha
pointpos[seq(2, 10, 2), ] = cbind(cos(Beta) * r + posXY[1], sin(Beta) *
r + posXY[2])
polygon(pointpos, col = color, border = color)
}
# 计算小五角星旋转角度的函数
rotTheta = function(posxy, posXY) {
atan((posXY[2] - posxy[2]) / (posXY[1] - posxy[1])) + pi / 2
}
# 常量设置
width = 3
height = 2 * width / 3
d = width / 30
yshift = height / 2
# 国旗的坐标
Flag = cbind(c(0, width, width, 0), c(0, 0, height, height))
# 大五角星坐标
posXY = c(5 * d, yshift + 5 * d)
# 小五角星坐标
posxy = matrix(c(10, 8, 12, 6, 12, 3, 10, 1), ncol = 2, byrow = T) * d +
matrix(c(0, yshift), nrow = 4, ncol = 2, byrow = T)
# 小五角星旋转角度
rottheta = rep(0, nrow(posxy))
rottheta = apply(posxy, 1, rotTheta, posXY)
# 画红色的国旗底面
plot(
Flag, type = "n", col = "red", axes = F,
xlim = c(0, width), ylim = c(0, height),
xlab = "", ylab = "",
main = "People's Republic of China", asp = 1
)
polygon(Flag, density = NULL, col = "red", border = "red")
# 画出大五角星
star(posXY, size = 3 * height / 20, theta = 0, color = "yellow")
# 画出四颗小星
for (i in 1:nrow(posxy)) {
star(posxy[i, ], size = height / 20, theta = rottheta[i], color = "yellow")
}