Welcome to R Square

我和我的祖国之用 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")
}


  1. 用 R 画国旗:http://blog.sina.com.cn/s/blog_7015676c0100o0xn.html ↩︎