PICTURE原稿の書き方
7.図形の描き方 <平面図形の場合> (初級編)

PICTUREを使えば、様々な図形を、正確に、しかもプリンタの機能を最高度に生かた見栄えのよさで描くことができます。また、文書整形の上では図形は一つのボックスを構成しますから、文書中のどの位置にでも自由に図形を配置させることができます。
基本 座標軸 直線(線分) 折れ線 曲線 多角形 円・楕円 線種 塗りつぶし 閉領域 文字 方眼線

  • PICTUREが描くことのできる図形
    PICTUREが描く図形は、基本的には、2次元または3次元の座標平面(空間)上で数式を用いて表現できるものに限られます。ですから、たとえば動植物の解剖図などのように数式化の困難な図形は、PICTUREで直接描くことはできません。そのような図を文書中に挿入したいときには、図形を他の手段を用いて画像ファイル化する必要があります。画像ファイルをPICTUREで表示するのは簡単です。下の例のように、\image コマンドを用いればよいのです。
       (例) \image{\width{5cm}kaibozu.jpg}


  • 図形を描くための基本的なコマンド構造
    PICTUREで図形を描くときには、\picture コマンドを用います。最も基本的な \picture コマンドの構造は次の通りです。
    \picture
    {
    \basicset{…} (または \basexy{…}, \basexyz{…})
                  //これは必ず必要です。
    描画コマンド群  //描画の本体部です。
    …………     //指定された順番に描画されていきます。
    }

  • \basicset (または \basexy, \basexyz) コマンド
    図形のアウトライン(描く図形の大きさや,その中での座標原点の位置,座標単位の実長など)を設定するもので,一般の描画コマンドよりも手前に記述しなければなりません。書き方は次の通りです。
    \basicsetよりも\basexyの方が使い勝手がいいと思います。\basicsetは古いデータファイルとの互換性のために残している機能,というくらいに考えて下さい。)
    \basicset{width, height, orgx, orgy, unit}
      width, height : 横と縦の長さを実長で指定。
      orgx, orgy : 左下隅から見た座標原点の位置を実長で指定。
      unit : 座標単位1の実長。
    (例) \basicset{6cm, 4cm, 3cm, 2cm, 1.5cm}
    これだと,6cm×4cmの領域が画像領域となり,その左から3cm,下から2cmの位置(つまり画像領域の中央)が座標原点となります。そして,座標の単位長は1.5cmとなります。
    \basexy{x1, x2, y1, y2, unit}
      x1, x2 : 描画領域のx座標の範囲(単位はつけません)。
      y1, y2 : 描画領域のy座標の範囲(単位はつけません)。
      unit : 座標単位1の実長。
    (例) \basexy{-4, 5, -2, 6, 1.5cm}
    これだと,-4<x<5,-2<y<6の領域が画像領域となり,座標の単位長は1.5cmとなります。unitを変更すると,画像領域の実長も変化します。
    描かれる図形は,width と height で指定された長方形の形をした描画領域の中に自動的に限定(クリッピング)されます。描画コマンドが描画領域をはみ出した図形を指定したとしても,はみ出した部分には図形はいっさい描かれません。


    以下,通常よく使われる基本的な描画コマンドをいくつか紹介します。たいていの図はこの程度の基本コマンドで十分表現できるのではないかと思います。
    実際には,PICTUREの描画コマンドはこれら以外にも豊富に用意されています。その上,ユーザー定義の描画コマンドも自由に作成できますから,拡張は無限です。
    PICTUREヘルプに,現在標準に提供されている描画コマンドはすべて載せられています。ご参照ください。必要に応じて,ご自分用のコマンドを自由に定義して,お使いください。
    またその中で,皆さんにも使っていただける便利なコマンドができましたら,BOCHAN SYSTEM までお知らせください。標準マクロライブラリに登録して公開させていただきます。


  • 座標軸
    座標軸を描くには,\zahyojiku コマンドを用います。次のように記述します。
    \zahyojiku{mode, x1, x2, y1, y2}
       mode : 座標軸の描き方を指定します。"xy"とすれば,x軸とy軸を描き,"x"とすればx軸だけ,"y"とすればy軸だけを描きます。また,デフォルトでは座標軸には必ず矢印がつきます。矢印をつけない場合には,"xyn", "xn" のように,"n"を付記してください。
       x1,x2 : x座標の範囲を指定します。
       y1,y2 : y座標の範囲を指定します。
    (例) \zahyojiku{xy, -3, 3, -2, 2}, \zahyojiku{x, -3, 4}


  • 直線(線分)
    直線を引くための最も一般的なコマンドは,\line です。\line{mode, …} の形式をとります。mode 部を x,y,t,p 等,以下の各例のようにいろいろに指定することによって,様々な方法で直線を引くことができます。
    1. 直線の方程式を指定して直線を引く。
      • y=f(x)
        \line{x, f(x), x1, x2} の形式で記述します。x1, x2 は x の範囲です。
        (例)
        \line{x, 2*x+3, -3.2, 4.1}
            直線 y=2x+3-3.2<x<4.1 の範囲で引きます。
      • x=f(y)
        \line{y, f(y), y1, y2} の形式で記述します。y1, y2 は y の範囲です。
        (例) \line{y, -2*y+sqr(3), 1/2, 3.4}
            直線 1/2<y<3.4 の範囲で引きます。
      • x=f(t),y=g(t) 型(媒介変数型)
        \line{t,f(t),g(t),t1,t2} の形式で指定します。f(t),g(t)t の1次式でなければなりません。t1, t2t の動く範囲です。
        (例) \line{t, (t-2)/3, 2*(t+3)/5, -1, 3}
            直線 x=(t-2)/3, y=2(t+3)/5-1<t<3 の範囲で引きます。
    2. 2点の座標を指定して直線を引く。
      (例1) \line{p, 3, 1, -2, 5} → (3, 1) と (-2, 5) を結ぶ線分を引きます。
      (例2) \line{q, 3, 1, -2, 5} → (3, 1) と (-2, 5) を結ぶ直線を引きます。
      (例3) \line{r, 3, 1, -2, 5} → (3, 1) を始点として (-2, 5) に向かう半直線を引きます。
    3. 方向ベクトルを指定して直線を引く。
      (例1) \line{vq, 1, 2, -5, 6} → (1, 2) を通り,(-5, 6) を方向ベクトルとする直線
      (例2) \line{vr, 1, 2, -5, 6} → (1, 2) を始点とし,(-5, 6) を方向ベクトルとする半直線


  • 折れ線
    任意個の点を折れ線で結ぶときには,\polyline コマンドを用います。点の個数には基本的に上限はありません。
    (例) \polyline{1, 2, 3, 4, 5, 6, 7, 8} → (1, 2), (3, 4), (5, 6), (7, 8) の4点を結びます。


  • 曲線
    曲線を引くには,\curve コマンドを用います。\curve{mode, …} の形式です。
    modex または y または t とすることによって,それぞれ y=f(x) 型, x=f(y) 型, 媒介変数型の3通りの指定が可能となります。
    (例1) \curve{x, 2*x^2-3*x, -2, 3} → 曲線 y=2x2-3x-2<x<3 の範囲で描きます。
    (例2) \curve{y, 2*sin(y)-1, -pi, pi} → 曲線 x=2sin y-1 を -π<y<π の範囲で描きます。
    (例3) \curve{t, sin(t), cos(t/2), 0, 4*pi} → 媒介変数表示の曲線 x=sin t, y=cos t/2 を 0<t<4π の範囲で描きます。


  • 多角形
    1. 任意の多角形を描くには,\polygon コマンドを使います。頂点の個数には制限はありません。何角形でも描くことができます。
      (例) \polygon{0, 0, 1, 2, 3, -4, 2, -1} → (0, 0), (1, 2), (3, -4), (2, -1) の4点を頂点とする多角形を描きます。
    2. 正多角形を描く便利なコマンドとして,\regularpolygonA,\regularpolygonB,\regularpolygonC コマンドが用意されています。これらの詳細は,PICTUREヘルプをご参照ください。


  • 円,楕円
    円や楕円(またはその一部)を描くためのコマンドは非常に種類が豊富です。いくつか紹介します。

      • 中心と半径で指定 (円の基本形です)
        (例) \circle{1, -4, 3} → 中心(1,-4), 半径3の円を描く。
      • 三角形の外接円(3点を通る円)
        (例) \gaisetsuen{0, 1, 2, 3, 1, -1} → 3点(0, 1), (2, 3), (1, -1) を通る円を描きます。
      • 三角形の内接円
        (例) \naisetsuen{0, 1, 2, 3, 1, -1} → 3点(0, 1), (2, 3), (1, -1) でできる三角形の内接円を描きます。
    • 楕円
      (例) \ellipse{0, 1, 2, 1, pi/6}
      → 中心(0, 1),x半径2,y半径1 の楕円を,角π/6 だけ回転した楕円を描きます。
      回転のない楕円(主軸が座標軸に平行)を描く場合には,最後のパラメータは 0 とします。
    • 円弧
      • 中心,半径,2つの方向ベクトルで指定
        (例) \circlearc{1, 0, 3, 5, 1, -1, 2} → 中心(1, 0),半径3 の円のうち,ベクトル(5, 1) からベクトル(-1, 2) の方向に左回りに回ってできる円弧。
      • 2端点の座標とふくらみ幅で指定(これは非常に便利です)。
        (例) \specialarc{d, 1, 0, 3, 1.5, 0.6} → 点(1, 0) から点(3, 1.5) にいたる左回りの円弧で,中央部の最大のふくらみ幅が 0.6 の円弧。
      • 2端点の座標と円の半径で指定
        (例) \specialarc{r, 1, 0, 3, 1.5, 6} → 点(1, 0) から点(3, 1.5) にいたる左回りの円弧で,円の半径が 6 であるような円弧。
    • 扇形
      (例) \circlefan{1, 0, 3, 5, 1, -1, 2} → 中心(1, 0),半径3 の円において,ベクトル(5, 1) からベクトル(-1, 2) の方向に左回りに回ってできる扇形。
    • 弓形
      (例) \circlechord{1, 0, 3, 5, 1, -1, 2} → 中心(1, 0),半径3 の円において,ベクトル(5, 1) からベクトル(-1, 2) の方向に左回りに回ってできる弓形(弧と弦で囲まれる図形)。


  • 線の種類を指定
    図形を描くための線の種類を指定するには,\pen コマンドを使います。
    \pen{style} または \pen{style, width} または \pen{style, width, color} の形式で指定します。
    • style は,線の種類です(1桁の整数で指定します)。
      実線(0), 破線(1), 点線(2), ドット線(3), 1点鎖線(4), 2点鎖線(5), 透明(9) です。
    • width は,線幅です。単位のついた実長で指定します。
    • color は,線の色です。blue, green のような色名で指定するか,# または % で始まる16進RGBカラーで指定します。詳細は,PICTUREヘルプをご参照ください。
    (例) \pen{2}\pen{0, .4mm}\pen{4, .3mm, blue}
    パラメータのうち,指定しないものについては,現在の値が使われます。
    \pen コマンドを使わなければ,デフォルトの線種は,「実線,0.2mm,黒色」です。
    必要に応じて,途中で何度でも \pen コマンドで線種を変更することができます。


  • 閉領域の塗りつぶし
    多角形,円,楕円,扇形など,閉じた図形を描くコマンドにおいては,周囲の線を描くと同時に,その内部が現在の塗りつぶしパターンで塗りつぶされます。ただし,デフォルトの塗りつぶしパターンは「透明」です。つまり,\brush コマンドで塗りつぶしパターンを指定しない限り,塗りつぶしは事実上実行されません。
    \brush コマンドで指定できる塗りつぶしパターンは,驚くほど豊富です。大別すると,ベタプラシ(色を塗る),斜線ブラシ網掛けブラシグラデーションブラシ画像ブラシに分けられます。画像ブラシを使えば,任意の画像がブラシになります。描こうとする図形に応じていろいろ選択・工夫してください。
    なお,必要に応じて,途中で何度でもブラシを変更することができます。
    \brush コマンドの詳細は,PICTUREヘルプをご覧ください。
    また,デフォルトでは指定された閉領域の内側が塗りつぶされますが,\closemode{out} と記述しておくと,閉領域の外側を塗りつぶすモードになります。内側を塗りつぶしたければ,再び \closemode{in} と記述すればよいのです。

  • 閉領域を描く
    \polygon(多角形), \circle(円) などは,単独のコマンドで閉領域を描きますが,単独のコマンドでは描ききれない複雑な形の塗りつぶし領域を描きたいこともあります。そのような閉領域を描くためのコマンドがいくつか用意されています。
    1. \makearea コマンド
      閉領域を構成する任意個の不等式 (あるいは,\circle, \ellipse, \polygon コマンド) を単純に書き並べるだけで,それらの共通部分としての閉領域が作られ,その領域が現在のブラシで塗りつぶされます。最も自然かつ,最も簡単に閉領域を塗りつぶすコマンドです。(例1を参照してください)
      なお,\circle, \ellipse, \polygon の頭に \out と書いて,たとえば
      \out\circle{0, 0, 2}
      のようにすると,円の外側が指定されたものとみなされます。(例2を参照してください)
      ただし,このコマンドは指定された閉領域を塗りつぶすだけで,境界線は引きません。

      (例1)
      \picture
      {
        \basicset{10*a0, 10*a0, 5*a0, 5*a0, 1*a0}
        \constant{a0=1, a1=2.3}

        \brush{9, aqua, yellow, -2, 0, 2, 0} //グラデーションブラシを指定
        //境界線のない領域の塗りつぶしです。
        \makearea{
              y > x^2-1.7    
      //曲線の上側
            & x < -2*y^2+3  
      //曲線の左側
            & \circle{0, 0, sqr(a1)}  
      //円
            & \ellipse{0, .2, 2, 1, pi/6}  
      //楕円
            & \polygon{-1.5, -2, -.3, 3, 3, 1, 1, -1.5, .2, -.5}
      //多角形
          }
       
      //次に境界線を引きます。
        \brush{0}
        \curve{x, x^2-1.7, -5, 5}
        \curve{y, -2*y^2+3, -5, 5}
        \circle{0, 0, sqr(a1)}
        \ellipse{0, .2, 2, 1, pi/6}
        \polygon{-1.5, -2, -.3, 3, 3, 1, 1, -1.5, .2, -.5}
        \zahyojiku{xyn, -5, 5, -5, 5}
      }
      とすると,下図のように,5つの図形で囲まれた領域が塗りつぶされます。
              

      (例2) <\out を使った例>
      \picture
      {
        \basicset{a1*2, a1*2, a1, a1, 1}
        \constant{a1=2.5}

        \brush{2}  //斜線ブラシを指定
       
      //境界線のない領域を塗りつぶします。
        \makearea{
              y > 2*(x-0.9)^2-2
       //放物線の上側
            & y < x^3-x+1.2
           //3次曲線の下側
            &
      \out\ellipse{0, 0, 2, 1, pi/8} //楕円の外側
        }
       
      //次に境界線を引きます。
        \brush{0}
        \curve{x, 2*(x-0.9)^2-2, -a1, a1}
        \curve{x, x^3-x+1.2, -a1, a1}
        \ellipse{0, 0, 2, 1, pi/8}
       
      //最後に座標軸を灰色で描きます。
        \pen{0, 0, gray}
        \zahyojiku{xyn, -a1, a1, -a1, a1}
      }
      とすると,下図のように,「放物線と3次曲線にはさまれ,しかも楕円の外側」 の領域が塗りつぶされます。
            
              

    2. \closedcurve コマンド
      このコマンドを使うと,多くの曲線や直線をつないだ閉領域を描くことができます。
       
    3. 閉領域環境
      \beginclose\endclose コマンドの間に,任意の線描画コマンドを(いくつでも)記述します。すると,それらのコマンドで描かれる線がすべて一つながりとなって,閉領域が作られます。
    これらのコマンドの詳細は,PICTUREヘルプをご覧ください。

  • 文字を入れる
    図の中に文字を入れるには,\text コマンドを使います。
    基本的なコマンドの形式は,\text{mode, x, y, base, 文字列} です。
    • mode : 文字の表示方法を 0 か 1 のいずれかで指定します。0 を指定すると,文字の背景は透明となり,背後にあった図や文字の上に重ね書きされます。1を指定すると,文字の背景が現在のブラシの色(デフォルトだと白)で塗りつぶされて消されます。
    • x, y : 文字を入れる点の座標です。
    • base : 上で指定した座標と文字との位置関係を 1 〜 9 の整数で指定します。たとえば 5 を指定すると,文字の中央の座標が(x,y)となります。1を指定すると,文字の左上の座標が(x,y)となります。詳細は,PICTUREヘルプをご覧ください。
    • 文字列 : ここに記述した文字(文字列)が,1つのボックスとして処理されて,図の中に表示されます。狭い意味の文字だけでなく,ボックスを構成するいかなる表現も可能です(数式,表,画像,ミニページ,あるいは別の\pictureコマンドなど,何でもありです)。
    (例) \text{0, 2, -3, 3, $y=2x^2$} → 点(2, -3)を右上に見る位置に,y=2x2 という数式が表示されます。

  • グリッド(方眼線)
    方眼紙状の,一定間隔の縦横線を引きます。コマンドの基本形は \grid{mode, 線間隔} です。この基本形の場合には,グリッドの線は点線,色は灰色となります。
    • mode : d と指定すると,ディスプレイ上にのみ表示され,印刷するときにはグリッドは表れません。p と指定すると,印刷結果にもグリッドが表示されます。
    • 線間隔 : グリッドの線と線の間隔を指定します。
    線種や線の色を指定することもできます。そのときには,
    \grid{mode, 線間隔,style} または \grid{mode, 線間隔, style, color} とします。style, color\pen コマンドの場合と同じです。
    (例) \grid{p, .5}\grid{d, 1, 0}\grid{p, 1, 2, yellow}

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