- 已编辑
N久前看了蓝枫斑竹的太极图后想起来画的,现在正好给祖国庆生。
在下的代码先就不放了,因为我在网上见过其他版本的心——答案是丰富多彩的,感兴趣的同学不妨一试。
顺便给个疑似心形的方程,仅供参考。
这两天想利用这方程再做一个版本,因为解二次方程无能而未遂……
所以恳请各位前辈指教R怎样解二次方程?
N久前看了蓝枫斑竹的太极图后想起来画的,现在正好给祖国庆生。
在下的代码先就不放了,因为我在网上见过其他版本的心——答案是丰富多彩的,感兴趣的同学不妨一试。
顺便给个疑似心形的方程,仅供参考。
这两天想利用这方程再做一个版本,因为解二次方程无能而未遂……
所以恳请各位前辈指教R怎样解二次方程?
乐意分享
# heart
n <- 30000
p <- sort(runif(n, min = 0, max = pi))
p <- sin(p) + rnorm(n)
plot(sort(rnorm(n)), -p,
col = "red", pch = "·", axes = F, ylab = "",
xlab = paste("By 微微", Sys.Date()), main = "Happy Birthday"
)
# stars
p <- c()
q <- c()
rr <- c(0.68, rep(0.32, 4))
# locator()定的下面坐标,精确但不准确。
m <- c(-1.2511927, -0.7707085, -0.5538095, -0.6129638, -0.8293381)
n <- c(-0.079779159, 0.42312375, 0.05632304, -0.45719796, -0.8440031)
for (k in c(1:5))
{
r <- rr[k]
for (i in 1:5)
{
p[2 * i - 1] <- sin(pi * 18 / 90) / sin(pi * 54 / 90) * r * sin(pi * (i * 72 + 36) / 90)
q[2 * i - 1] <- sin(pi * 18 / 90) / sin(pi * 54 / 90) * r * cos(pi * (i * 72 + 36) / 90)
p[2 * i] <- sin(pi * 18 / 90) / sin(pi * 54 / 90) * 0.38 * r * sin(pi * (i * 72 + 18) / 90)
q[2 * i] <- sin(pi * 18 / 90) / sin(pi * 54 / 90) * 0.38 * r * cos(pi * (i * 72 + 18) / 90)
}
x <- c(p[1], p[2], p[5], p[6], p[9], p[10], p[3], p[4], p[7], p[8], p[1])
y <- c(q[1], q[2], q[5], q[6], q[9], q[10], q[3], q[4], q[7], q[8], q[1])
x <- x + m[k]
y <- y + n[k]
polygon(x, y, col = "yellow", border = "yellow")
}
我也来凑凑热闹,做了一个rgl版的“我的中国心”,资料来源:http://tieba.baidu.com/f?ct=335675392&tn=baiduPostBrowser&sc=5158824889&z=511497934&pn=0&rn=30&lm=0&word=%CA%FD%D1%A7#5158824889。
这个帖子给出了心形的曲面方程,形式比较简洁,但画起来比较困难,因为有很多斜率不存在的点,因此只能从多个方向同时贴图才能画出来。代码比较长,就放附件里了,运行的时候记得把工作空间设在代码所在的文件夹中,因为有个贴图文件flag.png。程序运行可能比较慢,耐心等会儿,也可以把里面的n调小一点,用精细度换取时间。这里给出几张截图。
我把这两个例子都发到fun包中了,过两天R-Forge编译好了之后大家可以install.packages("fun", repos="http://R-Forge.R-project.org")
,然后demo("ChinaHeart3D")
看Ihavenothing的3D版本,demo("ChinaHeart2D")
看微微的2D版本。
Linux用户或者装了Rtools的Windows用户可以自己下载源代码编译(svn checkout)。