<?xml version="1.0" encoding="utf-8"?><!DOCTYPE article  PUBLIC '-//OASIS//DTD DocBook XML V4.4//EN'  'http://www.docbook.org/xml/4.4/docbookx.dtd'><article><articleinfo><title>パス</title><revhistory><revision><revnumber>4</revnumber><date>2008-08-21 12:21:32</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>3</revnumber><date>2008-08-21 12:18:10</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>2</revnumber><date>2008-08-21 12:08:46</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>1</revnumber><date>2008-08-21 12:00:54</date><authorinitials>masahiko</authorinitials></revision></revhistory></articleinfo><section><title>パス</title><para>polygon や polyline 要素を使って多角形や折れ線を描くことができました。</para><para> path 要素を使うと曲線も同様にして描くことができます。 一部分が折れ線で一部分が曲線のようなものも可能です。</para><para> polygonのように最初の点と最後の点が結ばれた曲線を<emphasis role="strong">閉曲線</emphasis>、 polylineのように最初の点と最後の点が別々の曲線を<emphasis role="strong">開曲線</emphasis>と呼びます。 </para><para><emphasis role="strong">path 要素</emphasis> </para><itemizedlist><listitem override="none"><para>&lt;path d=&quot;パス形状の記述&quot; style=&quot; ... &quot; /&gt; </para></listitem></itemizedlist><para>パスの記述部分には、コマンド（命令）と座標を表す数を並べて書きます。 </para><para>例 </para><itemizedlist><listitem override="none"><screen><![CDATA[ <path d="M 40 60 L 10 60 L 40 50 Z" style="stroke:blue;" />]]></screen></listitem></itemizedlist><para>タートルグラフィックスの考え方を用います </para><itemizedlist><listitem override="none"><para>紙にペンで描く場合を思い浮かべてください。現在ペンがある位置を<emphasis role="strong">現在位置</emphasis>と呼ぶことにします。 線を描くにはペンを動かしますので現在位置は次々と変わっていきます。 逆に現在位置を指定することで、線を引く指示をしようという考え方です。 新しい位置を指定すると、もとの現在位置との間に線を引き、現在位置を新しい位置に変える、という処理を繰り返すことで線を引いていきます。 </para></listitem></itemizedlist><!--rule (<hr>) is not applicable to DocBook--><para> <emphasis role="strong">M コマンド (move to)</emphasis> </para><itemizedlist><listitem override="none"><para>M ｘ座標 y座標 </para></listitem></itemizedlist><para>現在位置を (x, y) に移動します。 </para><para>パスデータは必ずMコマンドで始まります。 パスデータの途中にMコマンドがあると、いくつかの部分に分かれたパスができます。複合パスに対応します。 </para><para><emphasis role="strong">L コマンド (line to)</emphasis> </para><itemizedlist><listitem override="none"><para>L ｘ座標 y座標 </para></listitem></itemizedlist><para>もとの現在位置と (x,y) の間を直線で結び、現在位置を (x, y) に移動します。 </para><para><emphasis role="strong">Z コマンド (close)</emphasis> </para><itemizedlist><listitem override="none"><para>Z </para></listitem></itemizedlist><para>現在位置と最初の点を直線で結びます。 </para><para>パスデータの最後にZを記述すると閉曲線(polygon)になり、Zの記述が無いときは開曲線(polyline)になります。 </para><para>例 </para><itemizedlist><listitem override="none"><screen><![CDATA[ <path d="M 40 60 L 10 60 L 40 50 Z" style="stroke:blue;" />]]></screen></listitem><listitem override="none"><para>M 40 60 で (40,60) に現在位置（ペン）を移動します。 </para></listitem><listitem override="none"><para>L 10 60 もとの現在位置である (40,60) と (10,60) の間を直線で結び、現在位置を (10,60) に変更します。 </para></listitem><listitem override="none"><para>L 40 50 同様に (10,60) と (40,50) の間を直線で結び、現在位置を (40,50) に変更します。 </para></listitem><listitem override="none"><para>Z 現在位置 (40,50) と最初の位置 (40,60) を直線で結びます。 </para></listitem></itemizedlist><para>したがって、つぎのpolygon要素と同じ結果が得られます。 </para><itemizedlist><listitem override="none"><screen><![CDATA[ <polygon points="40 60 10 60 40 50" style="stroke:blue;" />]]></screen></listitem></itemizedlist><para>ここまでなら polygon のほうが楽かもしれませんが、pathを使うともっと複雑な図形を描くことができます。 </para><!--rule (<hr>) is not applicable to DocBook--><section><title>絶対座標と相対座標</title><itemizedlist><listitem override="none"><para>命令文字に大文字を使うと絶対座標、小文字を使うと相対座標になります。 </para></listitem></itemizedlist><para>lineto命令として小文字の l を使い </para><itemizedlist><listitem override="none"><screen><![CDATA[ <path d="M 10 20 l 40 10 l 30 -40" />]]></screen></listitem></itemizedlist><para>と書くと、座標(10,20)からｘ方向へ20、ｙ方向へ10進んだ座標すなわち(50,30)への直線と、 座標(50,30)からｘ方向へ30、ｙ方向へ -40進んだ座標すなわち(80,70)への直線からなる折れ線が描かれます。 </para><!--rule (<hr>) is not applicable to DocBook--><para> <emphasis role="strong">省略記法</emphasis> </para><itemizedlist><listitem override="none"><para>同じ命令を繰り返すときは命令文字を省略してもよい。 </para></listitem><listitem override="none"><para>空白の代わりにカンマを用いてもよい。 </para></listitem><listitem override="none"><para>空白を省略しても分るところは、省略してもよい。 </para></listitem></itemizedlist><para>水平線、垂直線を引くための命令も用意されています。 </para><itemizedlist><listitem override="none"><para>H x 水平線を引く </para></listitem><listitem override="none"><para>V y 垂直線を引く </para></listitem></itemizedlist><para><emphasis role="strong">曲線</emphasis> </para><itemizedlist><listitem override="none"><para>曲線を描く命令は３種類あります。 </para></listitem><listitem override="none"><para>３次ベジェ曲線命令 C x1 y1 x2 y2 x y </para></listitem><listitem override="none"><para>２次ベジェ曲線命令 Q x1 y1 x y </para></listitem><listitem override="none"><para>楕円弧曲線命令 A rx ry rot flag1 flag2 x y </para></listitem></itemizedlist><!--rule (<hr>) is not applicable to DocBook--></section><section><title>３次ベジェ曲線命令</title><para>CGでは三次ベジェ曲線がよく使われます。ツールを使って描かれる曲線のほとんどはこれです。 </para><para>４点 P<subscript>0</subscript>, P<subscript>1</subscript>, P<subscript>2</subscript>, P<subscript>3</subscript> が与えられたとき、曲線上の点 P は t をパラメータとして </para><itemizedlist><listitem override="none"><para>P = P<subscript>0</subscript> * (1-t)<superscript>3</superscript> + 3 * P<subscript>1</subscript> * t * (1-t)<superscript>2</superscript> + 3 * P<subscript>2</subscript> * t<superscript>2</superscript> * (1-t) + P<subscript>3</subscript> * t<superscript>3</superscript> </para></listitem></itemizedlist><para>と書けます（０≦ｔ≦１）。 </para><para>この曲線はつぎのような形になります。 </para><itemizedlist><listitem override="none"><para>t=0のときP=P<subscript>0</subscript>、t=1のときP=P<subscript>3</subscript>であり、この２点が曲線の端の点です。 </para></listitem><listitem override="none"><para>P<subscript>1</subscript>,P<subscript>2</subscript>の２点は制御点といい、曲線上に無いことが多い。 </para></listitem><listitem override="none"><para>P<subscript>0</subscript>とP<subscript>1</subscript>を結ぶ直線はP<subscript>0</subscript>において、この曲線の接線になっている。 </para></listitem><listitem override="none"><para>P<subscript>2</subscript>とP<subscript>3</subscript>を結ぶ直線はP<subscript>3</subscript>において、この曲線の接線になっている。 </para></listitem></itemizedlist><para>C命令では、現在位置がP<subscript>0</subscript>に、(x1,y1)がP<subscript>1</subscript>に、(x2,y2)がP<subscript>2</subscript>に、(x,y)がP<subscript>3</subscript>に対応します。 </para><itemizedlist><listitem override="none"><screen><![CDATA[ <path d="M 10 50 C 20 25 40 25 50 60" />]]></screen></listitem></itemizedlist><para>の場合、P<subscript>0</subscript>=(10,50), P<subscript>1</subscript>=(20,25), P<subscript>2</subscript>=(40,25), P<subscript>3</subscript>=(50,60)に対応し P<subscript>1</subscript>,P<subscript>2</subscript>を制御点とするP<subscript>0</subscript>からP<subscript>3</subscript>への曲線になります。 </para><!--rule (<hr>) is not applicable to DocBook--></section><section><title>２次ベジェ曲線命令</title><para>３点 P<subscript>0</subscript>, P<subscript>1</subscript>, P<subscript>2</subscript> が与えられたとき、曲線上の点 P は t をパラメータとして </para><itemizedlist><listitem override="none"><para>P = P<subscript>0</subscript> * (1-t)<superscript>2</superscript> + 2 * P<subscript>1</subscript> * t * (1-t) + P<subscript>2</subscript> * t<superscript>2</superscript> </para></listitem></itemizedlist><para>と書けます（０≦ｔ≦１）。 </para><itemizedlist><listitem override="none"><para>t=0のときP=P<subscript>0</subscript>、t=1のときP=P<subscript>2</subscript>であり、この２点が曲線の端の点です。 </para></listitem><listitem override="none"><para>P<subscript>0</subscript>とP<subscript>1</subscript>を結ぶ直線はP<subscript>0</subscript>において、この曲線の接線になっている。 </para></listitem><listitem override="none"><para>P<subscript>1</subscript>とP<subscript>2</subscript>を結ぶ直線はP<subscript>2</subscript>において、この曲線の接線になっている。 </para></listitem></itemizedlist><para>Q命令では、現在位置がP<subscript>0</subscript>に、(x1,y1)がP<subscript>1</subscript>に、(x,y)がP<subscript>2</subscript>に対応します。 </para><itemizedlist><listitem override="none"><screen><![CDATA[ <path d="M 10 50 Q 20 25 50 60" />]]></screen></listitem></itemizedlist><para>の場合、P<subscript>0</subscript>=(10,50), P<subscript>1</subscript>=(20,25), P<subscript>2</subscript>=(50,60)に対応し P<subscript>1</subscript>を制御点とするP<subscript>0</subscript>からP<subscript>2</subscript>への曲線になります。 </para><!--rule (<hr>) is not applicable to DocBook--></section><section><title>２次ペジェ曲線のデータを書く</title><para>曲線の端点p<subscript>0</subscript>とp<subscript>2</subscript>の座標は考えられますね。 次にそれら２点からのばした接線の交点をp<subscript>1</subscript>とすればよいのです。 曲線の曲がり具合は、p<subscript>0</subscript>,p<subscript>1</subscript>の中点とp<subscript>1</subscript>,p<subscript>2</subscript>の中点を結ぶ線に接する程度と考えるとよいでしょう。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E3%83%91%E3%82%B9?action=AttachFile&amp;do=get&amp;target=bezie2.jpg"/></imageobject><textobject><phrase>bezie2.jpg</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><!--rule (<hr>) is not applicable to DocBook--></section><section><title>補足</title><para>曲線命令も直線命令と同様に続けて書いたり、直線と曲線をつなげて描いたりすることもできます。 絶対座標、相対座標についても同じです。 また、 </para><itemizedlist><listitem override="none"><para>３次ベジェ曲線命令の省略形 S x2 y2 x y </para></listitem><listitem override="none"><para>２次ベジェ曲線命令の省略形 T x y </para></listitem></itemizedlist><para>もあります。 </para></section></section></article>