/// <summary> /// Computes the toi using the specified sweep a /// </summary> /// <param name="sweepA">The sweep</param> /// <param name="sweepB">The sweep</param> /// <returns>The float</returns> public float ComputeToi(Sweep sweepA, Sweep sweepB) { ToiInput input = new ToiInput(); input.SweepA = sweepA; input.SweepB = sweepB; input.SweepRadiusA = FixtureA.ComputeSweepRadius(sweepA.LocalCenter); input.SweepRadiusB = FixtureB.ComputeSweepRadius(sweepB.LocalCenter); input.Tolerance = Settings.LinearSlop; return(Collision.Collision.TimeOfImpact(input, FixtureA.Shape, FixtureB.Shape)); }
protected override void OnRender() { var sweepA = new Sweep(); sweepA.C0.Set(24.0f, -60.0f); sweepA.A0 = 2.95f; sweepA.C = sweepA.C0; sweepA.A = sweepA.A0; sweepA.LocalCenter.SetZero(); var sweepB = new Sweep(); sweepB.C0.Set(53.474274f, -50.252514f); sweepB.A0 = 513.36676f; // - 162.0f * _pi; sweepB.C.Set(54.595478f, -51.083473f); sweepB.A = 513.62781f; // - 162.0f * _pi; sweepB.LocalCenter.SetZero(); //sweepB.A0 -= 300.0f * _pi; //sweepB.A -= 300.0f * _pi; var input = new ToiInput(); input.ProxyA.Set(_shapeA, 0); input.ProxyB.Set(_shapeB, 0); input.SweepA = sweepA; input.SweepB = sweepB; input.Tmax = 1.0f; TimeOfImpact.ComputeTimeOfImpact(out var output, input, World.ToiProfile, World.GJkProfile); DrawString($"toi = {output.Time}"); DrawString($"max toi iters = {ToiMaxIters}, max root iters = {ToiMaxRootIters}"); var vertices = new Vector2[Settings.MaxPolygonVertices]; sweepA.GetTransform(out var transformA, 0.0f); for (var i = 0; i < _shapeA.Count; ++i) { vertices[i] = MathUtils.Mul(transformA, _shapeA.Vertices[i]); } Drawer.DrawPolygon(vertices, _shapeA.Count, Color.FromArgb(230, 230, 230)); sweepB.GetTransform(out var transformB, 0.0f); //Vec2 localPoint(2.0f, -0.1f); for (var i = 0; i < _shapeB.Count; ++i) { vertices[i] = MathUtils.Mul(transformB, _shapeB.Vertices[i]); } Drawer.DrawPolygon(vertices, _shapeB.Count, Color.FromArgb(127, 230, 127)); sweepB.GetTransform(out transformB, output.Time); for (var i = 0; i < _shapeB.Count; ++i) { vertices[i] = MathUtils.Mul(transformB, _shapeB.Vertices[i]); } Drawer.DrawPolygon(vertices, _shapeB.Count, Color.FromArgb(127, 178, 230)); sweepB.GetTransform(out transformB, 1.0f); for (var i = 0; i < _shapeB.Count; ++i) { vertices[i] = MathUtils.Mul(transformB, _shapeB.Vertices[i]); } Drawer.DrawPolygon(vertices, _shapeB.Count, Color.FromArgb(230, 127, 127)); }