作図言語: PentagonScript
リポジトリ: https://github.com/season1618/PentagonScript
webサイト: https://season1618.github.io/PentagonScript/

8月に作ってた作図言語(去年の続き + 破壊的変更)https://t.co/hh8aiz3Z4thttps://t.co/9aby68Ygeihttps://t.co/rOMwKvmlR9 pic.twitter.com/MgqnYk1ebR
— season (@season1618) 2022年9月18日
正5角形と正17角形の作図 pic.twitter.com/mY5FlETv5A
— season (@season1618) 2022年9月18日
動機
多分Glispっていうデザインツールを見て良いなあと思ったのがきっかけ(高校の時にこれを読んでいて、機能の直交性とかツールにおける言語相対論とかを知ってほえーとなっていた) 。
作図も似たようなものなので「言語で作図」をやってみたかった。
初等幾何学における作図を支援するツールを動的幾何学ソフトウェアというらしいです。
作図をわざわざ言語によって記述するメリットは、良く使う操作をまとめて関数化したり、繰り返しが記述できる点だと思います。
構文
Go言語に似てる。型を後置して接頭辞で変数と関数を区別できるようにすると構文解析が楽になる。これはCコンパイラ作ったとき面倒だったので。
普通の図形は宣言的に記述すべきかもしれないが、作図の場合は文字通り手続き的に記述すべき。
交点は複数できるので分割代入をサポート。
変数名が図形に対応するようにしたいと思ったので変数は再代入不可としました。これについては拘らなくても良かったと思う。再代入不可を維持しつつfor文を使うには配列は使えません。正n角形を作図で最後に頂点を求めるとき、それらは帰納的に求まり、かつ評価順が決定しません。よってHaskelの遅延評価のように一度に配列の全要素を決定するのは難しいです。そこで配列を使う代わりに可変変数(変数名を変数で表現)を導入しました。for文も制御文ではなくマクロという形にして、スコープも維持されます。(これがまともな解決法かは自信がない)
描画
作図線を描画する関係で結構特殊なことをやっています。LineとCircleは何もなければそれぞれ線分と円を描くことになってるんですが、他の図形と交点を作るとそれに応じて交点を含むように線を伸ばしたり弧を拡縮します。
正多角形の作図
- 1796年 Gauss 正17角形の作図
- 1801年 Gauss 作図可能な正多角形の必要十分条件
- 1832年 F・J・リシェロー, Schwendenwein 正257角形の作図
- 1894年 Johann Gustav Hermes 正65537角形の作図(計算の要旨のみ)
正17角形の作図を試みた人類は何人かいるようです。
17歳記念ということで
— ゆくりなし (@_abcdick) 2020年9月2日
正17角形の作図 pic.twitter.com/2lSzVK5CeF
新作切り絵できました。
— 紫雲/Shiun 数学切り絵作家 (@gym_tics) 2019年4月14日
「construction 17」
正17角形は作図可能であることが知られています。
実際の作図の過程をアレンジして切り絵にしてみました。 pic.twitter.com/4pYZPddZt1
正257角形の作図を試みた人類は何人かいるようです。
正257角形を作図したい人はこれに気をつけてください
— 【彳▼亍 ▼てきちょく】 (@TETH_Main) 2018年10月8日
▪単位円を正257角形にするとき
最大で75cm四方は余裕もった紙を用意したほうが良い
▪最後の方は何書いてあるかわからなくなるので逐一確認
▪歪んでも諦めないでください
作図出来ただけで財産です
▪針による怪我に気をつけてください pic.twitter.com/KUfJGArzZx
最終的に作図できてないんですけど
— 【彳▼亍 ▼てきちょく】 (@TETH_Main) 2018年10月8日
額縁にいれて部屋に飾ります
次正17角形書きます
所要時間:半日程度 pic.twitter.com/ZcXwfJ1stG
正65537角形を作図した人は流石にいなそう。
ドイツのヨハン・グスタフ・ヘルメスは、10年の歳月をかけて正65537角形の作図法を調べ、1894年に計算の要旨のみの報告を雑誌に発表した。200ページを超える原稿は、ゲッティンゲン大学に保管されている。
本当は正257角形の作図をやりたかったんだけど、3000工程あるので断念した。
最後に
この辺りも実装したかったけど飽きた。
- 点をドラッグする
- 点のラベルの表示
- 作図可能数の計算
- 浮動小数点数