season's quarterly

数学/物理/プログラミング

作図言語: PentagonScript

リポジトリ: https://github.com/season1618/PentagonScript

webサイト: https://season1618.github.io/PentagonScript/

動機

多分Glispっていうデザインツールを見て良いなあと思ったのがきっかけ(高校の時にこれを読んでいて、機能の直交性とかツールにおける言語相対論とかを知ってほえーとなっていた) 。

作図も似たようなものなので「言語で作図」をやってみたかった。

初等幾何学における作図を支援するツールを動的幾何学ソフトウェアというらしいです。

動的幾何学ソフトウェア - Wikipedia

作図をわざわざ言語によって記述するメリットは、良く使う操作をまとめて関数化したり、繰り返しが記述できる点だと思います。

構文

Go言語に似てる。型を後置して接頭辞で変数と関数を区別できるようにすると構文解析が楽になる。これはCコンパイラ作ったとき面倒だったので。

普通の図形は宣言的に記述すべきかもしれないが、作図の場合は文字通り手続き的に記述すべき。

交点は複数できるので分割代入をサポート。

変数名が図形に対応するようにしたいと思ったので変数は再代入不可としました。これについては拘らなくても良かったと思う。再代入不可を維持しつつfor文を使うには配列は使えません。正n角形を作図で最後に頂点を求めるとき、それらは帰納的に求まり、かつ評価順が決定しません。よってHaskelの遅延評価のように一度に配列の全要素を決定するのは難しいです。そこで配列を使う代わりに可変変数(変数名を変数で表現)を導入しました。for文も制御文ではなくマクロという形にして、スコープも維持されます。(これがまともな解決法かは自信がない)

描画

作図線を描画する関係で結構特殊なことをやっています。LineとCircleは何もなければそれぞれ線分と円を描くことになってるんですが、他の図形と交点を作るとそれに応じて交点を含むように線を伸ばしたり弧を拡縮します。

正多角形の作図

  • 1796年 Gauss 正17角形の作図
  • 1801年 Gauss 作図可能な正多角形の必要十分条件
  • 1832年 F・J・リシェロー, Schwendenwein 正257角形の作図
  • 1894年 Johann Gustav Hermes 正65537角形の作図(計算の要旨のみ)

正17角形の作図を試みた人類は何人かいるようです。

正257角形の作図を試みた人類は何人かいるようです。

正65537角形を作図した人は流石にいなそう。

六万五千五百三十七角形 - Wikipedia

ドイツのヨハン・グスタフ・ヘルメスは、10年の歳月をかけて正65537角形の作図法を調べ、1894年に計算の要旨のみの報告を雑誌に発表した。200ページを超える原稿は、ゲッティンゲン大学に保管されている。

本当は正257角形の作図をやりたかったんだけど、3000工程あるので断念した。

最後に

この辺りも実装したかったけど飽きた。

  • 点をドラッグする
  • 点のラベルの表示
  • 作図可能数の計算
  • 浮動小数点数