public void TestIPinWithNotCloseObject() { CombinedParticle obj = new CombinedParticle( new List <Vector2D> { new Vector2D(0, 0), new Vector2D(0, 1), new Vector2D(1, 1), new Vector2D(1, 0) }, isClose: false); World world = new World(); // Pin var handle = world.Pin(obj, Vector2D.UnitX); Assert.AreEqual(Vector2D.UnitX, handle.Position); // 移动handle handle.Position = Vector2D.Zero; Assert.AreEqual(new Vector2D(-1, 0), obj.Position); Assert.IsTrue(obj.PinRods.Count == 4); // UnPin world.UnPin(obj); Assert.IsTrue(obj.PinRods.Count == 0); }
public void TestConstructorForCloseObjectFail() { // 无法形成封闭形状物体 CombinedParticle objB = new CombinedParticle( new List <Vector2D> { new Vector2D(0, 0), new Vector2D(0, 1) }); }
public void TestConstructorByOnePointFail() { CombinedParticle obj = null; // 无法构成组合物体 obj = new CombinedParticle( new List <Vector2D> { new Vector2D(0, 0) }, isClose: false); }
private void TestAddCustomObject(World world, CombinedParticle obj) { world.AddObject(obj); world.Update(1); var vertexs = obj.Vertexs; for (var i = 0; i < vertexs.Count; i++) { Assert.AreEqual(new Vector2D(0, 9.8), vertexs[i].Acceleration, $"作用力应被正确地施加到了物体{i}上"); } }
public void TestConstructorByTwoPointFail() { CombinedParticle obj = null; // 无法构成封闭的组合物体 obj = new CombinedParticle( new List <Vector2D> { new Vector2D(0, 0), new Vector2D(0, 1) }); }
public void TestGetRods() { CombinedParticle obj = new CombinedParticle( new List <Vector2D> { new Vector2D(0, 0), new Vector2D(0, 1), new Vector2D(1, 1) }); Assert.IsNotNull(obj.Rods); Assert.IsTrue(obj.Rods.Count == 3); }
public void TestConstructorForNotCloseObject() { // 不封闭物体 CombinedParticle obj = new CombinedParticle( new List <Vector2D> { new Vector2D(0, 0), new Vector2D(0, 1), new Vector2D(1, 1), new Vector2D(1, 0), }, isClose: false); Assert.IsTrue(obj.Vertexs.Count == 4); }
public void TestConstructorForCloseObject() { // 封闭形状 CombinedParticle obj = new CombinedParticle( new List <Vector2D> { new Vector2D(0, 0), new Vector2D(0, 1), new Vector2D(1, 1) }); Assert.IsNotNull(obj); Assert.IsTrue(obj.Vertexs.Count == 4); }
private void TestUnPin(World world, CombinedParticle obj, Handle handle) { obj.Position = Vector2D.Zero; world.UnPin(obj); handle.Position = new Vector2D(100, 100); Assert.AreEqual(new Vector2D(0, 0), obj.Position, "Handle不能对其生效"); try { world.UnPin(obj); } catch (Exception e) { Assert.IsInstanceOfType(e, typeof(InvalidOperationException), "不允许对未Pin的物体执行UnPin"); } }
private void TestRemoveCustomObject(World world, CombinedParticle obj) { var vertexs = obj.Vertexs; foreach (var vertex in vertexs) { vertex.Acceleration = Vector2D.Zero; } world.RemoveObject(obj); world.Update(1); for (var i = 0; i < vertexs.Count; i++) { Assert.AreEqual(new Vector2D(0, 0), vertexs[i].Acceleration, $"物体{i}上"); } }
public void TestUpdateWithNotCloseObject() { // 封闭物体 CombinedParticle obj = new CombinedParticle( new List <Vector2D> { new Vector2D(0, 0), new Vector2D(0, 1), new Vector2D(1, 1) }, isClose: false); obj.Position = new Vector2D(1, 0); obj.Update(1 / 60.0); Assert.AreEqual(new Vector2D(1, 0), obj.Vertexs[0].Position); Assert.AreEqual(new Vector2D(2, 1), obj.Vertexs[2].Position); Assert.AreEqual(new Vector2D(0, 0), obj.Position); }
private Handle TestPin(World world, CombinedParticle obj) { obj.Position = Vector2D.Zero; var handle = world.Pin(obj, Vector2D.Zero); try { world.Pin(obj, Vector2D.UnitX); } catch (Exception e) { Assert.IsInstanceOfType(e, typeof(InvalidOperationException), "不允许对同一物体Pin多次"); } handle.Position = new Vector2D(100, 100); Assert.AreEqual(new Vector2D(100, 100), obj.Position, "Handle能对其生效"); return(handle); }
public void TestIsClose() { CombinedParticle objA = new CombinedParticle( new List <Vector2D> { new Vector2D(0, 0), new Vector2D(0, 1), new Vector2D(1, 1) }); Assert.IsTrue(objA.IsClose); CombinedParticle objB = new CombinedParticle( new List <Vector2D> { new Vector2D(0, 0), new Vector2D(0, 1), new Vector2D(1, 1), new Vector2D(1, 0), }, isClose: false); Assert.IsFalse(objB.IsClose); }
public RobDemo(Image image) : base(image) { Settings.ContactIteration = 20; this.combinedParticle = new CombinedParticle(this.vertexs, 3, 1, true); this.PhysicsWorld.AddObject(this.combinedParticle); // 为顶点绑定形状 foreach (var vertex in this.combinedParticle.Vertexs) { vertex.BindShape(new Circle(4.ToSimUnits())); } // 增加边缘 this.PhysicsWorld.CreatePolygonEdge(this.edgePoints.ToArray()); // 增加重力 this.PhysicsWorld.CreateGravity(9.8); this.DrawQueue.Add(this); this.Start = true; }
public void TestUpdate() { var world = new World(); // 两种物体 var objA = new CombinedParticle( new List <Vector2D> { new Vector2D(0, 0), new Vector2D(5, 0), new Vector2D(0, 5) }); var objB = new Particle { Mass = 1, Position = Vector2D.Zero }; // 一个全局作用力 var zone = new GlobalZone(); zone.Add(new ParticleGravity(new Vector2D(0, 9.8))); world.Zones.Add(zone); TestAddCustomObject(world, objA); var handle = TestPin(world, objA); TestUnPin(world, objA, handle); TestRemoveCustomObject(world, objA); // 一个作用力 var force = new ParticleConstantForce(new Vector2D(5, 0)); force.Add(objB); world.ForceGenerators.Add(force); TestAddObject(world, objB); TestRemoveObject(world, objB); }