遅い→起動時

http://d.hatena.ne.jp/pmint/

ブラシの向きが変わるペイントツール09

d:id:pmint:20080309:p1の続き。


今度はブラシパターンが回転するようにした。
タブペンの動きにあわせてブラシの向きが変わるので、こういうむらのある線になる。

ペイントツール プロトタイプ09。
WindowsApplication1.zip

起動はここからClickOnceで。ClickOnceIE系で。
WindowsApplication1

操作

左ドラッグ(右でも可)
線を描く。

概要

線の向きにあわせてブラシパターン(i.png)を回転。というか、.NET Frameworkにあるライブラリに描画先領域を表す3座標を指示するだけ。
Graphics*1のDrawImageでは描画先を指示するだけで拡大・縮小・回転・変形・反転が同時にできるので、筆圧を線の太さに反映する処理と、線の向きをブラシパターンの回転角に反映する処理と、描画をDrawImageだけで行っている。この例では2度DrawImageを使ってるけど。

線の向き

直近の2座標から得たx増分とy増分を使って線の向きを求めている。
System.Math.Atan()でアークタンジェントを求めるだけ。

回転

描画先領域の左上、右上、それに左下の座標*2が必要。
筆圧を反映させて(ブラシパターンを拡大/縮小して)からブラシパターンの3頂点の座標*3を得て、それらを回転させている。


任意の座標(x, y)\thetaラジアン角)だけ回転させて、回転後の座標(x', y')を求める式はこちら。
(x_c, y_c)は回転の中心点。

x' = (x - x_c) \cos\theta - (y - y_c) \sin\theta + x_c
y' = (x - x_c) \sin\theta + (y - y_c) \cos\theta + y_c


で、回転後の座標群をCanvas(描画先)上の座標として扱って、描画。マウスポインターのある座標がブラシパターンの中央になるように調整して。


プロトタイプ09では拡大/縮小をBrush側で、回転をCanvas側(実はLayerだけど)で行っている。
それぞれでGraphics*4のDrawImageを使っているが、Brush側の処理は省略できそう。
BrushはDrawImageをせずに、その引数だけを生成できればいい。

*1:System.Drawing.Graphics

*2:正確には描画される画像の左上、右上、左下それぞれに対応する描画先の3座標。回転や反転もできるので、画像の左上が描画先の左上になるとは限らない。

*3:ブラシパターンの左上を(0, 0)としたときの座標

*4:System.Drawing.Graphics