ホーム ] 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 / グラフィックス系

G0202 領域の認識

最終更新:2006/11/12 再掲

●解説

 領域とは閉じた図形のこと。認識とは指定の点がその図形の内か外かを判定すること。ユーザに、より正確かつグラフィカルに選択させる場合などに必須な処理となる。 


星形、文字列の内外を認識している例

●原理 

 Regionオブジェクトを利用する。Regionは通常パスから生成できる。パスはGraphicsで扱う図形や文字列が対象となっている。RegionのメソッドIsVisible(point())にて指定の点の内外判定ができる。

 領域が単純な矩形であれば、Region を使うまでもなく、Contains メソッドで判別できる。

   Dim Rec As RectangleF  (Rectangleでも可)

   If Rec.Contains(X, Y ) Then
   ・・・・・・・・

などとすれば点(X, Y) が、Recの内外かの判定ができる。

●方法 

  1. 図形、文字などのパスを生成
     

  2. そのパスをRegionに加える。一つのRegionに複数のパスを含められる。
     

  3. RegionのメソッドIsVisible(point())にて指定の点の内外判定を行う。

●実例 

Formモジュールで、

   
Dim pa2, pa3 As New GraphicsPath()
    Dim rgn As New Region
    Dim Star As PointF() = {New PointF(), New PointF() ・・・・・・・・}   '
適当なポリゴン
  ・・・・・・・・・・・・・・・・・・・・・・・
  pa2.Reset()
    pa2.StartFigure()
    pa2.AddPolygon(Star)
    pa2.CloseFigure()

    Dim fmt As New StringFormat()
    fmt.Alignment = StringAlignment.Center
    fmt.LineAlignment = StringAlignment.Center
    pa3.Reset()
    pa3.AddString(s1, New FontFamily("MS Pゴシック"), CInt(FontStyle.Bold), (文字サイズ), (開始位置), fmt)    
    pa3.CloseFigure()
    rgn.MakeEmpty()
    rgn.Union(pa2)                             'pa2を単純にrgnに加える
    rgn.Union(pa3)                             'pa3を単純にrgnに加える

    Dim g As Graphics = XXXXXXXXX
    Dim p As Pen = New Pen(Color.Red, 2)
    g.FillPath(Brushes.Blue, pa2)    '
このままだとユーザにRegionが見えないので、Regionを含ませたいオブジェクトに描画して置く
    g.FillPath(Brushes.Red, pa3)
    p.Dispose()

  ・・・・・・・・・・・・・・・・    これで準備完了 

オブジェクトXXXXXXXXXのマウスイベントにて、例えば、

Private Sub XXXXXXXXX_MouseMove(・・・・・・, e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove

     If rgn.IsVisible(e.X, e.Y) Then      'MousePositionはスクリーン座標なので使えない、eのアーギュメントを使う
         Me.Cursor = Cursors.Hand   '
マウスポインタは内側
         ・・・・・・・・・・
     Else
         Me.Cursor = Cursors.Default     '
マススポインタは外側
         ・・・・・・・・・・
     End If
End Sub 

などとする。