コンピュータ、ソフトウェアに関すること。忘れないようにね。

Asymptote 《関数編》

line bisector() -- 二等分線を作る -- import geometry

line bisector(point , point) :二つの点でできる線分の垂直二等分線を作る

point P=(4,0) , Q=(0,5);
dot("$P$",P,E);
dot("$Q$",Q,W);

line m = bisector(P,Q);
draw(m);

となれば,垂直の記号を図に書き込みたくなります。

line p = line(P,Q);
point M = intersectionpoint(p,m);
markrightangle(p.A , M , m.A , size=5mm);

draw(P--Q , dashed);

のように,markrightangle(point , point , point) 関数を使えば実現できます。生成された直線で直線上の点があらわでなくても,m.A のように指定することができます。
 ついでに,PM=QM を表す記号もつけたくなります。
 上記の draw 関数の引数を下記のように変えます。また,点M も表示します。

draw(P--Q,dashed, StickIntervalMarker(2,2));

dot("$M$",M ,2S+.5W);

 P--Q のように線分を表すのは無骨すぎると思うときには, segment(P,Q) のように表すこともできます。
 StickIntervalMarker(int , int) 関数の第1引数は,線分の分割数を指定しています。二等分するときには "2" を指定します。第2引数は,記号の線の本数を指定しています。"3" にすれば3本線の記号が表示されます。

line bisector(line , line) :二つの直線でできる角のうち,指定した2直線で時計回りにできる角の二等分線を作る

point P=(0,4), Q=(5,0);
line p = line(P,Q);
dot("$P$",P,E+.5N);dot("$Q$",Q,E+.5N);draw("$p$",p);
line l = line((0,0),(5,3));
draw(l);

point M = intersectionpoint(p,l);

line m = bisector(p,l);
draw("$m$",m);

dot("$M$",M ,2S);

 もう一方の角の二等分線は,line bisector(line , line , real) 関数の第3引数を "90" にして,90度回転させることで得ることができます。

line m = bisector(p,l,90);
draw("$m$",m);

dot("$M$",M ,2W);

 次に,角が等しい記号を書いてみましょう。

  • 直角を表す関数は,
    markrightangle(point , point , point)
    でした。
  • 弧を描いて等しい角を表す関数は,
    markangle(point , point , point , StickIntervalMarker(i=2,n=1))
    です。

 markangle 関数で,弧を描き,StickIntervalMarker 関数で,短い線分を描きます。
 StickIntervalMarker 関数の引数のうち,"i=2" は,指定された角を分割して描く線分の個数です。もう一つの引数 "n=1" は,短い線分の本数を指定します。

markangle(l.A , M , p.B , StickIntervalMarker(i=2,n=1));

 弧の半径が大きいようです。半径を半分に,また,描く弧を2重線にしてみましょう。

markangle(2 , radius=0.5*markangleradius() ,
          l.A , M , p.B , StickIntervalMarker(i=2,n=1));

 弧を描くためだけに,2直線 l と p の交点 M を求めていました。交点を使わず,2直線で角を指定できます。

markangle(2 , radius=0.5*markangleradius() ,
          l , p , StickIntervalMarker(i=2,n=1));

 直線 l の起点が逆のようです。そこで,

markangle(2 , radius=0.5*markangleradius() ,
          reverse(l) , p , StickIntervalMarker(i=2,n=1));


 うまくできました。


line perpendicular() -- 垂線を作る -- import geometry

line perpendicular(point , line) :point を通り,line に垂直な直線を作る

triangle triangle() -- 三角形を作る -- import geometry

triangle t = triangle(point , point , point) :三点を指定して三角形を作る


point P=(4,0) , Q=(0,1) , R=(3.5,3);
triangle t = triangle(P,Q,R);
show(t);

 のように,インスタンス t を作った場合でも,各点の名前は引数の順に点A,点B,点Cとなり,辺を参照する変数もそれぞれ t.BC , t.CA , t.AB となります。また,点に向かい合う辺に小文字の名前 "a","b","c" が与えられます。

triangle t = triangle(real , real , real) :三辺の長さを指定して三角形を作る


triangle t = triangle(3 , 4 , 5);
show(t);

circle circle();-- 円を作る -- import geometry

  • circle circle(point , real):中心 と 半径 で円を作る
  • circle circle(point , point):直径とする2点で円を作る
  • circle circle(point , point , point):3点を通る円を作る
  • circle incircle(point , point , point): 3点でできる三角形の内接円を作る

全て1度に作ってしまいます。

3点A,B,C,を指定し、点Aを中心とする円がC1、辺ACを直径とする円がC2、三角形の外接円がC3そして、三角形の内接円がC4です。


import geometry;
size(7cm,0);

point A=(4,3), B=(0,0), C=(5,0);

triangle t = triangle(A,B,C);
draw(t, red);
dot("$A$", A,S+.5W);
dot("$B$", B,W);
dot("$C$", C);

circle c1 = circle(A, 1);
draw(c1);
dot("$C_1$",c1.C,N);

circle c2 = circle(A, C);
draw(c2);
dot("$C_2$",c2.C,NE);

circle c3=circle(A,B,C);
draw(c3);
dot("$C_3$",c3.C,2W);

circle c4=incircle(A,B,C);
draw(c4);
dot("$C_4$",c4.C,N);

line tangent();-- 円の接線を作る -- import geometry

円cの中心 c.C と円の中心以外の点Pを結ぶ半直線と円cとの交点Tは、

point T = point(c, P);

で得ることができます。



import geometry;
unitsize(1cm);

circle c = circle((0,0), (3,0));
point P = (2,0);

point T = point(c, P);

draw(c);
dot("$c.C$", c.C, W);
dot("$P$", P);

dot("$T$", T);


2種類の接線を引きます。

円周上の1点に接する接線と、円の外側の1点から引く接線です。

  • line tangent(circle, point) :半直線c.CPと円との交点での接線を作る
  • line[] tangents(circle, point) :外部の点Pを通る接線を作る



import geometry;
unitsize(1cm);

circle c = circle((0,0), 2);
point P = (5,-3);

point T = point(c, P);
// 点Tを接点とする接線を求める。
line l = tangent(c, P);
draw("$l$", l);

// 外部の点Pを通る接線の、接点を求める。
point[] Tm = intersectionpoints(c, circle(c.C, P));

line[] m = tangents(c, P);

draw(m[0]);
dot("$T_1$", Tm[0], S);
draw(m[1]);
dot("$T_2$", Tm[1], NE);

draw(c);
dot("$c.C$", c.C, W);

dot("$T$", T, W);
dot("$P$", P, S+W);

座標軸

座標軸の表示の基本

 まずは座標軸だけを描いて見ましょう。以後は、縦10cm、横10cm の大きさに固定します。

unitsize(x=1cm);
import graph;  

real Xmin = -5, Xmax = 5;
real Ymin = -5, Ymax = 5;

xlimits( Xmin, Xmax);
ylimits( Ymin, Ymax);
xaxis();
yaxis();

labelx("$O$",0,SW);
dot((0,0));

 まず矢印とx、yの表示を加えてみましょう。

xaxis(Label("$x$",align=2E), Arrow(2mm));
yaxis(Label("$y$",align=2N), Arrow(2mm));

 次は、目盛りをつけます。

xaxis(Label("$x$",align=2E), Ticks(modify=NoZero, begin=false, end=true), Arrow(2mm));

 おや?矢印の表示のために5mmほど先端が延びて、目盛りがついてしまうようですね。
では、Xmax の値を少し減らしてみましょう。

xlimits( Xmin, Xmax - .1);

 ついでに、y軸のほうは目盛りだけで、数値なしにしてみます。

yaxis(Label("$y$",align=2N), Ticks("%", begin=false, end=true),Arrow(2mm));

 目盛りの線の長さを調節したいですね。
長いほうは、『Size=‥』
短いほうは、『size=‥』
で指定できます。

xaxis(Label("$x$",align=2E), Ticks(modify=NoZero, begin=false, end=true, Size=1mm, size=.7mm), Arrow(2mm));

 ここまでのソースを書いておきます。

unitsize(x=1cm);
import graph;  

real Xmin = -5, Xmax = 5;
real Ymin = -5, Ymax = 5;

xlimits( Xmin, Xmax - .1);
ylimits( Ymin, Ymax - .1);
xaxis(Label("$x$",align=2E), Ticks(modify=NoZero, begin=false, end=true, Size=1mm, size=.7mm), Arrow(2mm));
yaxis(Label("$y$",align=2N), Ticks("%", begin=false, end=true),Arrow(2mm));

labelx("$O$",0,SW);
dot((0,0));

関数のグラフ

関数の定義
real f(real x) {return x^2/5;}

のように定義できます。

 グラフを描画するには、
graph(f,Xmin,Xmax)
を、draw()の引き数に与えます。

draw(graph(f,Xmin,Xmax));

 ソース

unitsize(x=1cm);
import graph;  

/************************************************************
 *  座標軸の描画を関数定義しました。
 *         使用する前に定義しておく必要があります。
 ************************************************************/
void myAxis(real Xmin, real Xmax, real Ymin, real Ymax) {
  xlimits( Xmin, Xmax - .1);
  ylimits( Ymin, Ymax - .1);
  xaxis(Label("$x$",align=2E), Ticks(modify=NoZero, begin=false, end=true, Size=1mm, size=.7mm), Arrow(2mm));
  yaxis(Label("$y$",align=2N), Ticks(modify=NoZero, begin=false, end=true, Size=1mm, size=.7mm), Arrow(2mm));
  labelx("$O$",0,SW);
  dot((0,0));
}
/***********************************************************/

real Xmin = -5, Xmax = 5;
real Ymin = -5, Ymax = 5;


real f(real x) {return x^2/5;}
draw(graph(f,Xmin,Xmax),red);

myAxis(Xmin, Xmax, Ymin, Ymax);