Asymptote 2次元グラフィックス
整数論とTeXに関するページ Last UpDate: 2021/11/08
線分とベクトル
2次元グラフィックスの最初の例として、線分を書いてみます。座標(-0.1,0)をもつ点と座標(2,0)をもつ点を結ぶ線分と座標(0,-0.1)をもつ点と座標(0,2)をもつ点を結ぶ線分を描くには次のように書きます。
settings.outformat = "pdf"; draw((-0.1,0) -- (2,0)); draw((0,-0.1) -- (0,2));
これを処理した結果は非常に小さな(0.035cmくらいの長さ)線分が描かれます。単位の長さを1cmにするという命令を追加して次のように変更します。
settings.outformat = "pdf"; unitsize(1cm); draw((-0.1,0) -- (2,0)); draw((0,-0.1) -- (0,2));
線の太さを変えることもできます。
settings.outformat = "pdf"; unitsize(1cm); draw((-0.1,0) -- (2,0),linewidth(2pt)); draw((0,-0.1) -- (0,2),linewidth(2pt));
線の先に矢印をつけてベクトルにすることもできます。
settings.outformat = "pdf"; unitsize(1cm); draw((-0.1,0) -- (2,0),linewidth(1pt),Arrow(8)); draw((0,-0.1) -- (0,2),linewidth(1pt),Arrow(8));
矢印の形を変えることもできます。
settings.outformat = "pdf"; unitsize(2cm); draw((-0.2,0) -- (2,0),linewidth(1pt),Arrow(6)); draw((0,-0.2) -- (0,1.6),linewidth(1pt),Arrow(6)); draw((0,0)--(2,0.5), linewidth(0.7pt),ArcArrow()); draw((0,0)--(2,0.8), linewidth(0.7pt),Arrow(SimpleHead)); draw((0,0)--(2,1), linewidth(0.7pt),ArcArrow(SimpleHead)); draw((0,0)--(2,1.5), linewidth(0.7pt),Arrow(HookHead)); draw((0,0)--(1.5,1.5), linewidth(0.7pt),ArcArrow(HookHead)); draw((0,0)--(1,1.5), linewidth(0.7pt),Arrow(TeXHead));
長方形と正多角形
長方形を描くには2点を指定します。座標(0,0)をもつ点と座標(3,2)をもつ点を左下の点,右上の点とする長方形を描くには次のように書きます。
settings.outformat = "pdf"; unitsize(1cm); draw(box((0,0),(3,2)), linewidth(2pt));
この長方形の頂点にA,B,C,Dというラベルを付けるには次のように書きます。
settings.outformat = "pdf"; unitsize(1cm); draw(box((0,0),(3,2)), linewidth(2pt)); label("A",(0,0),SW); label("B",(3,0),SE); label("C",(3,2),NE); label("D",(0,2),NW);
正3角形を描くには次にように書きます。
settings.outformat = "pdf"; unitsize(1cm); draw(polygon(3), linewidth(2pt));
正5角形を描くには次にように書きます。
settings.outformat = "pdf"; unitsize(1cm); draw(polygon(5), linewidth(2pt));
同様に正n角形を描くことができます。
点を折線・曲線で結ぶ
いくつかの点を折線で結ぶには次のように書きます。
settings.outformat = "pdf"; unitsize(2cm); draw((0,0) -- (3,1) -- (2,3) -- (-1,1), linewidth(1pt));
はじめに点に名前を付けておき、それを折線で結ぶこともできます。また最初の点と最後の点をつないで閉じた多角形の周に名前をつけてから描くには次のように書きます。
settings.outformat = "pdf"; unitsize(2cm); pair p1=(0,0), p2=(3,1), p3=(2,3), p4=(-1,1); path PL=p1 -- p2 -- p3 -- p4 -- cycle; draw(PL, linewidth(1pt));
これらの点を折線ではなく滑らかな曲線で結んでさらに各点を赤で描くには次のように書きます。
settings.outformat = "pdf"; unitsize(1cm); pair p1=(0,0), p2=(3,1), p3=(2,3), p4=(1,1); path C=p1 .. p2 .. p3 .. p4 .. cycle; draw(C, linewidth(0.7pt)); dot(p1,red); dot(p2,red); dot(p3,red); dot(p4,red);
円・楕円・円弧
与えられた中心の座標と半径をもつ円を描くには次のように書きます。
settings.outformat = "pdf"; unitsize(1cm); defaultpen(fontsize(10)); draw(circle((1,0),1),linewidth(1)); dot((1,0)); draw((-0.5,0)--(2.5,0), linewidth(0.7pt),Arrow(4)); draw((0,-1.5)--(0,1.5), linewidth(0.7pt),Arrow(4)); label("$x$",(2.5,0),S); label("$y$",(0,1.5),W); label("$A$",(1,0),S);
中心とx軸方向の半径、y軸方向の半径が与えられた楕円を描くには次のように書きます。
settings.outformat = "pdf"; unitsize(1cm); draw(ellipse((0,0),2,1),linewidth(1)); draw((-2.5,0)--(2.5,0), linewidth(0.7pt),Arrow(4)); draw((0,-1.5)--(0,1.5), linewidth(0.7pt),Arrow(4)); label("$x$",(2.5,0),S); label("$y$",(0,1.5),W);
中心と半径と開始角度,終了角度が与えられた円弧を描くには次のように書きます。
settings.outformat = "pdf"; unitsize(1cm); path ar1=arc((1,0),2,30,105); draw((1,0) -- ar1 -- cycle, linewidth(1pt));
円弧に矢印をつけてには次のように書きます。30と105の順序を変えれば逆向きに矢印がつきます。
settings.outformat = "pdf"; unitsize(1cm); pair p1=(1+2cos(pi/6),2sin(pi/6)), p2=(1+2cos(7pi/12),2sin(7pi/12)); path ar1=arc((1,0),2,30,105); draw(ar1,linewidth(1pt),Arrow(4)); draw((1,0) -- p1, linewidth(1pt)); draw((1,0) -- p2, linewidth(1pt));
関数のグラフ・曲線
関数のグラフを描くには次のように書きます。
settings.outformat = "pdf"; defaultpen(fontsize(10)); unitsize(1cm); import graph; real F1(real x) {return sin(x);} real F2(real x) {return cos(x);} path G1=graph(F1,-pi,pi); path G2=graph(F2,-pi,pi); draw(G1,linewidth(0.7)); draw(G2,linewidth(0.7)+red); draw((-3.5,0)--(3.5,0), Arrow(4)); draw((0,-1.5)--(0,2), Arrow(4)); label("$x$",(3.5,0),S); label("$y$",(0,2),W); label("$\pi$",(pi,0),S); label("$-\pi$",(-pi,0),N); label("$y=\sin x$",(3,0.6),N); label("$y=\cos x$",(-1,1/2),W);
パラメータ表示された曲線を描くには次のように書きます。ここでgraph命令の中のoperator ..は滑らかな曲線を描くというオプションです。
settings.outformat = "pdf"; unitsize(1cm); import graph;pair f1(real t) {return (sin(2t)*cos(t),sin(2t)*sin(t));} path c1=graph(f1,0,2pi,operator ..); draw(c1,linewidth(0.7));
方程式で定義された曲線を描くには次のように書きます。
settings.outformat = "pdf"; defaultpen(fontsize(10)); unitsize(1cm); import contour; real f1(real x, real y) {return y^2-x^3+x;} guide [] [] E1 = contour(f1,(-1.2,-2),(1.5,2),new real[] {0}); draw(E1[0],linewidth(1pt)); draw((-1.2,0)--(1.5,0), linewidth(0.7pt),Arrow(4)); draw((0,-1.5)--(0,1.5), linewidth(0.7pt),Arrow(4)); label("$x$",(1.5,0),S); label("$y$",(0,1.5),W); label("$y^2=x^3-x$",(0.8,1),N);
方程式で定義された曲線の例をもう一つ挙げてみます。
settings.outformat = "pdf"; defaultpen(fontsize(10)); unitsize(1cm); import contour; real f(real x, real y) { return (x^2+y^2)^2 +4 (y^2 - x^2); } guide[][] thegraphs = contour(f,a=(-2,-2), b=(2,2), new real[] {0}); draw(thegraphs[0]); draw((-2.4,0) -- (2.4,0), Arrow(4)); draw((0,-1) -- (0,1.5), Arrow(4)); label('$x$',(2.4,0),S); label('$y$',(0,1.5),W); label('$(x^2+y^2)^2=4(x^2-y^2)$',(0,-1),S);
領域を塗りつぶす
閉曲線で囲まれた領域を塗りつぶすには次のように書きます。
settings.outformat = "pdf"; unitsize(1cm); import graph; path c=ellipse((0,0),2,1); fill(c,gray(0.8)); draw(c,linewidth(1));
関数y=f(x)のグラフとx=a, x=bおよびx軸で囲まれた領域を塗りつぶすには次のように書きます。
settings.outformat = "pdf"; defaultpen(fontsize(10)); unitsize(1cm); import graph; real a=1, b=3; real f(real x) {return sqrt(x);} path g1=graph(f,0,4); path g2=(a,0) -- graph(f,a,b) -- (b,0) -- cycle; fill(g2, orange); draw(g1,linewidth(1)); draw((a,0)--(a,f(a))); draw((b,0)--(b,f(b))); draw((-0.4,0)--(4.1,0),Arrow(4)); draw((0,-0.2)--(0,2.4),Arrow(4)); label("$x$",(4,0),S); label("$y$",(0,2.4),W); label("$a$",(a,0),S); label("$b$",(b,0),S); label("$y=f(x)$",(4,2),NW);
斜線で塗りつぶすには次のように書きます。filldraw(c,pattern("hatch"))をfilldraw(c,pattern("hatchback"))や filldraw(c,pattern("crosshatch"))に変えることもできます.
settings.outformat = "pdf"; unitsize(1cm); import graph; import patterns; add("hatch",hatch(2mm)); add("hatchback",hatch(2mm,NW)); add("crosshatch",crosshatch(2mm)); path c=ellipse((0,0),1,1/2); filldraw(c,pattern("hatch")); draw(c,linewidth(1));
平面上の変換
図形を平行移動させるには次のように書きます。
settings.outformat = "pdf"; unitsize(0.5cm); path c=(0,0) .. (1,1) .. (2,2) .. (3,0) .. (-1,-1) .. cycle; draw(c, linewidth(1pt)); draw(shift(2,0.5)*c, linewidth(1pt)+red);
図形を拡大縮小させるには次のように書きます。
settings.outformat = "pdf"; unitsize(0.5cm); path c=(0,0) .. (1,1) .. (2,2) .. (3,0) .. (-1,-1) .. cycle; draw(c, linewidth(1pt)); draw(scale(0.8)*c, linewidth(1pt)+red);
図形を回転させるには次のように書きます。
settings.outformat = "pdf"; unitsize(1cm); path p = ellipse((0,0),1,1/2); draw(p, linewidth(1pt)); path q = shift(-1,0) * rotate(45) * p; draw(q, linewidth(1pt)+red);
図形を鏡映(線対称移動)させるには次のように書きます。
settings.outformat = "pdf"; unitsize(0.5cm); real th=pi/12; pair p1=(2*cos(pi/6),2+sin(pi/6)); import graph; real f1(real x) {return tan(th)*x;} path G=graph(f1,-2,3); draw(G,linewidth(0.7)); draw((-2,0)--(3,0), linewidth(0.7pt),Arrow(4)); draw((0,-4)--(0,4), linewidth(0.7pt),Arrow(4)); pair p2=reflect((0,0),(cos(th),sin(th)))*p1; path C=ellipse((0,2),2,1); draw(C); draw(reflect((0,0),(cos(th),sin(th)))*C,red); dot(p1); dot(p2,red); draw((0,0)--p1); draw((0,0)--p2); draw(p1--p2);