PICTURE原稿の書き方
9.図形の描き方 <平面図形の場合> (中級編 その2)
点マーカ  線分マーカ  角マーカ  フォント  塗りつぶし  矢線
垂線  円の接線  楕円の接線  円と直線の交点

  • 点にマーカをつける
    点に,黒丸,白丸,星形などの印(マーカ)をつけたいときには,\pointmarker コマンドを使います。
    \pointmarker{マーカの種類, マーカの大きさ, x1, y1, x2, y2, …}
    の形式で記述します。
    • マーカの種類は,1 〜 14 の整数値で指定します。次の通りです。
        1   2    3 ×    4    5    6    7
        8   9   10   11   12   13   14
    • マーカの大きさは,その直径です。単位つきの実長で指定します。
    • x1, y1, x2, y2, … は,そのマーカをつける点の座標です。何個でも指定することができます。
    (例) \pointmarker{2, 1.2mm, a1, a2, a3, a4} //2点(a1,a2),(a3,a4)に直径1.2mmをつけます。


     
  • 線分にマーカをつける
    2つの線分の長さが等しいときなどに,線分の中点の部分に印をつけることがあります。あのたぐいです。
    \linemarker{x1, y1, x2, y2, ずれ幅, 種類, 大きさ}
    の形式が基本形です。
    • (x1,y1), (x2,y2) は,線分の端点の座標です。
    • ずれ幅は,点(x1,y1)から点(x2,y2)を見て右側にどれだけずらした位置にマーカをつけるかを指定するものです。線分の中点にマーカをつけるなら,当然 0 とします。この機能は,\specialarc{d,…} で描いた円弧の中点にマーカをつけることを,主要目的としています。
    • 種類は,1 〜 5 の整数値,またはクオテーションマークではさんだ "…" の形式の文字列で指定します。
      整数値の場合は, 1   2   3 ×   4   5 です。
    • 大きさは,種類で整数値を指定した場合には,マーカの直径(単位つきの実長)です。文字列を指定した場合には,文字のフォントサイズ(ポイント単位)です。
    (例1) \linemarker{a1, a2, a3, a4, 0, 4, 2mm}
    //2点(a1,a2),(a3,a4)を端点とする線分の中点に直径2mmがつけられます。
    (例2) \linemarker{a1, a2, a3, a4, .4, "3cm", 10.5}
    //点(a1,a2)から点(a3,a4)を見て右に0.4だけずれた位置に,10.5ポイントの大きさで 3cm と表示されます。


     
  • (カク)にマーカをつける
    多角形の頂点とか,2直線が交わったところなどに,種々の角記号をつけたいことがあります。しかし,これを図形として描くのは意外に面倒なものです。そこで,そのための便利なコマンドが用意されています。\anglemarker コマンドです。これを使うと,さまざまな角記号を簡単につけることができます。コマンドの基本的な構造は次のようになります。
    \anglemarker{cx, cy, vx1, vy1, vx2, vy2, kind, r, (追加のパラメータ)}
    各パラメータは次のような意味を持っています。
    (cx,cy) : 角の頂点の座標です。
    (vx1,vy1), (vx2,vy2) : 角の開始と終了の方向ベクトルです。開始から終了へ左回りの角となります。
    kind : 角につけるさまざまな記号や文字の種類を指定します。
    r: 頂点から角記号までの距離(半径)です。
    追加のパラメータ : kind で何を指定したかによって,さらにパラメータが必要になることがあります。
    よく使われる例をいくつか紹介します。
    1. 一重線の弧 (kind を s とします)

      (例) \anglemarker{a1, a2, a3, a4, a5, a6, s, 0.4}
      //半径0.4の一重弧を描きます。
    2. 二重線の弧 (kind を d とします)

      (例) \anglemarker{a1, a2, a3, a4, a5, a6, d, 0.4, 0.1}
      //半径0.4の二重弧を描きます。最後のパラメータ 0.1 は,二重線の間隔です。
    3. 直角マーク (kind を r とします)

      (例) \anglemarker{a1, a2, a3, a4, a5, a6, r, 0.2}
      //一辺の長さ0.2の直角マーク(正方形)をつけます。
    4. 記号 (kind は 1 〜 16 の整数です)

      次の記号から選択できます。
      1    2   3 ×    4    5    6    7    8
      9   10   11   12   13   14   15   16
      (例) \anglemarker{a1, a2, a3, a4, a5, a6, 3, 0.4, 1.5mm}
      //頂点から角の二等分線の方向に0.4だけ隔たった位置に,大きさ1.5mmの×マークがつけられます。最後のパラメータはマークの大きさ(直径)です。
    5. 文字 (kind は クオテーションマークで囲まれた文字となります)

      (例) \anglemarker{a1, a2, a3, a4, a5, a6, "$\theta$", 0.4, 10}
      //頂点から角の二等分線の方向に0.4だけ隔たった位置に(その点が文字の中心になるように),θ と表示されます。最後のパラメータは文字のフォントサイズです。
      //文字位置を微調整する必要があるときには,さらに dx=ずれ幅, dy=ずれ幅 というパラメータを最後に追加します(指定されたずれ幅だけ文字位置がずれます)。
      (例) \anglemarker{a1, a2, a3, a4, a5, a6, "$\theta$", 0.4, 10, dx=.2mm, dy=-.5mm}
    6. 弧と記号(または文字)を組み合わせる (kind は 両方の併記となります)
      (例1)
      \anglemarker{a1, a2, a3, a4, a5, a6, s1, 0.4, 1.5mm}
      //kind を s1 とすることによって,一重線の弧と印とが組み合わされた角記号となります。最後の 1.5mm は,印の直径です。
      (例2)
      \anglemarker{a1, a2, a3, a4, a5, a6, s"$\alpha$", 0.3, 10, dx=2mm, dy=1mm}
      //kind を s"$\alpha$" とすることで,一重線の弧とαとが組み合わされた角記号が作れます。最後の dx=2mm, dy=1mm がないと,文字αの中心が弧の中点となり,文字と弧が重なってしまいますから,この場合には,dx, dy の指定は不可欠です。
     

  • フォントを変更
    \text コマンドで文字を表示するときのフォントは,\picture コマンドに入る直前に指定されていた本文中のフォントに一致します。\picture 中でフォント名,サイズ,色などを変更したいときには,2通りの方法があります。
    1. 個別の \text コマンドごとにフォントを指定する\text コマンドにおける「文字列」部は,一個のボックスとして処理されますから,その部分にフォント関係のコマンドを自由に挿入することができます。
      (例) \text{0, a1, a2, 7, \fontsie{*.8}AB\fontcolor{red}CD}
      //上のようにすると,本文の基本フォントサイズの0.8倍の大きさで AB を表示し,さらに,大きさは0.8倍のまま色を赤にして CD と表示されます。
      //また,このフォント変更は,\text コマンドの中でのみ有効となり,\text コマンドが終了すると,フォントは元に戻ります。
    2. 一括でフォントを変更する。1つの図の中に \text コマンドをたくさん用いることはよくあります。複数の \text コマンドに共通するフォント変更をしたいときには,\text コマンドの外側で (適用させたい \text コマンドよりも手前で) フォント変更のコマンドを使うことができます。
      (例)
      \picture
      {
        \basicset{……}
        ………
        //描画コマンド群
        \fontsize{*1.2}\fontcolor{blue}\fontstyle{i}
        \text{……}
        ………
        \text{……}
      }
      なお,\picture の中でのフォント変更はすべて,その \picture の中だけで有効です。\picture から出れば,元の本文中のフォントに戻ります。


     
  • 閉領域を塗りつぶすときのコツ
    • 単独の \circle とか \polygon コマンドで閉領域を塗りつぶすときには,そういうことはないのですが,ときによっては,閉領域を構成する境界線を一律同じ線種にはしたくないことがあります。ある部分は実線,ある部分は点線といった具合です。
    • そのような時,最も役に立つのは \makearea コマンドです。これなら,閉領域を構成するための不等式 (何個あってもよい) を記述するだけで,その領域を塗りつぶすことができ,しかも,境界線はこのコマンドによっては描かれませんから,あとで線種を変えながら境界線を個別に描くことができます。
    • 閉領域環境で閉領域を描くときには,その手前で \pen{9,0} と記述しておいて(幅ゼロの透明ペン),いったんは境界線のない塗りつぶし領域を描き,そのあとで,おもむろに境界線を描くというのがうまい方法です。
    境界を透明ペンで描いて塗りつぶすという手法は,同じ線を二度書きしないという意味でも,有効な手段になることがよくあります。塗りつぶしておいてから,その境界線の一部をまた別のコマンドで描きたくなることは,意外によくあるのです。(二度書きがいけないというわけではないのですが,同じ線を別コマンドで二度書きすると,条件の微妙な違いによって1ドット程度のずれが生じ,その部分だけ線が微妙に太くなってしまうことがあります。)


     
  • 矢線(または矢だけ)
    先に矢のついた線(または矢だけ)を描きたいこともあります。それを実現するコマンドが \arrow です。
    \arrow{mode, …} という構造で記述します。mode は,p または v のいずれかで,それによって矢線を指定する方法が違ってきます。
    1. mode を p とすると,始点と終点の座標を指定して矢線を引きます。
      (例) \arrow{p, a1, a2, a3, a4, 1}
      //始点(a1,a2)から終点(a3,a4)までの矢線を引きます。最後のパラメータ 1 は,矢の大きさです。PICTUREは1.6mm長の矢を標準の大きさとしており,それの何倍の大きさの矢を描くかをここで指定します。1 とすれば,1.6mm長の矢が,線分の先につきます。
    2. mode を v とすると,始点,方向ベクトル,線分の長さで矢線を指定することになります。
      (例1) \arrow{v, a1, a2, a3, a4, 1.2, 3.4}
      //始点(a1,a2)からベクトル(a3,a4)の方向に矢線を引きます。最後から2番目のパラメータ 1.2 は,上と同じく矢の大きさです。(1.6×1.2)mm長の矢が線分の先につきます。最後のパラメータ 3.4 は,線分の長さです。
      (例2) \arrow{v, a1, a2, a3, a4, 1.2, 0}
      //上のように,線分の長さを 0 にすると,点(a1,a2)が矢の先になって,ベクトル(a3,a4)の方向を向いた,矢の頭だけが描かれます。


     
  • ちょっと便利な機能
    PICTUREが標準で用意している描画機能から,小味のきいたものをいくつかご紹介します。
    1. 点から直線に垂線を引く
      垂線を引くことは,図を描くときにはしばしば必要になることですが,垂線の足を座標計算してから描くのは,結構面倒なものです。それをやってくれるのが,\vert コマンドです。
      \vert{mode, px, py, x1, y1, x2, y2}
      の形式で記述します。各パラメータの意味は次の通りです。
      mode : 0 垂線は引かない(垂線の足の座標だけを取得したいときに使います)。
            1 点から垂線の足までの線分を引く。
            2 無限に伸びた直線としての垂線を引く。
            3 垂線の足を端点とした半直線を引く。
      (px,py) : 直線外の点の座標。
      (x1,y1), (x2,y2) : 直線を定める2点の座標。この2点を通る直線に垂線を下ろします。
      (注) 上のどの引き方をした場合にも,垂線の足の座標がパブリック変数 (\pvalX,\pvalY) にセットされて返されます。ですから,たとえば
      \picture
      {
        ……
        \vert{2, a1, a2, a3, a4, a5, a6}
        \pointmarker{2, 1mm, \pvalX, \pvalY}
        ……
      }
      とすると,点(a1,a2)から,2点(a3,a4), (a5,a6)を通る直線に垂線を引いた後,垂線の足に印のマーカがつけられます。
    2. 円外の点から円に接線を引く
      \circletangent コマンドを使えば,円との接点の座標を求めることなく,接線を引くことができます。しかも,接点の座標は戻り値として取得できます。
      \circletangent{mode, x1, y1, r, x2, y2}
      の形式で記述します。
      mode : 上の\vertコマンドとほとんど同じです。詳細はPICTUREヘルプをご覧ください。
      (x1,y1), r : 円の中心と半径。
      (x2,y2) : 接線を引く円外の点。
      返される接点の座標は,円外の点から見て左側の方が(\pvalU,\pvalV),右側の方が(\pvalX,\pvalY)となります。
    3. 楕円外の点から楕円に接線を引く
      \circletangent とほぼ同じですが,コマンドの形式は次のようになります。
      \ellipsetangent{mode, x1, y1, rx, ry, rot, x2, y2}
      mode : \circletangentと同じ。
      (x1,y1) : 楕円の中心。
      rx, ry : 楕円のx半径と,y半径。
      rot : 楕円の回転角。
      (x2,y2) : 接線を引く楕円外の点。
      返される接点の座標は,楕円外の点から見て左側の方が(\pvalU,\pvalV),右側の方が(\pvalX,\pvalY)となります。
    4. 円と直線の交点を求める
      いちいち計算しなくても,交点の座標を与えてくれる関数があります。\circleline コマンドです。
      \circleline{x0, y0, r, x1, y1, x2, y2}
      の形式です。
      (x0,y0), r : 円の中心と半径。
      (x1,y1), (x2,y2) : 直線を定める2点の座標。
      戻り値としては,(\pvalU,\pvalV),(\pvalX,\pvalY)に交点の座標がセットされます。

入門講座の目次へ   PICTUREへ戻る