中澤さんがハートを描くプログラムを書いていた。
----- 引用開始
簡単なのでRでコーディングしてみた。
fg = function(x,y) sqrt(abs(x))+y*sqrt(5-x^2)
s = sqrt(5-1E-15)
curve(fg(x, 1), -s, s, ylim=c(-2,3), col=6)
curve(fg(x, -1), -s, s, col=6, add=TRUE)
で境界線のみの図ができるし,これに続けて,
vfg = Vectorize(fg)
x1 = seq(s, -s, length=100)
x2 = rev(x1)
plot(c(-3, 3), c(-3, 4), type="n")
polygon(c(x1, x2), c(vfg(x1, 1), vfg(x2, -1)), border=6, col=6)
とすれば,これら2つの関数で囲まれた領域を塗りつぶした図ができる。
----- 引用終了
0 を含むようにするなら,length=101 のように,奇数にする方がよい(curve の n のデフォルトは 101 になっている)。そうしないと,ハートのとんがりとへこみがシャープにならない。
Vectorize という関数は,知らなかった。しかし,今回のプログラムでは fg はベクトライズされている。
fg = function(x, y) sqrt(abs(x)) + y * sqrt(ifelse(5 < x^2, 0, 5 - x^2))
n = 101
x = seq(sqrt(5), -sqrt(5), length = n)
x = c(x, rev(x))
s = rep(c(-1, 1), each = n)
plot(0, 0, type = "n", xlim = c(-3, 3), ylim = c(-3, 4), asp = 1)
polygon(x, fg(x, s), border = 2, col = 2) # 概形だけ描くなら col = 2 を除く
※コメント投稿者のブログIDはブログ作成者のみに通知されます