サイトトップ

Director Flash 書籍 業務内容 プロフィール

HTML5テクニカルノート

EaselJSで連続した座標の軌跡を描く

ID: FN1307003 Technique: HTML5 and JavaScript Library: EaselJS

EaselJSで連続した座標の軌跡を描きたいときがあります(図001)。たとえば、マウスドラッグにしたがって線を引くような場合です。本稿では、とくに滑らかな曲線で軌跡を描くやり方について考えます。

図001■連続した座標を軌跡として描く
図001


01 座標を直線で結ぶ

もっとも簡単なのが、座標を直線で結ぶことです。メソッドとしてはGraphics.lineTo()を用います。マウスポインタの動きにしたがって軌跡を描くといったときでも、フレームレートが高く、座標間の距離や変化が小さければ、滑らかな線に見えます。けれど、変化の大きいジグザグの軌跡では、座標の角が目立ちます(図002)。

図002■ジグザグの座標の軌跡は角が目立つ
図002


02 2次ベジエ曲線で軌跡を描く

Graphics.quadraticCurveTo()またはGraphics.curveTo()メソッドを用いると、2次ベジエ曲線が描描けます(両メソッドは同じ関数を参照しますので、以降はGraphics.quadraticCurveTo()で代表します)。2次ベジエ曲線を描くには、始点と終点(これらを合わせて「アンカーポイント」と呼ぶことにします)のほかに、コントロールポイントを与えなければなりません(FN1306002「EaselJSのGraphicクラスで2次ベジエ曲線を描く」図002参照)。

FN1306002図002■コントロールポイントと両端を結ぶ直線は曲線の接線になる(再掲)
図002
>>jsdo.itシミュレーションサンプル

すると、連続した座標をひとつおきでアンカーポイントとコントロールポイントに振分けることが思いつくでしょう。けれど、ジグザグの軌跡については、滑らかな曲線にはなりません(図003)[*1]

図003■2次ベジエ曲線でもジグザグの座標の軌跡には角が生じる
図003


03 座標はコントロールポイントとして中点をアンカーポイントに定める

そこで、ひとつ工夫をします。連続した座標は、すべてコントロールポイントにします。そして、座標の中点をアンカーポイントとして結ぶのです(図004)[*1]。こうすれば、軌跡は滑らかな曲線になります。

図004■座標はコントロールポイントとして中点をアンカーポイントに定めた
図004

気をつけなければならないのは、軌跡の曲線が座標の上を通過しないことです。けれど、座標の変化が小さければ軌跡はそれらの近くをとおり、変化が大きくても滑らかな曲線を描きます[*2]。jsdo.itにシミュレーションのサンプルコードを掲げました。Canvas上で続けてクリックした座標から軌跡を描きます。


[*1] 図示した座標の軌跡を描くシミュレーションはjsdo.itに掲げました。

[*2] 考え方は、データに近似した直線(または曲線)を求める回帰分析に似ているかもしれません(図005)。

図005■線形回帰のグラフ
図005
[引用] Wikipedia「線形回帰



作成者: 野中文雄
作成日: 2013年7月13日


Copyright © 2001-2013 Fumio Nonaka.  All rights reserved.