« 月相のマスク方法【1】 | トップページ | 南武線開業90周年 »

月相のマスク方法【2】

(承前) そこで、Planet MateとCalend Mateでは以下のアルゴリズムを採用しました。

アルゴリズムの改良

Picture1の背景色を太陽高度に応じた色、Picture2とPicture3の背景色を黒色に設定します。そして、Picture3に月相を白色で描画します。

OK

Picture1にPicture3をOR演算でコピーします。

OK

Picture2にPicture3の白黒反転させた画像をOR演算でコピーします。これにより、Picture3の黒色の部分は白色、白色の部分はPicture2の月相のままとなります。

OK

そして、Picture1にPicture2をAND演算でコピーします。この演算で、一方の白色の部分が他方の画像になります。

OK

このアルゴリズムでは背景色を変化させても隠れた月相が浮かび上がることはありませんでした。

OK

BitBlt API

PictureBoxの画像間の論理演算コピーはWindowsのAPI関数であるBitBlt関数を用いました。PictureBoxコントロールが持っているPaintPictureメソッドでも同様にできますが、実行速度はBitBlt関数より遅くなってしまいます。

VB6でBitBlt関数を使用する際には標準モジュール等で関数の宣言をします。

Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long

それぞれの引数の意味は以下の通りです。

hDestDC
コピー先PictureBoxのhDC
x
コピー先長方形の左上隅のx座標
y
コピー先長方形の左上隅のy座標
nWidth
コピー先長方形の幅でコピー元ビットマップの幅
nHeight
コピー先長方形の高さでコピー元ビットマップの高さ
hSrcDC
コピー元PictureBoxのhDC
xSrc
コピー元長方形の左上隅のx座標
ySrc
コピー元長方形の左上隅のy座標
dwRop
ラスタオペレーションコード

代表的なラスタオペレーションコードを示します。

Const MERGEPAINT = &HBB0226  ' (DWORD) dest = (NOT source) OR dest
Const NOTSRCCOPY = &H330008  ' (DWORD) dest = (NOT source)
Const NOTSRCERASE = &H1100A6 ' (DWORD) dest = (NOT src) AND (NOT dest)
Const SRCAND = &H8800C6      ' (DWORD) dest = source AND dest
Const SRCCOPY = &HCC0020     ' (DWORD) dest = source
Const SRCERASE = &H440328    ' (DWORD) dest = source AND (NOT dest)
Const SRCINVERT = &H660046   ' (DWORD) dest = source XOR dest
Const SRCPAINT = &HEE0086    ' (DWORD) dest = source OR dest

前述のアルゴリズムでは、

  • OR演算: SRCPAINT
  • 白黒反転してOR演算: MERGEPAINT
  • AND演算: SRCAND

を使用しています。戻り値は成功したときは0以外、失敗したときは0が返ります。 (完)

※ この記事の画像をクリックしても別窓で拡大画像は表示しません...

【関連記事】
月相のマスク方法【1】 (2017.03.28)
月面Xと月面V (2017.01.07)
68年ぶりのスーパームーン (2016.11.16)
満月のクリスマス (2015.12.25)
十三夜の月 (2015.10.25)
スーパームーン2015 (2015.09.30)
スーパー中秋の名月 (2015.09.27)
後の十三夜 (2014.11.06)
白露と中秋の名月、そしてスーパームーン (2014.09.10)
今宵は満月、中秋の名月 (2013.09.20)
スーパームーン (2012.05.08)

|

« 月相のマスク方法【1】 | トップページ | 南武線開業90周年 »

パソコン・インターネット」カテゴリの記事

天体・暦」カテゴリの記事

トラックバック


この記事へのトラックバック一覧です: 月相のマスク方法【2】:

« 月相のマスク方法【1】 | トップページ | 南武線開業90周年 »