Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
 public void TestConstructorForCloseObjectFail()
 {
     // 无法形成封闭形状物体
     CombinedParticle objB = new CombinedParticle(
         new List <Vector2D>
     {
         new Vector2D(0, 0),
         new Vector2D(0, 1)
     });
 }
Ejemplo n.º 3
0
        public void TestConstructorByOnePointFail()
        {
            CombinedParticle obj = null;

            // 无法构成组合物体
            obj = new CombinedParticle(
                new List <Vector2D>
            {
                new Vector2D(0, 0)
            }, isClose: false);
        }
Ejemplo n.º 4
0
        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}上");
            }
        }
Ejemplo n.º 5
0
        public void TestConstructorByTwoPointFail()
        {
            CombinedParticle obj = null;

            // 无法构成封闭的组合物体
            obj = new CombinedParticle(
                new List <Vector2D>
            {
                new Vector2D(0, 0),
                new Vector2D(0, 1)
            });
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 7
0
        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);
        }
Ejemplo n.º 8
0
        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);
        }
Ejemplo n.º 9
0
        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");
            }
        }
Ejemplo n.º 10
0
        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}上");
            }
        }
Ejemplo n.º 11
0
        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);
        }
Ejemplo n.º 12
0
        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);
        }
Ejemplo n.º 13
0
        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);
        }
Ejemplo n.º 14
0
        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;
        }
Ejemplo n.º 15
0
        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);
        }