/*
 *	clipht2.h
 *
 *	2D当り判定ルーチンを定義します。
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2006 Naoyuki Sawa
 *
 *	* Sun Oct 08 13:37:42 JST 2006 Naoyuki Sawa
 *	- 作成開始。
 *	* Tue Oct 17 03:32:53 JST 2006 Naoyuki Sawa
 *	- SRT構造体と、ht2_srt_pgn()を追加しました。
 *	- ht2_pt_pgn()とht2_pgn_pgn()において、多角形の頂点数が0ならば、当り判定無しと見なすよう変更しました。
 *	  これまでは、多角形の頂点数は1以上でなければならず、頂点数に0を指定すると正しく動作しない仕様でした。
 *	* Wed Nov 18 21:37:53 JST 2015 Naoyuki Sawa
 *	- 'extern "C" {'〜'}'で囲みました。.cppを含むWin32プロジェクトからもインクルード出来るようにするためです。
 */
#ifndef __CLIP_HT2_H__
#define __CLIP_HT2_H__

#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus

/*****************************************************************************
 *	
 *****************************************************************************/

/* 拡縮・回転・平行移動量を格納するための構造体です。
 * - ht2_srt_pgn()に対し、拡縮・回転・平行移動量を指示するために用意しましたが、
 *   それに限らず、拡縮・回転・平行移動量を格納する、一般用途に用いることもできます。
 * - ゲームキャラクタなどの構造体にて、拡縮・回転・平行移動量をSRT構造体に格納しておけば、
 *   そのままht2_srt_pgn()に引き渡すことができ、毎回SRT構造体を作成する必要が無く、効率的です。
 */
typedef struct _SRT {
	fixed x;	/* Translate X */
	fixed y;	/* Translate Y */
	fixed r;	/* Rotate */
	fixed s;	/* Scale */
} SRT;

/*****************************************************************************
 *	
 *****************************************************************************/

/* 線分ABと線分CDの交差判定を行います。
 * [in]
 *	(ax,ay)		線分ABの始点座標。
 *	(bx,by)		線分ABの終点座標。
 *	(cx,cy)		線分CDの始点座標。
 *	(dx,dy)		線分CDの終点座標。
 * [out]
 *	戻り値		交差していれば、0以外を返します。
 *			交差していなければ、0を返します。
 * [note]
 *	* 一方の線分の端点が、もう一方の線分のちょうど線上に有る場合も、交差と判断します。
 *	* 点Aと点Bが同じ座標であっても、正しく動作します。
 *	  点Cと点Dが同じ座標であっても、正しく動作します。
 *	  その場合、点と線、または、点と点の重なり判定となります。(アルゴリズムは同じです)
 */
int ht2_seg_seg(fixed ax, fixed ay, fixed bx, fixed by, fixed cx, fixed cy, fixed dx, fixed dy);

/* 点が多角形の内側にあるか判定を行います。
 * [in]
 *	(px,py)		点の座標。
 *	pgn[n][2]	多角形の頂点座標配列。
 *	n		多角形の頂点数。(n>=0)
 *			多角形の頂点数が0ならば、当り判定無しと見なします。(2006/10/17追加)
 * [out]
 *	戻り値		内側ならば、0以外を返します。
 *			外側ならば、0を返します。
 * [note]
 *	* 点が多角形のちょうど辺上、または、ちょうど頂点上に有る場合も、内側と判断します。
 *	* 多角形が、点(n=1)や線分(n=2)であっても、正しく動作します。
 */
int ht2_pt_pgn(fixed px, fixed py, const fixed pgn[/*n*/][2/*x,y*/], int n);

/* 多角形同士の交差判定を行います。
 * [in]
 *	a[n][2]		多角形Aの頂点座標配列。
 *	na		多角形Aの頂点数。(na>=0)
 *			多角形の頂点数が0ならば、当り判定無しと見なします。(2006/10/17追加)
 *	b[n][2]		多角形Bの頂点座標配列。
 *	nb		多角形Bの頂点数。(nb>=0)
 *			多角形の頂点数が0ならば、当り判定無しと見なします。(2006/10/17追加)
 * [out]
 *	戻り値		交差していれば、0以外を返します。
 *			交差していなければ、0を返します。
 * [note]
 *	* 多角形同士が、辺と辺、辺と頂点、頂点と頂点で接触している場合も、交差と判断します。
 *	* 多角形が、点(n=1)や線分(n=2)であっても、正しく動作します。
 */
int ht2_pgn_pgn(const fixed a[/*na*/][2/*x,y*/], int na, const fixed b[/*nb*/][2/*x,y*/], int nb);

/* 多角形を、拡縮・回転・平行移動します。
 * [in]
 *	srt		拡縮・回転・平行移動量。
 *	pgn_in		変形元の多角形。
 *	pgn_out		変形先の多角形を格納するバッファ。
 *	n		多角形の頂点数。(n>=0)
 * [note]
 *	* 当り判定用の多角形を、キャラクタの拡縮・回転・平行移動に合わせて変形するために用意しましたが、
 *	  当り判定用以外の一般的な用途で、多角形を拡縮・回転・平行移動するために利用することもできます。
 *	* pgn_in==pgn_outであっても正しく動作します。(エイリアスセーフ)
 *	  ただし実際には、pgn_inは定数領域の多角形定義を指し、pgn_outは変数領域のバッファを指すでしょうから、
 *	  pgn_in==pgn_outとなることは、まず、無いと思います。
 */
void ht2_srt_pgn(const SRT* srt, const fixed pgn_in[/*n*/][2/*x,y*/], fixed pgn_out[/*n*/][2/*x,y*/], int n);

#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus

#endif /*__CLIP_HT2_H__*/
