/// <summary> /// 朝向目标 /// </summary> /// <param name="body"></param> /// <param name="targetPoint"></param> /// <param name="angularVelocityProc">角速度系数(0.1 - 1)</param> /// <returns></returns> public static float FowardToTarget(this Body body, Vector2 targetPoint, float angularVelocityProc, float deadArea = 0.95f) { if (Vector2.DistanceSquared(body.GetPosition(), targetPoint) < double.Epsilon) { return(0); } Vector2 tmp = targetPoint - body.GetPosition(); bool isClockwise = MathUtils.Cross(tmp, body.GetForward()) > 0; float cos = CrazyUtils.IncludedAngleCos(tmp, body.GetForward()); body.ApplyAngularImpulse(-body.AngularVelocity * body.Inertia, true); if (cos > deadArea) { return(cos); } if (isClockwise) { body.ApplyAngularImpulse(-angularVelocityProc * body.Inertia, true); } else { body.ApplyAngularImpulse(angularVelocityProc * body.Inertia, true); } return(cos); }
/// <summary> /// 圆形检测 /// </summary> /// <param name="body"></param> /// <param name="bodies"></param> /// <param name="radius"></param> /// <returns></returns> public static List <Body> CircleDetection(this Body body, IEnumerable <Body> bodies, double radius) { List <tempBody> CollisionalBodies = new List <tempBody>(); foreach (var b in bodies) { var distance = Vector2.DistanceSquared(body.GetPosition(), b.GetPosition()); if (distance < radius * radius) { CollisionalBodies.Add(new tempBody(b, (float)Math.Sqrt(distance))); } } return((from o in CollisionalBodies.OrderBy(o => o.Distance) select o.Body).ToList()); }
/// <summary> /// 距离检测 /// </summary> /// <param name="body"></param> /// <param name="point"></param> /// <param name="distance"></param> /// <returns></returns> public static bool DistanceDetection(this Body body, Vector2 point, double distance) { return(Vector2.DistanceSquared(body.GetPosition(), point) <= distance * distance); }