衝突判定用の形状定義
衝突判定で利用する形状の定義について記載しています。
記載しているソースコードは簡易版というかあくまでイメージです、実際に利用しているコードはここにあります。
点
点はxy座標の2つから定義します。無職の場合は点はPointというようなクラスは作成せず、Vector2という2次元ベクトルクラスを作成し利用しています。
サンプルコード
class Vector2
{
/** x座標 */
x:number;
/** y座標 */
y:number;
}
直線
直線は無限に続く線で、直線上の1点と、直線の方向を表すベクトルの2つの情報で定義しています。
サンプルコード
class Line
{
/** 直線上の1点 */
p:Vector2;
/** 直線の方向を表すベクトル */
v:Vector2;
}
半直線
半直線は1点を端として、一方に無限に伸びている線です。
半直線は始点となる座標と、方向を表すベクトルの2つの情報で定義しています。 所有する情報は直線と同じなので、Lienクラスを継承してもいいと思います。
サンプルコード
class Ray
{
/** 始点 */
p:Vector2;
/** 半直線の方向を表すベクトル */
v:Vector2;
}
線分
線分は始点と終点があり、長さを持つ線です。
線分は始点と終点の情報で定義もできますが、衝突判定をする上では始点と線分の向きと長さを表すベクトルの2つの情報で定義したほうが良い気がします。
サンプルコード
class Segment
{
/** 始点 */
p:Vector2;
/** 線分の方向と長さを表すベクトル */
v:Vector2;
}
円
円は衝突判定において、非常に扱いやすく優秀な形状です。中心座標と半径の2つの情報で定義しています。
サンプルコード
class Circle
{
/** 中心 */
p:Vector2;
/** 半径 */
r:number;
}
楕円
楕円は中心座標とXとYそれぞれの半径、そして回転の3つの情報で定義します。
サンプルコード
class Ellipse
{
/** 中心 */
p:Vector2;
/** XとYの半径 */
r:Vector2;
/** 回転 */
angle: number;
}
矩形
矩形は回転しない四角形、左上の座標と幅と高さの3つの情報で定義します。
サンプルコード
class Rect
{
/** 左上の座標 */
p:Vector2;
/** 幅 */
w:number;
/** 高さ */
h: number;
}
矩形(回転あり)
回転する四角形は中心座標とXY半径、回転の3つの情報で定義します。
サンプルコード
class Box
{
/** 中心座標 */
p:Vector2;
/** XとYの半径 */
r:Vector2;
/** 回転 */
angle:number;
}
三角形
三角形は頂点3つの座標で定義します。
サンプルコード
class Triangle
{
/** 頂点1 */
p1:Vector2;
/** 頂点2 */
p2:Vector2;
/** 頂点3 */
p3:Vector2;
}
カプセル
カプセルは円が線分上を移動するものとして考えて、線分と円の半径の2つの情報で定義します。 半径がカプセルの太さに該当するパラメーターになります。
サンプルコード
class Triangle
{
/** 線分 */
s:Segment;
/** 半径(カプセルの太さ) */
r:number;
}