囲み判定ライブラリVer.2


はじめに

ライブラリが提供する機能

 囲み判定ライブラリ Ver.2 では,任意の点が,任意の複数の囲み線によって 囲まれているかどうかを判定するための関数群を提供します.


必要なファイル

 囲み判定ライブラリを利用するのには,次の二つのファイルが必要です.

囲み判定ライブラリ内の関数を使用するファイルでは,明示的に Include.h を インクルードしてください.


使用条件

 本ライブラリは,情報処理振興事業協会の創造的ソフトウェア育成事 「手書きインタフェースの高度化」の一環で開発されたバージョン(1.2) を元に開発されたライブラリです. このライブラリを利用してソフトウェア等を作成した場合は, 情報処理振興事業協会の一部支援の元に東京農工大学中川研究室において 加藤直樹により開発されたライブラリを使用している ことをなんらかの方法で明記願います. 明記できない場合は,使用料を払っていただく場合がありますので, 作成者である加藤直樹までお問合せください.

このライブラリの再配布や商業目的での販売を行う場合,および, このライブラリを組み込んだソフトウェアを商業目的で販売する場合は, 別途契約を必要としますので,管理者である加藤直樹までお問合せください.

 別途に権限の譲渡がない限り,本ライブラリを逆アセンブルなどのリバースエンジニアリングにかけることを禁止します. Microsoft Visual C++ 6.0 のライブラリ形式が利用できない開発環境で利用したいなど, ソースコードなど異なった形式のライブラリ提供が必要な場合は, 作成者である加藤直樹までお問合せください.

 なお,本ライブラリの使用により被った直接的または間接的ないかなる損害について, ライブラリ作成者は責任を負わないものといたしますので,ご了承ください.


ライブラリの利用方法

囲み線格納領域を準備する

 まず,囲み線を格納するための領域を確保します. そのためには関数 Include_Hello を呼び出します. 戻り値は IncludeType型 へのポインタです. 以後,このポインタ変数を利用することになります. 戻り値として NULL が戻った場合は,領域確保失敗を意味します. 関数 Include_Hello の使用は次のとおりです.

    IncludeType*    Include_Hello
    ( 
	    CoordinateType     maxy,             // 外部座標系の最大y座標 
	    CoordinateType     offset,           // 外部座標系の最小y座標
	    unsigned short int scale,            // 座標系の圧縮係数
	    unsigned short int maxbuffersize,    // 最大座標格納用バッファ数
	    unsigned short int maxstacksize      // 最大判定用スタックサイズ
    )

 座標圧縮係数は内部座標系における1単位に対応する外部座標系の単位数です. たとえば,scale = 10 とすると,外部座標系における10×10の領域が1単位領域となります. この値を大きくすれば大きくするほど必要な座標格納用バッファが少なくすみます.

 最大座標格納用バッファサイズは,座標点を格納するためのバッファのサイズです. このバッファが足りなくなると,後で説明する囲み線設定関数で失敗します.

 最大判定用スタックサイズは,判定時に使用するバッファのサイズです. このバッファが足りなくなると,後で説明する囲み判定関数で失敗します. ただし,囲み判定関数 Include_Check2 を利用する場合は, このバッファは必要ありませんので 0 として構いません.


囲み線の設定

 次に,囲み線を設定します.これには囲み線設定関数を使用します. 囲み線設定関数の仕様は次の通りです.
    int    Include_Set
    ( 
        IncludeType*       include,    // 作業用変数へのポインタ
        unsigned short int num,        // 座標点数
        POINT*             pts         // 座標点配列へのポインタ
    )
囲み線は,囲み線を構成する点を POINT型(windows.hで定義されている型)の配列に格納し, その配列へのポインタと点数を渡すことで設定できます. 設定が成功すると 0 が, 失敗すると 1 が戻り値として返されます.

 この関数を複数回呼び出すと,複数の囲み線による囲み判定が行えます. 前に設定した囲み線が無効になるわけではないことに注意してください.


囲み判定

 囲み線の設定が終わったら,囲み判定関数で点が囲み線に囲まれているかどうかを判定します. 囲み判定関数の仕様は次の通りです.
    int    Include_Check
    ( 
        IncludeType*, include  // 作業用変数へのポインタ
        POINT         pt       // 判定座標点
    )
    int    Include_Check2
    ( 
        IncludeType*, include  // 作業用変数へのポインタ
        POINT         pt       // 判定座標点
    )
囲み判定関数には2種類あります.Checkはスキャンエッジ法を用いた判定, Check2は位相判定法を用いた判定を行います. Check2では判定用のスタックを使用しません.

 判定する点は,POINT型の変数に格納して渡します. 囲まれている場合は 1 が, 囲まれていない場合は 0 が戻り値として返されます. なお,内部で失敗した場合にも,0 が返されます.


囲み線格納領域を開放する

 囲み判定が終了したら確保した領域を開放します. 開放用の関数の仕様は次のとおりです.

    void    Include_Bye
    (
        IncludeType* include    // 作業用変数へのポインタ
    )


Written by Naoki Kato:naoki@cc.tuat.ac.jp