Esempio n. 1
0
        public GraphNode <T> ChangeTagToPermanent()
        {
            var node = Neighbours.Where(x => x.Tag[0] == Neighbours.Where(y => y.IsTagPermanent == false).Min(y => y.Tag[0])).First();

            node.IsTagPermanent = true;
            return(node);
        }
Esempio n. 2
0
        /// <inheritdoc />
        public IHastingsMemento CreateMemento()
        {
            var worthyNeighbours = Neighbours.Where(n => n.StateTypes != NeighbourStateTypes.UnResponsive).ToList();

            Logger.Debug("Creating new memento with Peer {peer} and neighbours [{neighbours}]",
                         Peer, string.Join(", ", worthyNeighbours));
            return(new HastingsMemento(Peer, new Neighbours(worthyNeighbours)));
        }
Esempio n. 3
0
 public List <Territory> GetAttackableNeighbours(bool requireSoldiers = false)
 {
     if (requireSoldiers && NrOfSoldiers == 1)
     {
         return(new List <Territory>());
     }
     return(new List <Territory>(Neighbours.Where(t => t.Owner != this.Owner)));
 }
Esempio n. 4
0
        /// <summary>
        /// Opens this Tile's neighbours, and maybe their neighbours.
        /// </summary>
        public void OpenNeighbours()
        {
            var flags = Neighbours.Where(t => t.HasFlag).Count();

            if (flags == Bombs)
            {
                foreach (var neighbour in Neighbours)
                {
                    if (!neighbour.IsOpen && !neighbour.HasFlag)
                    {
                        neighbour.Open();
                    }
                }
            }
        }
Esempio n. 5
0
File: Cell.cs Progetto: Ifry/Nav
        //public void UpdateAlignPlane()
        //{
        //    if (!AlignPlaneDirty)
        //        return;

        //    AlignPlaneDirty = false;

        //    if (AABB.Dimensions.Z < 3 || Neighbours == null)
        //    {
        //        AlignPlane = new Plane(AABB.Center, new Vec3(0, 0, 1));
        //    }
        //    // special case for single neighbor
        //    else if (Neighbours.Count == 1)
        //    {
        //        if (Neighbours[0].border_segment != null)
        //            AlignPlane = new Plane(Neighbours[0].border_segment.Item1, Neighbours[0].border_segment.Item2, Center);
        //    }
        //    else
        //    {
        //        var borders = Neighbours.Where(x => (x.connection_flags & MovementFlag.Walk) != 0 && x.border_segment != null).Select(x => x.border_segment);

        //        if (borders.Count() == 0)
        //        {
        //            AlignPlane = new Plane(AABB.Center, new Vec3(0, 0, 1));
        //            return;
        //        }

        //        // corners starting from min CCW and then from corner above min CCW
        //        Vec3[] corners = new Vec3[] { AABB.Min, new Vec3(AABB.Min.X, AABB.Max.Y, AABB.Min.Z), new Vec3(AABB.Max.X, AABB.Max.Y, AABB.Min.Z), new Vec3(AABB.Max.X, AABB.Min.Y, AABB.Min.Z),
        //                                      new Vec3(AABB.Min.X, AABB.Min.Y, AABB.Max.Z), new Vec3(AABB.Min.X, AABB.Max.Y, AABB.Max.Z), AABB.Max, new Vec3(AABB.Max.X, AABB.Min.Y, AABB.Max.Z) };

        //        bool[] corner_connected = new bool[8];

        //        List<int> connected_upper_corners = new List<int>();
        //        List<int> connected_lower_corners = new List<int>();

        //        for (int i = 0; i < corners.Count(); ++i)
        //        {
        //            corner_connected[i] = borders.FirstOrDefault(x => Vec3.GetDistanceFromSegment(x.Item1, x.Item2, corners[i]) < 2) != null;

        //            if (corner_connected[i])
        //            {
        //                if (i <= 3)
        //                    connected_lower_corners.Add(i);
        //                else
        //                {
        //                    connected_upper_corners.Add(i);
        //                    // disable connected corner below this one, as upper corners has priority as there are situations where two stairscases can cross -
        //                    // in this case there might be 4 connected lower corners but only 2 connected upper corners
        //                    connected_lower_corners.RemoveAll(x => x == (i - 4));
        //                }
        //            }
        //        }

        //        if (connected_lower_corners.Count == 1 && connected_upper_corners.Count == 1)
        //        {
        //            // this ain't perfect solution (when those 3 point lineup its non-determined)
        //            AlignPlane = new Plane(corners[connected_lower_corners[0]], corners[connected_upper_corners[0]], AABB.Center);
        //        }
        //        // check upper corners first because
        //        else if (connected_upper_corners.Count > 1)
        //        {
        //            if (connected_lower_corners.Count > 0)
        //                AlignPlane = new Plane(corners[connected_upper_corners[0]], corners[connected_upper_corners[1]], AABB.Center);
        //            else
        //                AlignPlane = new Plane(corners[connected_upper_corners[0]], corners[connected_upper_corners[1]], new Vec3(AABB.Center.X, AABB.Center.Y, AABB.Max.Z));
        //        }
        //        else if (connected_lower_corners.Count > 1)
        //        {
        //            if (connected_upper_corners.Count > 0)
        //                AlignPlane = new Plane(corners[connected_lower_corners[0]], corners[connected_lower_corners[1]], AABB.Center);
        //            else
        //                AlignPlane = new Plane(corners[connected_lower_corners[0]], corners[connected_lower_corners[1]], new Vec3(AABB.Center.X, AABB.Center.Y, AABB.Min.Z));
        //        }
        //        else
        //        {
        //            //having 1 or non connected corners i'm unable to determine plane
        //            //Log("[Nav] Undetermined cell align plane too few corners connected!");
        //        }

        //        //Tuple<Vec3, Vec3> longest_border = null;
        //        //float longest_border_len_2 = 0;

        //        //foreach (Neighbour n in Neighbours)
        //        //{
        //        //    if (n.border_segment == null)
        //        //        continue;

        //        //    var border_segment = n.border_segment;
        //        //    float len_2 = border_segment.Item1.Distance2DSqr(border_segment.Item2);

        //        //    if (longest_border == null || longest_border_len_2 < len_2)
        //        //    {
        //        //        longest_border = border_segment;
        //        //        longest_border_len_2 = len_2;
        //        //    }
        //        //}

        //        //if (longest_border != null)
        //        //    AlignPlane = new Plane(longest_border.Item1, longest_border.Item2, Center);
        //    }
        //}

        public void UpdateAlignPlane()
        {
            if (!AlignPlaneDirty)
            {
                return;
            }

            AlignPlaneDirty = false;

            if (AABB.Dimensions.Z < 3 || Neighbours == null)
            {
                AlignPlane = new Plane(AABB.Center, new Vec3(0, 0, 1));
            }
            // special case for single neighbor
            else if (Neighbours.Count == 1)
            {
                Vec3 v1 = default(Vec3);
                Vec3 v2 = default(Vec3);

                if (GetBorderSegmentWith(Neighbours[0].cell.AABB, ref v1, ref v2))
                {
                    AlignPlane = new Plane(v1, v2, Center);
                }
            }
            else
            {
                // find plane from all possible plane with smallest average distance of all connection points from it
                var connect_points = Neighbours.Where(x => (x.connection_flags & MovementFlag.Walk) != 0).Select(x => x.border_point).ToList();

                //this is Diablo related hack, as most certainly won't work in general case :(
                Plane[] possible_align_planes = null;

                if (AABB.Dimensions.X > 30)
                {
                    possible_align_planes = new Plane[] { new Plane(AABB.Min, new Vec3(AABB.Min.X, AABB.Max.Y, AABB.Min.Z), AABB.Center),                                     // bottom-up in direction -X
                                                          new Plane(new Vec3(AABB.Min.X, AABB.Min.Y, AABB.Max.Z), new Vec3(AABB.Min.X, AABB.Max.Y, AABB.Max.Z), AABB.Center), // up-bottom in direction -X
                                                          new Plane(AABB.Min, new Vec3(0, 0, 1)),                                                                             //flat bottom
                                                          new Plane(AABB.Max, new Vec3(0, 0, 1)) };                                                                           // flat up
                }
                else if (AABB.Dimensions.Y > 30)
                {
                    possible_align_planes = new Plane[] { new Plane(new Vec3(AABB.Min.X, AABB.Max.Y, AABB.Min.Z), new Vec3(AABB.Max.X, AABB.Max.Y, AABB.Min.Z), AABB.Center), // bottom-up in direction Y
                                                          new Plane(new Vec3(AABB.Min.X, AABB.Max.Y, AABB.Max.Z), AABB.Max, AABB.Center),                                     // up-bottom in direction Y
                                                          new Plane(AABB.Min, new Vec3(0, 0, 1)),                                                                             //flat bottom
                                                          new Plane(AABB.Max, new Vec3(0, 0, 1)) };                                                                           // flat up
                }
                else
                {
                    possible_align_planes = new Plane[] { new Plane(AABB.Min, new Vec3(AABB.Min.X, AABB.Max.Y, AABB.Min.Z), AABB.Center),                                     // bottom-up in direction -X
                                                          new Plane(new Vec3(AABB.Min.X, AABB.Min.Y, AABB.Max.Z), new Vec3(AABB.Min.X, AABB.Max.Y, AABB.Max.Z), AABB.Center), // up-bottom in direction -X
                                                          new Plane(new Vec3(AABB.Min.X, AABB.Max.Y, AABB.Min.Z), new Vec3(AABB.Max.X, AABB.Max.Y, AABB.Min.Z), AABB.Center), // bottom-up in direction Y
                                                          new Plane(new Vec3(AABB.Min.X, AABB.Max.Y, AABB.Max.Z), AABB.Max, AABB.Center),                                     // up-bottom in direction Y
                                                          new Plane(AABB.Min, new Vec3(0, 0, 1)),                                                                             //flat bottom
                                                          new Plane(AABB.Max, new Vec3(0, 0, 1)) };                                                                           // flat up
                }

                float min_avg_dist = -1;

                foreach (Plane plane in possible_align_planes)
                {
                    float avg_dist = 0;
                    foreach (Vec3 p in connect_points)
                    {
                        avg_dist += plane.Distance(p);
                    }

                    avg_dist /= (float)connect_points.Count();

                    if (avg_dist < min_avg_dist || min_avg_dist < 0)
                    {
                        AlignPlane   = plane;
                        min_avg_dist = avg_dist;
                    }
                }
            }
        }
Esempio n. 6
0
 public int ComputeFlagNumberOfMines()
 {
     return(Neighbours.Where(x => x.CellState == CellState.Untouched).Count(x => x.CellType == CellType.Mine));
 }
Esempio n. 7
0
 /// <summary>
 /// get a list of atoms that match an unprocessed criterion
 /// </summary>
 /// <param name="unprocessedTest">Predicate to test degree of processing  -pass as a lambda</param>
 /// <returns></returns>
 public List <Atom> UnprocessedNeighbours(Predicate <Atom> unprocessedTest)
 {
     return(Neighbours.Where(a => unprocessedTest(a)).ToList());
 }
Esempio n. 8
0
 public List <Atom> NeighboursExcept(params Atom[] toIgnore)
 {
     return(Neighbours.Where(a => !toIgnore.Contains(a)).ToList());
 }
Esempio n. 9
0
        /// <summary>
        /// Converts a CML element to a point object
        /// </summary>
        /// <param name="atom">XEelement describing the atom</param>
        /// <returns></returns>

        /// <summary>
        /// returns all borderign atoms except the one listed
        /// </summary>
        /// <param name="toIgnore"></param>
        /// <returns></returns>
        public List <Atom> NeighboursExcept(Atom toIgnore)
        {
            return(Neighbours.Where(a => a != toIgnore).ToList());
        }
Esempio n. 10
0
 public List <Territory> getOwnedNeighbours()
 {
     return(new List <Territory>(Neighbours.Where(t => t.Owner == this.Owner)));
 }