おっぱい関数

# はじめに
みなさん、おっぱいは好きですか？
人間はみんなおっぱいで育つので嫌いな人はいないですよね。
そんなおっぱいについて、2011年に[参考情報1][参考情報1]のような世紀の大発見があったようです。
おっぱいを関数で表現することに成功したのです。
人類は偉大です。

しかし、この原典の関数は構成要素がわかりにくい上にマジックナンバーが埋め込まれたものであり、理解するのが難しいものでした。

そこで、本記事では構成要素をわかりやすくした上にマジックナンバーを排除してパラメトライズしたおっぱい関数を提案し、解説します。

新しいプログラミング言語を学ぶ際にまず最初にするハローワールドに対して、新しい可視化ソフトを導入した際にまず最初にするハローオッパイに役立ててください。

本記事では可視化ソフトとして「Mathematica」を利用します。
Mathematicaは[参考情報2][参考情報2]に記載されている方法で利用することもできますし、「Wolfram Cloud」というクラウド環境で利用することもできます。本記事の内容は[参考情報3][参考情報3]から閲覧・コピー・ダウンロードしたり、ブラウザ上でパラメーターをいじって結果を確認したりすることができます。

それではみなさんレッツオッパイ！
( ﾟ∀ﾟ)o彡゜おっぱい！おっぱい！

# 目次
- [数学の知識](#数学の知識)
- [胸関数](#胸関数)
- [乳首関数](#乳首関数)
- [胴関数](#胴関数)
- [おっぱい関数](#おっぱい関数)
- [配色](#配色)
- [動的インタラクティブ](#動的インタラクティブ)

# 数学の知識
本題に入っていく前に数学のおさらいをしておきましょう。

### 円の方程式
以下の式は円の方程式で、中心は原点になります。

```math
x^2+y^2=1
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773736/8a2a5eab-d55d-ea44-4c6a-77a1c1768d56.png)

これをx軸方向に2だけ移動させた方程式は以下になります。

```math
(x-2)^2+y^2=1
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773736/951a4b1d-6c81-ebca-e791-def2650c5bee.png)

これと一緒に、y軸に対して鏡像反転させたものも同時に表現する方程式はxを|x|に置き換えた以下になります。

```math
(|x|-2)^2+y^2=1
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773736/2fed022f-5805-48be-8f33-ea9f4c84bd84.png)

### ガウス関数
以下の式は1次元のガウス関数で、中心はx=x0になります。

```math
f(x)=\exp(-p(x-x_0)^2)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773736/1b095a68-aa26-dffb-e310-0147d78ae4be.png)

以下の式は2次元のガウス関数で、中心はx=x0, y=y0になります。

```math
f(x,y)=\exp(-p((x-x_0)^2+(y-y_0)^2))
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773736/c68ff35b-2f24-a0b9-9c8d-68114ff5c234.png)

# 胸関数
上記でおさらいした数学の知識を活用して、胸関数を構築しましょう。
勘のいいみなさんならお気づきですね？
2次元のガウス関数と鏡像反転を含む円の方程式を組み合わせればよいのです。

```math
\text{mun}(x,y)=\exp(-w_m((|x|-d_m)^2 + y^2))
```

ここで$w_m$は胸の幅（拡がり）を決めるパラメーターで、$d_m$は左右の胸の間隔を決めるパラメーターになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773736/67f74cc3-773b-70c7-71af-07203762d4ee.png)

# 乳首関数
基本的な考え方は胸関数と同じです。
それに加えて「高さ」と「円柱っぽさの演出」が必要になります。

```math
\text{tik}(x,y)=h_t \exp(-w_t((|x|-d_t)^2 + y^2)^2)
```

ここで$h_t$は乳首の高さを決めるパラメーターで、$w_t$は乳首の幅（拡がり）を決めるパラメーターで、$d_t$は左右の乳首の間隔を決めるパラメーターになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773736/d364f5ab-3237-a106-f1a9-b87bae8d9427.png)

「円柱っぽさの演出」は円の方程式の部分が2乗されることで実現されています。
比較のため、2乗されない場合と4乗の場合をみてみましょう。

こちらは2乗されない場合になりますが、少し尖った印象がありますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773736/9508ea5f-819c-e0ca-2293-9596af7900fc.png)

こちらは4乗の場合になりますが、だいぶ円柱に近づいた印象がありますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773736/7a2d9874-5c43-8ac3-a291-8987cb745522.png)

これら「2乗された場合」「2乗されない場合」「4乗の場合」を一般化して指数部が2,1,4と設定できるようにパラメトライズしてもよいのですが、私の経験上（！？）、指数部は2で固定しています。

# 胴関数
胴を表現する関数を構築しましょう。
こちらは胸の中央から側面にかけての曲線のみの関数としています（xだけの関数）。
原典はこれに加えて胸からへそにかけて1次関数で高さを減少させていくような、鳩胸を表現するような式が入っているのですが、本記事では不要と判断して削除しています。

```math
\text{dou}(x,y)=-w_d x^4
```

ここで$w_d$は胴の幅（拡がり）を決めるパラメーターになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773736/a3f0a5c9-8bce-8650-6f2d-14b66ae50f4b.png)

指数部の4をパラメトライズしてもよいのですが、胴の前面と側面がいい感じに表現できるのが4なので、これで固定しています。

# おっぱい関数
「胸関数」「乳首関数」「胴関数」という構成要素が出来上がったので、いよいよおっぱい関数の構築です。
といっても話は単純で、構成要素をそれぞれ加算すればよいだけです。
1点だけ注意点があって、胸関数の間隔パラメーターと乳首関数の間隔パラメーターは同一のパラメーターとして制限しています。

```math
\text{opp}(x,y)=\text{mun}(x,y)+\text{tik}(x,y)+\text{dou}(x,y)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773736/51327a24-7e92-ba84-0b6a-7115fe281d40.png)

いい感じに出来上がりましたね！
おっぱい関数の構築としてはこれで完成になります。
次項ではおまけとして配色をいじってみます。

# 配色
胴の色と乳輪の色をそれぞれそれっぽく設定して、よりリアリティーを追求してみます。
こちらは[参考情報2][参考情報2]を参考にさせていただきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773736/87a75540-7d0a-b1d9-64fc-0e3f9203f755.png)

胴の色はLightPinkで、乳輪の色はPinkとLightPinkをブレンドした色に設定しています。
乳輪の箇所の設定は、円の方程式の中心から所定の半径以内である領域としています。

# 動的インタラクティブ
MathematicaにはManipulateというパラメーターをいじりながら結果を確認できる動的インタラクティブ機能が用意されています。これを利用しておっぱい関数をパラメーター変更可能な状態で可視化してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773736/a7363993-fbdd-4507-aa90-58c4476d33fc.png)

それぞれのパラメーターをいじっているGIFイメージは以下になります。

![opp.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773736/e352a75a-3736-12c1-535c-75aff4d858d4.gif)

[参考情報3][参考情報3]のウルフラムクラウドではブラウザ上でパラメーターをいじって結果を確認することができます。また、グラフ上でマウスドラッグすることにより視点をグリグリ動かすこともできます。

# おわりに
本記事では理解しやすいおっぱい関数の提案と解説を行いました。
このおっぱい関数がみなさんのハローオッパイやオッパイライフに役立ったら幸いです。

# 参考情報
1. [@shimoMathSiGMA 2011/11/06投稿](https://twitter.com/shimomathsigma/status/133126982220263425)
1. [hirax.net 2011/11/06投稿](http://hirax.net/diaryweb/2011/11/06.html)
1. [Wolfram Cloud opp.nb](https://www.wolframcloud.com/obj/43069cef-6676-4342-94f2-ee488c400e7e)

[参考情報1]: https://twitter.com/shimomathsigma/status/133126982220263425
[参考情報2]: http://hirax.net/diaryweb/2011/11/06.html
[参考情報3]: https://www.wolframcloud.com/obj/43069cef-6676-4342-94f2-ee488c400e7e