最近看了张艺谋导演的《一秒钟》,感触有一点点多。张译好像终于不瘸了,刘浩存初看感觉平平无奇,越看越觉得好看。除了《一秒钟》,刘浩存和四字弟弟的电影《送你一朵小红花》最近的热度也是很高。可惜,我在美国看不到,只能等线上资源。刷了很多影评和剧透,很期待。
虽然看不到,但是也想画一朵小红花。在这样一个年月里,每个人都值得拥有一朵小红花。
画出一朵小红花其实非常简单,只需要一个正弦或者余弦函数,高级一点的,可以使用玫瑰曲线方程。有的时候不得不感慨,数学真的是万能的,一个及其简单的公式,却可以勾勒出复杂的世界。
送你一朵小红花
正余弦三角函数
如果只想简简单单绘制一朵平平无奇的小红花,那么正弦或者余弦函数就足以胜任。因为正余弦函数特殊的性质,我们在二维平面直角坐标系中绘制出特定周期长度的函数图线后,只需使用ggplot2
中的coord_polar()
将坐标轴转换为极坐标,就可绘制出小红花。
我们以正弦函数为例进行说明,余弦函数可以得到相同的效果。正弦函数的周期至少为两个,即轴的长度为,每个周期是一朵花瓣,所以可以画出两朵花瓣。如果我们要绘制出5朵花瓣,长度就应设定为。我们首先绘制出二维平面直角坐标系下的正弦函数图像:
### 加载ggplot2library(tidyverse)### 设定周期长度theta <- seq(0, 10*pi, length.out = 500)x <- sin(theta) df <- data.frame(theta, x)### 绘制正弦函数曲线ggplot(df, aes(theta, x)) + geom_line()

上图是正弦函数的标准样式,下面我们在此基础之上,极化坐标:
ggplot(df, aes(theta, x)) + ### 线条颜色改为红色 geom_line(color = "red") + ### 用点表示花蕊 geom_point(x = 0, y = -1, size = 2) + coord_polar() + ### 去掉坐标轴 theme_void()

我们可以使用geom_polygon()
实现对花瓣颜色的填充:
ggplot(df, aes(theta, x)) + geom_polygon(fill = "red") + geom_point(x = 0, y = -1, size = 2) + coord_polar() + theme_void()

如果你想绘制出更多花瓣,只需增加周期长度。
玫瑰曲线方程
除了简单的正余弦函数外,还有一个非常有名的玫瑰曲线。玫瑰曲线最早于1723年由意大利数学家Guido Grandi提出。玫瑰曲线的极坐标方程为:
直接根据极坐标绘制是很困难的,我们可以将其转换为直角坐标系方程:
在的范围内,当为偶数时,我们根据上述方程可以绘制出个花瓣,当为奇数时,我们可以绘制出个花瓣。当的取值范围不限于时,定义,不同的组合值可以绘制出不同的图案,如下图:

我们这里首先绘制和前面一节相同的五瓣小红花:
### 设定取值范围theta <- seq(0, 2*pi, length.out = 500)### 根据玫瑰曲线方程计算直角坐标x <- cos(5*theta)*cos(theta)y <- cos(5*theta)*sin(theta)df <- data.frame(theta, x, y)ggplot(df, aes(x, y)) + ### 这里不可使用geom_line() geom_path(color = "red") + theme_void() + theme(aspect.ratio = 1)

当我们将取值范围设定为,设定,就可得到更为复杂的曲线图案:
theta <- seq(0, 16*pi, length.out = 500)x <- cos((7/8)*theta)*cos(theta)y <- cos((7/8)*theta)*sin(theta)df <- data.frame(theta, x, y)ggplot(df, aes(x, y)) + geom_path(color = "red") + theme_void() + theme(aspect.ratio = 1)

以上,就是今天的内容,希望你也能画出一朵小红花。
来源:爱尔兰粉公爵,本文观点不代表自营销立场,网址:https://www.zyxiao.com/p/113165