コンピュータ

Asymptoteの練習 No.0005 テオドロスの螺線

Spiral of Theodorus (テオドロスの螺線)


引き続き、繰り返し処理。テオドロスの螺線 (Spiral of Theodorus) を描いてみる。
三辺が$1$, $1$, $\sqrt2$の直角三角形から始めて、斜辺の上に高さ1の直角三角形を次から次へと作っていくことで、この図形は作られている。

伝説(?)によれば、テオドロスはルート2から始めて、自然数の平方根が整数になる場合を除いて無理数になることの証明をルート17まで行ったという。この螺線における直角三角形の斜辺がちょうど$\sqrt2$, $\sqrt3$, … , $\sqrt{17}$ となっていて、これ以上進めると三角形が重なってしまうので、ここで止めたのだろうという話を何処かで読んだ。

繰り返し以外のポイントとしては、線分$OP_{i}$を90度回転させて長さを1にしたものを線分$P_{i}P_{i+1}$とすることで、次の直角三角形を作るところ。AsymptoteはMetapostと同様に複素数としての演算が出来るが、それ以外にも、アフィン変換がサポートされている。今回は rotate という回転を行うオペレーターと、単位ベクトルを作る unit という関数を用いた。

/*
  Asymptoteの練習 No.0005
  繰り返し処理
  Spiral of Theodorus (テオドロスの螺線)
  t0005.asy
*/

size(6cm,0); // 出来上がりの図版のサイズを幅6センチに設定

int n=17;
pair pO=(0,0);
pair[] pA;

pA[1]=(1,0);

for (int i=1; i<=n-1; i+=1)
  {
    pA[i+1]=pA[i]+unit(rotate(90)*(pA[i]-pO));
  }

for (int i=2; i<=n; i+=1)
  {
    draw(pO--pA[i-1]--pA[i]--cycle);
    markrightangle(pO,pA[i-1],pA[i],1.5mm);
    dot(format("$\mathrm{P}_{%i}$",i), pA[i],dir(pO--pA[i]));
  }

dot("$\mathrm{P}_{1}$", pA[1], dir(pO--pA[1]));

Coregaの無線ルーターは要注意だな

家内のパソコンが突然ネットに繋がらなくなった。ワタシのMacからは普通に繋がっているので、てっきりまたWindowsの不調だろうと思っていたが、あれこれやってもダメ。ふと、以前の記憶がよみがえり、もしやと、無線ルーター (Corega CG-WLR300GNH) を初期化した。すると、とたんにネット復活。おや、今回はルーターに問題ありだったのか。

どうも、2ヶ月に1度くらいの割合で、こういうことが起こる。定期的に初期化が必要なのかな、このルーター君は。

ImageMagickのconvertでPDFをjpegに変換する

[ 備忘録 ] Asymptoteの出力をjpegにしようとしたが,何故か上手く出力されない。ということで,ImageMagickを用いてPDFからjpegを作るためのメモ。

convertを使う。density を200 x 200にして hoge.pdf から hoge.jpg を作るときは,ターミナルから,

convert -density 200x200 hoge.pdf hoge.jpg

とすればよい。

Asymptoteの練習 No.0004 正17角形を描く

正17角形

Asymptoteで繰り返し処理をしてみる。for 文の構文はC言語とほぼ同じ。繰り返しの変数は,その場で定義すればよい。ローカル変数ということなのだろう。簡単なところで正多角形を描いてみる。

/*
  Asymptoteの練習 No.0004
  繰り返し処理
  t0004.asy
*/

size(6cm,0); // 出来上がりの図版のサイズを幅6センチに設定

int N=17;
pair pO=(0,0);
pair[] pA;

for (int i=0; i<=N; i+=1)
  {
    pA[i]=(cos(2*i*pi/N),sin(2*i*pi/N));
  }

for (int i=0; i<=N-1; i+=1)
  {
    draw(pA[i]--pA[i+1]);
    draw(pO--pA[i]);
    dot(format("$\mathrm{P}_{%i}$",i), pA[i],dir(pO--pA[i]));
  }

以前 Metapost で同じようなことをしたことがあるが,頂点のラベル付けで添え字を自動で書き込むことが出来なかった。Asymptoteでは format 文が用意されているので,繰り返し処理の中で,変数 i を文字(数字)に書き下してからTeX側に送ることが簡単に出来るようだ。これは便利だ。

Asymptoteの練習 No.0003「外接する3円」

久しぶりに Asymptote によるお絵描きの練習。

Asymptoteの練習 No.0003

ホントはフォード・サークルを描きたかったのだが、まだ繰り返し処理などのプログラムを書けないので、2円と直線に外接する第3の円を描くことで満足することにした。円の中心は半径は事前に計算式を作って求めるようにする必要がある。しかし、計算自体はプログラムがやってくれるので、半径を変えたいときは、a, bを変えるだけで、あとのコードはそのままで構わない。

破線は dashed というペンを選べばよいのだが、標準のものは少し間延びしているように感じたので、少しだけ変更した。

geometryというモジュールをimportすれば、円と直線の交点、2円の交点をプログラムに求めさせることが出来る。これは、intersectionpoints という関数で成される。交点は2個あるため、結果は配列になる。

/*
  Asymptoteの練習 No.0003
  直線lに接し、互いに接する2円C1,C2に対して、この3つに接する円を描く。
  t0003.asy
*/

// usepackage("amsmath");
usepackage("MinionPro"); // 数式フォントをMinionProに設定

import fontsize; // font サイズ変更のため
import geometry; // 初等幾何用のモジュール

defaultpen(fontsize(11)); // フォントサイズを11ポイントに設定
defaultpen(linewidth(0.4pt)); // 線の太さを0.4ポイントに設定

dotfactor=6; // 黒丸のサイズは線の太さの6倍に設定
// pen dashed=linetype("6 6");
// pen dashed=linetype("3 3");
pen dashed=linetype("4 4"); // 破線の長さを少し変更する。

pen thick=linewidth(0.6pt); // 太線用のペンを定義する。


size(6cm,0); // 出来上がりの図版のサイズを幅6センチに設定
// unitsize(5mm);


/*
  最初に互いに外接する2円c1,c2の半径a,bを定める。3番目の円c3の半径cは
   1/sqrt(c)=1/sqrt(a)+1/sqrt(b)
  により計算される。
  3円の共通接線l上での接点P,Q,Rの座標をx1(=0), x2,x3とする。
  これらは、共通接線の長さ
   PQ=2sqrt(ab), PR=2sqrt(ac)
  により計算される。
 */
real a=3.7, b=5; // 互いに外接する2円の半径
real c=(a*b)/(sqrt(a)+sqrt(b))^2;

real x1, x2, x3; // 共通接線上での接点の位置
x1=0;
x2=2*sqrt(a*b);
x3=2*sqrt(a*c);

/*
  3円の中心A,B,Cの座標を設定する。
  点Aに対するpair(=point)としては、pAという記号を用いることにする。(pはpointの意味)
  次に、A,B,Cを中心とする半径a,b,cの円c1,c2,c3を作る。
 */
point pA=(x1,a), pB=(x2,b), pC=(x3,c);
circle c1=circle(pA,a), c2=circle(pB,b), c3=circle(pC,c);

/*
  接点P,Q,Rの座標と、共通接線の両端M,Nを設定する。
 */
point pP=(x1,0), pQ=(x2,0), pR=(x3,0), pM=(x1-a,0), pN=(x2+b,0);

/*
  2円の接点をいろんな形で求めてみる。
  segmentは線分を意味する。以下では、seg1は線分ABとなる。
  直線と円の交点は一般には2個になるので、intersectionpoints (複数形に注意) の
  値は配列になっている。最初に交点にアクセスするために [0] としている。
 */
segment seg1=segment(pA,pB);

point pT1=intersectionpoints(seg1,c1)[0];
point pT2=intersectionpoints(pA--pC,c1)[0];
point pT3=intersectionpoints(c2,c3)[0];

/*
  太めのペンで3つの円と共通接線を描く。
 */
draw(c1,thick);
draw(c2,thick);
draw(c3,thick);
draw(pM--pN,thick);

/*
  標準のペンで、中心を結ぶ線分などを波線で描く。
 */
draw(seg1,dashed);
draw(pA--pC,dashed);
draw(pB--pC,dashed);
draw(pA--pP,dashed);
draw(pB--pQ,dashed);
draw(pC--pR,dashed);

/*
  接点に直角マークを付ける。サイズは1.5mmと直接指定した。
  標準だと大きすぎた。標準を変更する方法があると良いのだが。
 */
markrightangle(pA,pP,pM,1.5mm);
markrightangle(pB,pQ,pM,1.5mm);
markrightangle(pC,pR,pM,1.5mm);

/*
  接点に位置にドット(黒丸)とラベルを描く。
  ドットのサイズは、linewidth*dotfactorになる。
  また、
    dot("P",pP,S,red+linewidth(0.8mm));
  のように、直接 linewidthや色を指定することも可能。
  ドットを白抜きにする方法を知りたい。
  ラベルに位置は、東西南北(EWSN)などで指定できる。
  東北(EN)や東北東(ENE)なども可能。
*/
dot("P",pP,S);
dot("Q",pQ,S);
dot("R",pR,S);
dot("$\mathrm{O}_1$",pA,N);
dot("$\mathrm{O}_2$",pB,N);
dot(pC);
dot(pT1);
dot(pT2);
dot(pT3);

label("$l$",pM,W);

addMargins(2mm,2mm);

Emacs.appでAsymptoteを使う

[ 備忘録 ] UNIXやGNU/LINUX上と違って、Mac OS X上で、しかも、独立アプリケーションになっている Carbon版Emacs.appでAsymptoteを使うためのメモ。

どの版のEmacsでもEmacs lispを読み込むことは同じ。Carbon版Emacs.appでは、アプリケーション本体(実は実行可能なディレクトリーなのだが)に様々なemacs lispを内包している。Emacs.appを右クリックして「内容を表示する」というのを選ぶと、ディレクトリーが開かれる。Emacs.app/Contents/Resources/ 以下にemacs lispがたくさん入っている。

Emacs.app/Contents/Resources/site-lisp/ 以下に asymptoteというディレクトリーを作り、そこに、/usr/local/share/asymptote/ (標準的なインストールの場合) 以下にある asy-mode.el と asy-keywords.el をコピーする。このフォルダーにはもう一つ asy-init.el というemacs lisp プログラムがあるのだが、それは、Emacs.app/Contents/Resources/site-lisp/site-start.d というディレクトリーにコピーする。これで、拡張子がasyのファイルを開くと、asymptoteのキーワードが色分けされて、見やすい。コンパイルもメニューから(メニューじゃなくても)実行できるのだが、何故かエラーが表示されてしまった。latexとdvipsの場所を明示的に指定しないとダメらしく、コンフィグレーションファイルである ~/.asy/config.asy に texpath=”latexが入っているフォルダーのパス”; と dvips=”こちらはdvips本体へのパス”; を書き込むように促される。パスは通っているし、TeXShopからは別段こんなことしないてもいいのになあと不思議ではあるが、ともかく指定した。これで、無事にコンパイル&プレビューできるようになった。

ということで、きちんと設定さえできれば Emacs はとても使いやすいのである。当然ではあるが。今のところ TeXShop では asymptoteのキーワード色分けが出来ないので、Emacsにしようかなあ。それにしてもTeXShopは便利さが中途半端だ。ファイルの拡張子に合せて、コンパイル・エンジンを自動で振り分けるくらいのことが出来ないんだからねえ。

Asymptoteの3D PDFをAdobe以外で表示する方法

Asymptoteの3DパッケージはPDFで出力するとAdobe Readerでは回転させたり,いろいろできる。これはPRCという3D拡張の為だが,Adobe以外でサポートしているものを知らない。Mac OS X標準のPreview.appでも表示できない。

結論から言うと,Asymptoteでコンパイルするときに,render=n (数値) というオプションを付けると良い。これで,1bp (big point = 1/72 inch) 当たり n ピクセルの解像度の画像が付く。それから,理由は不明だが,movie15.sty というLaTeXパッケージを入れとかないと3Dのコンパイル自体ができないので,ダウンロードしておく。LaTeXで使うってことはラベルの生成に使うのだと思う。

今のところ,render=10 (720dpi相当) であれこれコンパイルしているが,なかなかグッド。複雑な3Dだとコンパイルに少し時間が掛かる(MacBook Proで5秒ぐらい)が,まあ仕方ないか。

パスワード チェッカー

最近あちこちで話題になるパスワードの漏洩。気になったので,とりあえず iTunes Store のPasswordを変えてみたりした。しかし,次のサイトでチェックしてみると,強度はあまり強くない模様。

パスワード チェッカー

ううむ。やはり人間が覚えやすいものだからだろう。ということで,ランダムに見えて,個人的には覚えやすいというか入力しやすい方式を考えてみた。ここでは説明できないが 😉 。

Asymptote 3DのPDFはPreview.appで表示されない

Asymptoteで3次元の絵を描く練習中。サンプルを参考にあれこれ試みているのだが,PDFで出力させると,Mac OS Xのプレビュー.appでは表示不能であることが多い。生成されたPDFをEmacsで開いて中身を見ると,Javascriptに似たプログラムコードが埋め込まれている。PDFはPostScriptのサブセットだが,こういうプログラムも許されているのかと,ちょっと驚いた。これが為にプレビューでは表示できないのであろうか。ちなみに,出力をJPEGにすれば,次のような画像になるので,コンパイル自体は問題なく行われているのだ。

Asymptote 3D sample

プレビューがサポートしているような,もっと低レベルのPDFコマンドを生成してくれればなあと思うが,こういう時は,普段まったく使わない Adobe Reader の出番だ。さすが純正,きちんと表示される。Adobe Readerと言えば重たくて不評の代表格なのだが,きちんとフルセットのPDFをサポートしているからこそと思えば,多少の重たさは仕方がないのかも知れない。

しかし,こういう状況だと,Asymptoteを使ってPDFをTeXに埋め込むことに,若干の危険性を感じる。Adobe Readerを使えばよいのだが,そうでないと,画像の部分が真っ白になってしまうのだから。

AppleがタブレットPCを発表

アップルがタブレット型PCを発表した。iPadというらしい。ネーミングに笑ってしまう。iPodと紛らわしいねえ 😉 。ビデオを観る限りでは、良さそうな感じがする。日本での発売はどうなるのだろう。問題はコンテンツだよねえ。現時点で、ネットで本を配信するということを大手出版社がやるだろうか。

開発ツールも配布されるようなので、スキルさえあれば個人でiPad用のプログラムを開発することも可能。

学校で利用すると便利かもなあ。教科書や辞書、資料その他、もろもろをすべてiPadに入れておけば、これだけ鞄に詰めて学校に行けば良い。そういう日が来るのは何時だろうか。