catalinaの備忘録

ソフトウェアやハードウェアの備忘録。後で逆引きできるように。

Rでコスプレ用スカートの可視化

結城先生の数学ガールを読み始めてみました。かたりぃなす。
もっとゆるい系の本かと思っていましたが、中身はすごく真面目かつ分かりやすく説明されていて、良書だと感じました。
20年近く前にフーリエの冒険を読んで以来のよい数学書です。
こういう本は非常に良い刺激になります。

そんなわけで、少しばかり数学的なことをやってみようと思いました。

コスプレ用のスカートの寸法の自動計算と可視化

コスプレ用のスカートの型紙についてですが、これが結構色々な局面で使います。
魔導士系のローブなども全円スカートを応用して広がりを少なくすることでそれっぽく作れたりもするので。
有名どころのサイトではこちらで簡単な計算ができます。
http://yousai.net/nui/seizu/furea/zenengomu.htm

全円スカートなら丈を設定して、出てきた寸法をそのまま使えば事足ります。
ただ、先にあげたように応用して作るときは型紙の書き直しが必要だったりするので、出来上がりがイメージしづらいです。
ロング丈のローブやスカートになると型紙作るだけでも大変なので実験するにも躊躇してしまいます。

よくよく考えると、衣装を作るときは毎回紙に書いて似たような計算しています。
ここはエンジニアらしく解決してみたいところです。
数学ガールも読んで気分も上がってきています。
そうだ、久しぶりにR言語を叩こう。
データの可視化だ。
というわけで作ってみました。

私の型紙づくりのやり方で特によく使う数学的なものとして、

  • 三角形の合同・相似
  • 円錐・円柱・球などの空間図形
  • 一次関数に関する基礎的なもの
  • 円の公式に関するもの
  • 垂直二等分線、平行線などを利用した作図

などです。
義務教育で習う内容がほとんどですね。

実際にどんな局面で利用するのかというと、すぐ思い浮かぶものとして

  • スカートの丈を調整するとき
    • 円錐として考える
      • 空間図形
      • 円の公式一般
      • 直角三角形の一般的なもの
  • 製図するとき
    • 垂直二等分線を使って正確な垂直線を書く
    • 大きな円弧を描くとき、三角形からの近似(歪まずに書ける程度まで三角形分割する)

などです。

今回作ったプログラムは次の3つのパラメータをもとにどんなスカートができるのか可視化します。

  1. スカート丈(パニエなどで広げている前提)
  2. ヒップサイズ
  3. 着用時のスカート裾部分の半径(広がり具合)

ヒップサイズ80cm, 丈100cmのロングスカートを可視化する実験です。
見栄えに一番大きく影響するパラメータはスカート半径なので、このパラメータを変動させてどうなるか見てみることにします。

スカート半径40cm

それほど広がらない魔導士向けローブなどで使えそうです。
女性向けなら丈を短くしてタイトスカートなどに使えるかもしれません。
f:id:Catalina1344:20160306154322p:plain

スカート半径70cm

ワイヤーパニエなどでスカートを広げたロリータ系の衣装やドレスでよく見かける形状です。
これはいわゆるAラインと呼ばれているものですが、個人的にはプリンセスラインのほうが好みです。
R言語なら数式回りの機能は豊富なので、工夫すればプリンセスラインの曲線くらい簡単に表現できる気がします。
しかし疲れたので今日はこれくらいにしておきます。
f:id:Catalina1344:20160306154331p:plain

読みづらいですがコードはこちら。
とりあえず書いてみたレベルなので間違いあるかもしれません。

# ヒップサイズ(cm単位)
west_size <- 80
# パニエ着用のうえ最大限に広がったスカートの半径(cm単位)
skirt_diameter <- 50
# スカートの丈(cm単位)
skirt_length <-	100

# ヒップサイズから円錐上部の円の半径を求める
top_R <- west_size / (2*pi)

# 三平方の定理を使ってスカートの高さを求める
# スカート丈=斜辺, X=スカート半径-ヒップサイズ, Y=hight
dx <- skirt_diameter - top_R
hight <- sqrt(skirt_length^2 - dx^2)	# 実際に生地を使用するY軸の寸法

# スカートの半径(xy平面)とスカートのY寸法から、中心からの距離に対するZの増分を求める
deltaZ <- hight / dx

# Zの増分をもとに、円錐の頂点を求める(x=0,y=0のときのZの値)
y_max <- deltaZ * skirt_diameter

# ヒップラインを求める
# 円錐の頂上はヒップラインでカットしてスカートらしく見せたいので
hip_line <- y_max - hight

# 以下はグラフを書くための処理
# 3Dグラフ用のX,Y軸のデータを準備
x <- seq(-skirt_diameter, skirt_diameter)
y <- x

# z値を求めて3Dグラフ化用のデータセットを準備
zh_func <- function(x,y){
	xy_2dvec <- sqrt(x^2 + y^2)	# XY平面における中心からの距離
	xy_2dvec * -deltaZ		# 中心から遠ざかるほどスカートは垂れ下がる
}
z <- outer(x,y,zh_func)

# 最小値,最大値を超える値の切り捨て(ヒップラインとスカートの裾)
threshold <- function(v){
	if(v > -hip_line)	return (-hip_line)
	if(v < -y_max)		return (-y_max)
	else			return (v)
}
z2 <- apply(z, c(1,2), threshold)


png("output.png")

# 三次元グラフ出力
v_theta <- 10
v_phi <- 40
persp(x,y,z2, 
	scale=FALSE,
	theta=v_theta, phi=v_phi,ticktype="detail", shade=0.5)

dev.off()

感想

せっかくのR言語なのに統計的なことは何もやっていないですね。
今回はただ可視化してみただけなので、三次元グラフのスケールが統一できていないのがちょっと残念です
グラフのスケールが毎回異なってしまうと、たとえばスカートの丈だけが異なるようなパラメータでグラフを生成したとき、見た目からは差が分かりにくいです(軸の値を読まなければいけない)。
まずは可視化できたのは一つの成果なので、良しとします。
色々と思うところはありますが、今は自分が楽しいと思えることに打ち込みたいですね。

今後の展望

これをそのまま型紙に起こせるようになれば色々と便利に使えそうな気がします。
今回のような全円スカートであれば、どこか一か所をカットしてそこから展開できるかもしれません。
プロットした座標間の距離を保ったまま平面上に落とし込んであげればそれっぽく展開できるだろうとは思うのですが…。
また気が向いたら試してみます。
あとコスプレ用衣装にありがちなフリルやギャザーを入れた場合も同じように可視化できると楽しそうです。