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));



長方形ABCD

この長方形の頂点に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角形を描くことができます。

点を折線・曲線で結ぶ


4点を結ぶ折線

いくつかの点を折線で結ぶには次のように書きます。

settings.outformat = "pdf";
unitsize(2cm);
draw((0,0) -- (3,1) -- (2,3) -- (-1,1), linewidth(1pt));




4点を結ぶ閉折線

はじめに点に名前を付けておき、それを折線で結ぶこともできます。また最初の点と最後の点をつないで閉じた多角形の周に名前をつけてから描くには次のように書きます。

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));


4点を結ぶ閉曲線

これらの点を折線ではなく滑らかな曲線で結んでさらに各点を赤で描くには次のように書きます。

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);