ホーム ] TIPS ウィンドウズ系 ] TIPS グラフィックス系 ] TIPS メルチメディア系 ] TIPS 理数系 ] TIPS 総覧 ]

上へ
G0001 色名一覧
G0002 アルファブレンド
G0003 カラーマップを作る
G0101 曲線の数値化
G0102 曲線長を測る
G0103 曲線の接線・法線
G0104 曲線のスムージング
G0201 図形の回転
G0202 領域の認識
G0301 文字の線形変換
G0302 文字の自由変形
G0303 文字の極座標変換
G0304 曲線に沿った文字列
G0305 飾文字-中抜き
G0306 飾文字-縁取り
G0307 飾文字-ドロップダウンシャドウ
G0501 画像の線形変換
G0502 画像の透明化
G0503 画像の任意形状切出し
G0504 画像の回転
G0505 画像の高速処理化

VB.NET2005 TIPS / グラフィックス系

G0307 飾文字-ドロップダウンシャドウ

最終更新:2006/11/12 旧版統合

●解説

 垂直に立っているものの影が地面に差しているかのような効果(いわゆる、ドロップダウンシャドウ)を文字列で実現する。


後方から光が当たっているような事例

●原理

 陰になる部分は、文字列をマトリックスのShare メソッドで変形させて描画する。

●方法

 陰の方向と長さを決め、それに従って文字列をShareする。文字本体は通常に描く。

○文字のShare

 文字のShareは、横方向であれば、X軸を基準にYに比例してX座標値を変化させるものなので、方向や基準線を座標変換で制御しなければならない。

  図左はShareの原理を示す。図右の赤の平行四辺形が実際に出力したい傾斜結果であるとする。傾斜の前に、座標変換で、図右の青点を原点にするようなワールド変換を行う。また、この例では、実は傾斜係数は負になる。なぜなら、Yが増加するとXは減少するからである。

 新しい原点のデバイス座標(青点)が、Xp、Ypだとすれば、

gを対象のGraphicsとして、

 g.TranslateTransform(Xp, Yp)


とすれば良い。

傾斜係数を-2とすれば、

  Dim mx As New Matrix()
  mx.Shear(-2, 0)  

では、 X = X + (-2)×Y、Y = Y の演算が行われる。

○影の処理

 影は、Share とともにY軸スケールの調整も必要となる。下図のような影では影は反転文字となる。この場合は、Y軸スケールを負にする。

 上図において、Hは文字の高さ、nHは影の高さ(長さ)、nWをX方向の最大の変移とすれば、X軸のShare係数は、nW/H となる。Y軸のスケールは、nH/H となる。図の場合、nHは負とする。影の頭が、文字の下線よりも上であれば正となる。

●実例

Xc、Yc は描画領域の中心
po.X、po.Y は影の頭
fa は文字の高さ

fmt.Alignment = StringAlignment.Center
fmt.LineAlignment = StringAlignment.Near    '文字の基準を決める
Dim mx As New Matrix()
Dim fa As Single = f.GetHeight(g)
g.TranslateTransform(Xc, Yc + fa / 2)       '原点を移動
Dim gs As GraphicsState = g.Save()         'とりあえずこの状態を保存
Dim Ys As Single = (Yc + fa / 2) - po.Y
Dim Xs As Single = Xc - po.X
mx.Scale(1, Ys / fa)                                'Y軸スケーリング
mx.Shear(Xs / fa, 0)                               'X軸Share
g.MultiplyTransform(mx)                           'マトリックス適用
g.DrawString(ds, f, Brushes.DarkGray, 0, -fa, fmt)    '影を描画
g.Restore(gs)                                                    '原点移動状態に戻す
g.DrawString(ds, f, Brushes.Red, 0, -fa, fmt)    '文字本体を描画
mx.Dispose()