無名関数を使って🐌かたつむりを描く

・　自分で関数（式）を作る
・　直交座標と極座標
・　陰関数が便利なときもある

# パスカルさん

「人間は考える葦である」で有名な　パスカルさん（Blaise Pascal）は、数学や科学一般、哲学で多くの業績を残しました。パスカルさんのお父さんもまたアマチュア科学者であり、熱心に取り組んでいたのが　パスカルのかたつむり　です　

17世紀のことですから、まだこんな便利な時代でなかったので、手で計算して紙に書いていたのでしょう　下のリンクの　Wikipediaのページに詳しい説明がありますので（特に英語のほう）よかったらどうぞ
<br>

<a href = "https://ja.wikipedia.org/wiki/%E3%83%91%E3%82%B9%E3%82%AB%E3%83%AB%E3%81%AE%E8%9D%B8%E7%89%9B%E5%BD%A2">パスカルの蝸牛形</a>

<a href = "https://en.wikipedia.org/wiki/Lima%C3%A7on">Limaçon of Pascal (English) </a>


# かたつむり


実際に書いてみましょう　まずはふつうに極座標を使って書いてみましょう　

<img width = 480 src ="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333980/35378893-3e42-7bb2-f792-bfd1306c00fe.png">

ちょっとインパクトがある形ですね。かたつむりの式は、直交座標系ですとこんな感じです

<img width = 320 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333980/7434558b-2a88-6e38-57d2-7f7475d32c31.png">

a の値や、b の値を変えると、小さい丸部分と、大きな丸部分の比率が変わり、形態自体がかわります　どの値がいいんだろ？　って、a や b を変えてしばらく試していました


```MATLAB:base
clear;

t = 0: .001: 2 * pi;
r = 2 * cos(t) + 1;

plot(r .* cos(t), r .* sin(t));
axis equal;
axis off;
```

MATLABで極座標を使って簡単に書くとこんな風になります　上の直交座標の式を、極座標を使って表したものです。原点を中心にくるくる回しながらプロットするので、中心の角度　θ　(theta)　を、　0　～　2 ×　π　までの 0.001（単位はラジアン）刻みの行列 t として作成します



# 無名関数を使って描く


さて、次に、同じものを少し違う形で描いてみましょうね　下は　a = 3 , b = 1　の場合の形です　真ん中が少し大きくなった！

<img width = 480 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333980/36b0bab2-2f6e-f19b-1407-b192d0576eb5.png">

コードのほうはちょっと趣を変えて、無名関数を使ってみました　

```MATLAB:anonymous
clear;

t = 0: .001: 2 * pi;
func = @(a, b, t) a * cos(t) + b;
r = func(3, 1, t);

plot(r .* cos(t), r .* sin(t), 'LineWidth', 2);
axis equal;
axis off;
```
<br>

# 増やしてみる

次に、θ　の部分に、掛け算や割り算を加えて、ちょっと複雑な形にしてみました

<img width = 480 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333980/0b4a227e-3e20-7069-b473-3e49ad095197.png">

```MATLAB:variation1
clear;

t = 0:.001:12 * pi;
func = @(a, b, t) a * cos(t) + b;
r = func(2, 1, t);

plot(r .* cos(t * 4), r .* sin(t *4), 'LineWidth', 2);
axis equal;
axis off;
```
<br>

# 重ねてみる

次のバリエーションは、ちょっとべたな感じではありますが、角度を 90 °　ずらしながら、重ねていきましょう

<img width = 480 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333980/37684f5f-87cc-a765-ff4b-d6a81eae1de5.png">

```MATLAB:variation2
clear;

t = 0:.001:2* pi;
func = @(a, b, t) a * cos(t) + b;
r = func(2, 1, t);

figure;
hold on;
plot(r .* cos(t + pi * (-.5)), r .* sin(t + pi * (-.5)), 'LineWidth', 2);
plot(r .* cos(t + pi), r .* sin(t + pi), 'LineWidth', 2);
plot(r .* cos(t + pi * .5), r .* sin(t + pi * .5), 'LineWidth', 2);
plot(r .* cos(t + 2 * pi), r .* sin(t + 2*pi), 'LineWidth', 2);
axis equal;
axis off;

```


パスカルのかたつむりは、子供のころから本で読んで知っていた形ですが、描いてみたのは今回がはじめてです　


かたつむりに似てないじゃん、という意見もあるかもしれませんが、まあまあいいの。a の値や、b の値を変えることで３個の形態を持つのが魅力的です。パスカルのお父さんは、たぶん仕事のあとの楽しみとして、コツコツと計算して、それを明らかにしようとしていたのでしょう


<br>
<br>
<br>

# 陰関数によるプロット

陰関数というのは、式の値が 0 になる関数です。　

    f = x + y
であれば、無名関数で書くと、こういうことを意味します

    f(x, y) = @(x, y) x + y
    f(x, y) = 0

   
陰関数 (implicit function) 　は、f(x, y) の値がゼロになることを前提とした表し方です　fimplicit　を使うと、陰関数として　f(x, y) を、直接　x と y の直交座標ベースでプロットしてくれます

<img width = 480 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333980/f58a634d-d48f-da2f-307b-4db2417f9e35.png">

かたつむりを、陰関数を使って 書くとこんな風になります　



```MATLAB:implicit

clear;

func = @(x, y) (x^2 + y^2 - 2 * x)^2 - (x^2 + y^2);
h = fimplicit(func, [-.5, 3.5, -2, 2]);
h.LineWidth = 2;
axis equal;
axis off;

```

陰関数を使うと、x, yの式だけが与えられたときに、θ に置き換えて極座標系にする手間がいらなくなります　　[-.5, 3.5, -2, 2]は、座標軸の範囲に関する数値で、X軸とY軸の範囲をそれぞれ最大値、最小値の順で示したもので、なくてもデフォルト設定があるので描けます

便利ですね

<br>

## 補足

MATLABは便利ですが、ヘルプの文書がわかりにくいことがあります。　一次元の行列のことを、ベクトルと呼びます。　また、上の例で、行列どうしの掛け算の場合　.* や ./ .＾を使っています。　たとえば、.* の場合ですと、行列の要素をそれぞれの端から順番に掛けてくれて、別の行列を作ってくれます。 スカラーというのは、ひとつの数値のこと（数字で表現した大きさ）を意味します
<br>

## お知らせ

この記事は、同じQiita内の<a href = "https://qiita.com/emikosh/private/d90cd032bac388adc2ad">立体の🐌かたつむりへ</a>続きます。よかったらお越しください。2023年12/17以降閲覧可能になります。