如何在R中画一个鼠形
How to draw a squircle in R
这是一个圆角正方形的代码,不知道它能不能得到一个鼠形的代码,这是一个非常相似的图形。
Wikipedia 指出:
Although constructing a rounded square may be conceptually and physically
simpler, the squircle has the simpler equation and can be generalised
much more easily.
{
x<-c(1,1,0,0)
y<-c(1,0,0,1)
rad <- max(x)/7
ver<-25
yMod<-y
yMod[which(yMod==max(yMod))]<-yMod[which(yMod==max(yMod))]-rad
yMod[which(yMod==min(yMod))]<-yMod[which(yMod==min(yMod))]+rad
topline_y<-rep(max(y),2)
topBotline_x<-c(min(x)+rad, max(x)-rad)
bottomline_y<-rep(min(y),2)
pts<- seq(-pi/2, pi*1.5, length.out = ver*4)
ptsl<-split(pts, sort(rep(1:4, each=length(pts)/4, len=length(pts))) )
xy_1 <- cbind( (min(x)+rad) + rad * sin(ptsl[[1]]), (max(y)-rad) + rad * cos(ptsl[[1]]))
xy_2 <- cbind( (max(x)-rad) + rad * sin(ptsl[[2]]), (max(y)-rad) + rad * cos(ptsl[[2]]))
xy_3 <- cbind( (max(x)-rad) + rad * sin(ptsl[[3]]), (min(y)+rad) + rad * cos(ptsl[[3]]))
xy_4 <- cbind( (min(x)+rad) + rad * sin(ptsl[[4]]), (min(y)+rad) + rad * cos(ptsl[[4]]))
newLongx<-c(x[1:2] ,xy_3[,1],topBotline_x,xy_4[,1], x[3:4], xy_1[,1],topBotline_x,xy_2[,1])
newLongy<-c(yMod[1:2],xy_3[,2],bottomline_y,xy_4[,2], yMod[3:4], xy_1[,2],topline_y ,xy_2[,2])
par(pty="s")
plot.new()
polygon(newLongx,newLongy, col="red")
}
这是一个基础 R squircle
函数。
我相信这些论点是自我描述的。
x0
, y0
- 中心坐标。
radius
- 鼠形半径。
n
- 要计算的点数,默认值 1000
应该使圆弧平滑。
...
- 要传递给 lines
的更多参数。参见 help('par')
。
现在进行功能和简单测试。
squircle <- function(x0 = 0, y0 = 0, radius, n = 1000, ...){
r <- function(radius, theta){
radius/(1 - sin(2*theta)^2/2)^(1/4)
}
angle <- seq(0, 2*pi, length.out = n)
rvec <- r(radius, angle)
x <- rvec*cos(angle) + x0
y <- rvec*sin(angle) + y0
lines(x, y, ...)
}
plot(-5:5, -5:5, type = "n")
squircle(0, 0, 2, col = "red")
squircle(1, 1, 2, col = "blue", lty = "dashed")
Fernandez-Guasti 松鼠。
这是另一种松鼠。额外的参数是 s
,给出鼠形的 正方形 。
# squircleFG: Manuel Fernandez-Guasti (1992)
squircleFG <- function(x0 = 0, y0 = 0, radius, s, n = 1000, ...){
angle <- seq(0, 2*pi, length.out = n)
cosa <- cos(angle)
sina <- sin(angle)
sin2a <- sin(2*angle)
k <- sqrt(1 - sqrt(1 - s^2*sin2a^2))
x <- k*radius*sign(cosa)/(sqrt(2)*s*abs(sina)) + x0
y <- k*radius*sign(sina)/(sqrt(2)*s*abs(cosa)) + y0
lines(x[-n], y[-n], ...)
}
plot(-5:5, -5:5, type = "n")
squircleFG(0, 0, 2, s = 0.75, col = "red")
squircleFG(1, 1, 2, s = 0.75, col = "blue", lty = "dashed")
是不是自己做的原因,看看自己的代码能不能精简?
如果不是这种情况,一种可能性是使用 grid
包中的函数 grid.roundrect
。
他们的帮助页面 ?grid::grid.roundrect
中采用的一个示例是简单地使用
grid.roundrect(width=.5, height=.5, name="rr", gp = gpar(fill = "red"))
这是一个圆角正方形的代码,不知道它能不能得到一个鼠形的代码,这是一个非常相似的图形。
Wikipedia 指出:
Although constructing a rounded square may be conceptually and physically simpler, the squircle has the simpler equation and can be generalised much more easily.
{
x<-c(1,1,0,0)
y<-c(1,0,0,1)
rad <- max(x)/7
ver<-25
yMod<-y
yMod[which(yMod==max(yMod))]<-yMod[which(yMod==max(yMod))]-rad
yMod[which(yMod==min(yMod))]<-yMod[which(yMod==min(yMod))]+rad
topline_y<-rep(max(y),2)
topBotline_x<-c(min(x)+rad, max(x)-rad)
bottomline_y<-rep(min(y),2)
pts<- seq(-pi/2, pi*1.5, length.out = ver*4)
ptsl<-split(pts, sort(rep(1:4, each=length(pts)/4, len=length(pts))) )
xy_1 <- cbind( (min(x)+rad) + rad * sin(ptsl[[1]]), (max(y)-rad) + rad * cos(ptsl[[1]]))
xy_2 <- cbind( (max(x)-rad) + rad * sin(ptsl[[2]]), (max(y)-rad) + rad * cos(ptsl[[2]]))
xy_3 <- cbind( (max(x)-rad) + rad * sin(ptsl[[3]]), (min(y)+rad) + rad * cos(ptsl[[3]]))
xy_4 <- cbind( (min(x)+rad) + rad * sin(ptsl[[4]]), (min(y)+rad) + rad * cos(ptsl[[4]]))
newLongx<-c(x[1:2] ,xy_3[,1],topBotline_x,xy_4[,1], x[3:4], xy_1[,1],topBotline_x,xy_2[,1])
newLongy<-c(yMod[1:2],xy_3[,2],bottomline_y,xy_4[,2], yMod[3:4], xy_1[,2],topline_y ,xy_2[,2])
par(pty="s")
plot.new()
polygon(newLongx,newLongy, col="red")
}
这是一个基础 R squircle
函数。
我相信这些论点是自我描述的。
x0
,y0
- 中心坐标。radius
- 鼠形半径。n
- 要计算的点数,默认值1000
应该使圆弧平滑。...
- 要传递给lines
的更多参数。参见help('par')
。
现在进行功能和简单测试。
squircle <- function(x0 = 0, y0 = 0, radius, n = 1000, ...){
r <- function(radius, theta){
radius/(1 - sin(2*theta)^2/2)^(1/4)
}
angle <- seq(0, 2*pi, length.out = n)
rvec <- r(radius, angle)
x <- rvec*cos(angle) + x0
y <- rvec*sin(angle) + y0
lines(x, y, ...)
}
plot(-5:5, -5:5, type = "n")
squircle(0, 0, 2, col = "red")
squircle(1, 1, 2, col = "blue", lty = "dashed")
Fernandez-Guasti 松鼠。
这是另一种松鼠。额外的参数是 s
,给出鼠形的 正方形 。
# squircleFG: Manuel Fernandez-Guasti (1992)
squircleFG <- function(x0 = 0, y0 = 0, radius, s, n = 1000, ...){
angle <- seq(0, 2*pi, length.out = n)
cosa <- cos(angle)
sina <- sin(angle)
sin2a <- sin(2*angle)
k <- sqrt(1 - sqrt(1 - s^2*sin2a^2))
x <- k*radius*sign(cosa)/(sqrt(2)*s*abs(sina)) + x0
y <- k*radius*sign(sina)/(sqrt(2)*s*abs(cosa)) + y0
lines(x[-n], y[-n], ...)
}
plot(-5:5, -5:5, type = "n")
squircleFG(0, 0, 2, s = 0.75, col = "red")
squircleFG(1, 1, 2, s = 0.75, col = "blue", lty = "dashed")
是不是自己做的原因,看看自己的代码能不能精简?
如果不是这种情况,一种可能性是使用 grid
包中的函数 grid.roundrect
。
他们的帮助页面 ?grid::grid.roundrect
中采用的一个示例是简单地使用
grid.roundrect(width=.5, height=.5, name="rr", gp = gpar(fill = "red"))