Ejemplo n.º 1
0
        internal bool HasAngle(BasicGraphPath p2)
        {
            Vec2 t1 = new Vec2((float)this.list[this.list.Count - 2].position.X, (float)this.list[this.list.Count - 2].position.Z);
            Vec2 t2 = new Vec2((float)this.list[this.list.Count - 1].position.X, (float)this.list[this.list.Count - 1].position.Z);
            Vec2 v1 = t2 - t1;

            v1 = v1.normalize();
            t1 = new Vec2((float)p2.list[0].position.X, (float)p2.list[0].position.Z);
            t2 = new Vec2((float)p2.list[1].position.X, (float)p2.list[1].position.Z);
            Vec2 v2 = t2 - t1;

            v2 = v2.normalize();

            return(Math.Abs(Vec2.AngleBetweenVectors(v1, v2)) > 0.25f);
        }
Ejemplo n.º 2
0
        internal BasicGraphPath(BasicGraphPath p1, BasicGraphPath p2)
        {
            if (p1.End != p2.Start)
            {
                throw new Exception("This cannot be done!");
            }
            this.list = new List <BasicGraphNode>(p1.list.Count + p2.list.Count - 1);
            foreach (BasicGraphNode bn in p1.list)
            {
                this.list.Add(bn);
            }
            this.list.RemoveAt(this.list.Count - 1);
            foreach (BasicGraphNode bn in p2.list)
            {
                this.list.Add(bn);
            }

            foreach (BasicGraphNode bn in this.list)
            {
                bn.partOfPath.Add(this);
            }
            this.reversed = p1.reversed;
        }
Ejemplo n.º 3
0
        public void CombinePathsWithoutIntersectionOfSameType()
        {
            List <BasicGraphPath> newPaths = new List <BasicGraphPath>();

            while (paths.Count > 0)
            {
                if (paths.Count == 1)
                {
                    newPaths.Add(paths[0]);
                    paths.Clear();
                }
                else
                {
                    BasicGraphPath path      = paths[0];
                    bool           unchanged = true;
                    if (path.Start.partOfPath.Count == 2)
                    {
                        for (int i = 1; i < paths.Count - 1; ++i)
                        {
                            BasicGraphPath p2 = paths[i];
                            if ((path.Start == p2.Start || path.Start == p2.End) && path.type == p2.type)
                            {
                                if (path.Start == p2.End)
                                {
                                    p2.Reverse();
                                }
                                path.Reverse();

                                if (!path.HasAngle(p2))
                                {
                                    paths.Remove(path);
                                    path.Delete();
                                    paths.Remove(p2);
                                    p2.Delete();
                                    paths.Insert(0, new BasicGraphPath(path, p2));
                                    unchanged = false;
                                    break;
                                }
                            }
                        }
                    }
                    if (unchanged && path.End.partOfPath.Count == 2)
                    {
                        for (int i = 1; i < paths.Count - 1; ++i)
                        {
                            BasicGraphPath p2 = paths[i];
                            if ((path.End == p2.Start || path.End == p2.End) && path.type == p2.type)
                            {
                                if (path.End == p2.End)
                                {
                                    p2.Reverse();
                                }

                                if (!path.HasAngle(p2))
                                {
                                    paths.Remove(path);
                                    path.Delete();
                                    paths.Remove(p2);
                                    p2.Delete();
                                    paths.Insert(0, new BasicGraphPath(path, p2));
                                    unchanged = false;
                                    break;
                                }
                            }
                        }
                    }
                    if (unchanged)
                    {
                        paths.Remove(path);
                        newPaths.Add(path);
                    }
                }
            }
            paths = newPaths;
        }