月相のマスク方法【2】
(承前) そこで、Planet MateとCalend Mateでは以下のアルゴリズムを採用しました。
アルゴリズムの改良
Picture1の背景色を太陽高度に応じた色、Picture2とPicture3の背景色を黒色に設定します。そして、Picture3に月相を白色で描画します。
Picture1にPicture3をOR演算でコピーします。
Picture2にPicture3の白黒反転させた画像をOR演算でコピーします。これにより、Picture3の黒色の部分は白色、白色の部分はPicture2の月相のままとなります。
そして、Picture1にPicture2をAND演算でコピーします。この演算で、一方の白色の部分が他方の画像になります。
このアルゴリズムでは背景色を変化させても隠れた月相が浮かび上がることはありませんでした。
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)
| 固定リンク
「パソコン・インターネット」カテゴリの記事
- 平壌放送小史【3】(2024.04.01)
- 平壌放送小史【2】(2024.03.27)
- 月相のマスク方法【2】(2017.03.29)
- 月相のマスク方法【1】(2017.03.28)
- XREAでSSHを使う(2016.08.29)
「 天体・暦」カテゴリの記事
- 大きな中秋の名月(2024.09.18)
- 完全数の日(2024.06.30)
- 朝鮮語の数詞表現【実践篇】(2024.04.11)
- 朝鮮語の数詞表現【日時篇】(2024.04.08)
- 最遠最小の朧満月(2024.02.25)