public void LocateNeighbours()
        {
            var db = new BruteForceProximityDatabase<object>();

            Dictionary<object, Vector3> positionLookup = new Dictionary<object, Vector3>();

            var x0y0z0 = CreateToken(db, new Vector3(0, 0, 0), positionLookup);
            var x1y0z0 = CreateToken(db, new Vector3(1, 0, 0), positionLookup);
            var x3y0z0 = CreateToken(db, new Vector3(3, 0, 0), positionLookup);

            var list = new List<object>();
            x0y0z0.FindNeighbors(Vector3.Zero, 2, list);

            Assert.AreEqual(2, list.Count);
            Assert.AreEqual(new Vector3(0, 0, 0), positionLookup[list[0]]);
            Assert.AreEqual(new Vector3(1, 0, 0), positionLookup[list[1]]);

            //Check tokens handle being disposed twice
            x1y0z0.Dispose();
            x1y0z0.Dispose();

            //Check tokens handle being collected after being disposed
            GC.Collect();
            GC.WaitForPendingFinalizers();

            list.Clear();
            x0y0z0.FindNeighbors(Vector3.Zero, 2, list);

            Assert.AreEqual(1, list.Count);
            Assert.AreEqual(new Vector3(0, 0, 0), positionLookup[list[0]]);
        }
        private ITokenForProximityDatabase<object> CreateToken(BruteForceProximityDatabase<object> db, Vector3 position, Dictionary<object, Vector3> lookup)
        {
            var obj = new object();

            lookup.Add(obj, position);

            var token = db.AllocateToken(obj);
            token.UpdateForNewPosition(position);

            return token;
        }
        public void AllocateToken()
        {
            var db = new BruteForceProximityDatabase<object>();

            var obj = new object();
            var token = db.AllocateToken(obj);

            Assert.AreEqual(1, db.Count);

            token.UpdateForNewPosition(Vector3.Zero);
        }
        void NextPD()
        {
            // save pointer to old PD
            ProximityDatabase oldPD = pd;

            // allocate new PD
            const int totalPD = 2;

            switch (cyclePD = (cyclePD + 1) % totalPD)
            {
            case 0:
            {
                Vector3 center     = Vector3.Zero;
                float   div        = 20.0f;
                Vector3 divisions  = new Vector3(div, 1.0f, div);
                float   diameter   = 80.0f;                     //XXX need better way to get this
                Vector3 dimensions = new Vector3(diameter, diameter, diameter);
                pd = new LocalityQueryProximityDatabase <IVehicle>(center, dimensions, divisions);
                break;
            }

            case 1:
            {
                pd = new BruteForceProximityDatabase <IVehicle>();
                break;
            }
            }

            // switch each boid to new PD
            for (int i = 0; i < crowd.Count; i++)
            {
                crowd[i].NewPD(pd);
            }

            // delete old PD (if any)
            oldPD = null;
        }
예제 #5
0
        // for purposes of demonstration, allow cycling through various
        // types of proximity databases.  this routine is called when the
        // Demo user pushes a function key.
        public void NextPD()
        {
            // save pointer to old PD
            ProximityDatabase oldPD = pd;

            // allocate new PD
            const int totalPD = 2;

            switch (cyclePD = (cyclePD + 1) % totalPD)
            {
            case 0:
            {
                Vector3     center     = Vector3.Zero;
                const float div        = 10.0f;
                Vector3     divisions  = new Vector3(div, div, div);
                float       diameter   = Boid.worldRadius * 1.1f * 2;
                Vector3     dimensions = new Vector3(diameter, diameter, diameter);
                pd = new LocalityQueryProximityDatabase <IVehicle>(center, dimensions, divisions);
                break;
            }

            case 1:
            {
                pd = new BruteForceProximityDatabase <IVehicle>();
                break;
            }
            }

            // switch each boid to new PD
            for (int i = 0; i < flock.Count; i++)
            {
                flock[i].NewPD(pd);
            }

            // delete old PD (if any)
            oldPD = null;
        }
		void NextPD()
		{
			// save pointer to old PD
			ProximityDatabase oldPD = pd;

			// allocate new PD
			const int totalPD = 2;
			switch (cyclePD = (cyclePD + 1) % totalPD)
			{
			case 0:
				{
					Vector3 center = Vector3.Zero;
					float div = 20.0f;
					Vector3 divisions = new Vector3(div, 1.0f, div);
					float diameter = 80.0f; //XXX need better way to get this
					Vector3 dimensions = new Vector3(diameter, diameter, diameter);
					pd = new LocalityQueryProximityDatabase<IVehicle>(center, dimensions, divisions);
					break;
				}
			case 1:
				{
					pd = new BruteForceProximityDatabase<IVehicle>();
					break;
				}
			}

			// switch each boid to new PD
			for (int i = 0; i < crowd.Count; i++) crowd[i].NewPD(pd);

			// delete old PD (if any)
			oldPD = null;
		}
        public void Construct()
        {
            var db = new BruteForceProximityDatabase<object>();

            Assert.AreEqual(0, db.Count);
        }