初音ミク関数 その2

MikuHatsune2013-05-07

初音ミク関数を使って遊んでいたのだが、ツインテールしか描けなかった原因は媒介変数の範囲のようだった。
[0,2\pi]をもっと広げるとそれっぽくなった。

いろいろいじっていると、[n\pi,(n+2)\pi]の範囲でヘビサイド関数符号関数が体の各パーツを作っているのではないかという指摘を受けたので、それぞれデータを取っておく方針でいく。
すると、loopを回しているうちに下のように対応していることがわかった。これに応じて色を指定してみる。
1:髪全体
2:右足の後ろの髪
3:ヘッドホン
4:左腕
5:左手の指
6:ネクタイ
7:襟
8:右足靴
9:左足靴
10:左足ニーソ
11:右足ニーソ
12:左肩
13:上着
14:右肩
15:右目
16:左目
17:左肩文字
18:スカート
19:右腕(右手?)
20:絶対領域
21:鼻
22:口
23:左ツインテール髪留め
24:右ツインテール髪留め
25:名札っぽいもの
26:首
27:左腕のグシャグシャ
28:左髪の模様
29:右髪の模様
30:前髪の模様
31:左の( ゚∀゚)o彡°オッパイ!オッパイ!
32:右の( ゚∀゚)o彡°オッパイ!オッパイ!
33:ネクタイピン

p0 <- seq(0, 132, by=4) # 媒介変数の範囲
Miku <- vector("list", length(p0)-1) # 範囲それぞれで格納しておく
for(p1 in 1:(length(p0) - 1)){
	t0 <- seq(p0[p1]*pi, p0[p1+1]*pi, length=3000)[-1]
	miku_plot <- cbind(miku_x(t0), miku_y(t0))
	Miku[[p1]] <- miku_plot
}
# プロットする範囲をあらかじめ計算しておく
xylims <- sapply(Miku, apply, 2, range, na.rm=TRUE)
xl <- range(xylims[1:2, ], finite=TRUE)
yl <- range(xylims[3:4, ], finite=TRUE)
cols <- c("green", "green", grey(0.7), grey(0.6), "#F0C9C0FF", "green", grey(0.7), grey(0.7), grey(0.8), grey(0.3), grey(0.3), "#F0C9C0FF", grey(0.6), "#F0C9C0FF", "green", "green", "red", "green", grey(0.8), "#F0C9C0FF", NA, NA, "red", "red", "yellow", "#F0C9C0FF", "green", NA, NA, NA, NA, NA)
plot(0, type="n", xlim=xl, ylim=yl, axes=FALSE, xlab="", ylab="")
for(i in replace(seq(Miku), c(6, 13), c(13, 6))){ # 低水準関数で描くと上書きされるので、ネクタイを描く順番を上着の後にする。
	points(Miku[[i]], pch=16, cex=0.5)
	polygon(Miku[[i]], col=cols[i])
}

polygonで色付範囲指定をするときになんか変なことになっているっぽいんだがまあこんなもんでしょう。
髪の色だけ変えてまたgif化するかなぁ…。