using System;
using System.Collections.Generic;
using System.Text;
using CommonAI.RTS;
using CommonLang.Vector;
using CommonLang;
namespace CommonAI.Zone.Instance
{
public static class Collider
{
///
/// 单位和【圆形】碰撞
///
///
///
///
///
///
public delegate bool ObjectBodyTouchRound(InstanceZoneObject o, float x, float y, float r);
///
/// 单位和【扇形】碰撞
///
///
///
///
///
///
///
///
public delegate bool ObjectBodyTouchFan(InstanceZoneObject o, float x, float y, float r, float sa, float ea);
///
/// 单位和【直线】碰撞(粗线段)
///
///
///
///
///
///
///
///
public delegate bool ObjectBodyTouchRectLine(InstanceZoneObject o, float x1, float y1, float x2, float y2, float line_r);
///
/// 单位【运动轨迹】从A点移动到B点经过的碰撞(圆角粗线段)
///
///
///
///
///
///
/// 粗度
///
public delegate bool ObjectBodyTouchRoundLine(InstanceZoneObject o, float sx, float sy, float dx, float dy, float line_r);
///
/// 单位和【矩形】碰撞
///
///
///
///
///
///
///
public delegate bool ObjectBodyTouchRect(InstanceZoneObject o, float x1, float y1, float x2, float y2);
//---------------------------------------------------------------------------------------------
public static bool Object_Pos_IncludeInRound(InstanceZoneObject o, float x, float y, float r)
{
return CMath.includeRoundPoint(x, y, r, o.X, o.Y);
}
public static bool Object_BlockBody_TouchRound(InstanceZoneObject o, float x, float y, float r)
{
return CMath.intersectRound(x, y, r, o.X, o.Y, o.BodyBlockSize);
}
public static bool Object_HitBody_TouchRound(InstanceZoneObject o, float x, float y, float r)
{
return CMath.intersectRound(x, y, r, o.X, o.Y, o.BodyHitSize);
}
public static bool Object_Pos_IncludeInFan(InstanceZoneObject o, float x, float y, float distance, float startAngle, float endAngle)
{
return CMath.includeFanPoint(x, y, distance, o.X, o.Y, startAngle, endAngle);
}
public static bool Object_BlockBody_TouchFan(InstanceZoneObject o, float x, float y, float distance, float startAngle, float endAngle)
{
return CMath.intersectFanRound(x, y, distance, o.X, o.Y, o.BodyBlockSize, startAngle, endAngle);
}
public static bool Object_HitBody_TouchFan(InstanceZoneObject o, float x, float y, float distance, float startAngle, float endAngle)
{
return CMath.intersectFanRound(x, y, distance, o.X, o.Y, o.BodyHitSize, startAngle, endAngle);
}
public static bool Object_Pos_IncludeInRect(InstanceZoneObject o, float x1, float y1, float x2, float y2)
{
return CMath.includeRectPoint(x1, y1, x2, y2, o.X, o.Y);
}
public static bool Object_BlockBody_TouchRect(InstanceZoneObject o, float x1, float y1, float x2, float y2)
{
float b = o.BodyBlockSize;
return (CMath.intersectRect(o.X - b, o.Y - b, b * 2, b * 2, x1, y1, x2, y2));
}
public static bool Object_HitBody_TouchRect(InstanceZoneObject o, float x1, float y1, float x2, float y2)
{
float b = o.BodyHitSize;
return (CMath.intersectRect(o.X - b, o.Y - b, b * 2, b * 2, x1, y1, x2, y2));
}
///
/// 圆角粗线段
///
public static bool Object_BlockBody_TouchRoundLine(InstanceZoneObject o, float sx, float sy, float dx, float dy, float line_r)
{
float body_r = o.BodyBlockSize;
float body_x = o.X;
float body_y = o.Y;
if (CMath.intersectRound(sx, sy, line_r, body_x, body_y, body_r))
{
return true;
}
if (CMath.intersectRound(dx, dy, line_r, body_x, body_y, body_r))
{
return true;
}
return (CMath.intersectLineRound(sx, sy, dx, dy, body_x, body_y, body_r + line_r));
}
///
/// 圆角粗线段
///
public static bool Object_HitBody_TouchRoundLine(InstanceZoneObject o, float sx, float sy, float dx, float dy, float line_r)
{
float body_r = o.BodyHitSize;
float body_x = o.X;
float body_y = o.Y;
if (CMath.intersectRound(sx, sy, line_r, body_x, body_y, body_r))
{
return true;
}
if (CMath.intersectRound(dx, dy, line_r, body_x, body_y, body_r))
{
return true;
}
return (CMath.intersectLineRound(sx, sy, dx, dy, body_x, body_y, body_r + line_r));
}
///
/// 方角粗线段
///
public static bool Object_BlockBody_TouchRectLine(InstanceZoneObject o, float x1, float y1, float x2, float y2, float line_r)
{
return CMath.intersectRoundStripWidth(o.X, o.Y, o.BodyBlockSize , x1, y1, x2, y2, line_r);
}
///
/// 方角粗线段
///
public static bool Object_HitBody_TouchRectLine(InstanceZoneObject o, float x1, float y1, float x2, float y2, float line_r)
{
return CMath.intersectRoundStripWidth(o.X, o.Y, o.BodyHitSize, x1, y1, x2, y2, line_r);
}
}
}