コード例 #1
0
        public bool CheckCollision(Plane2D p)
        {
            float dir = (float)Vector.Multiply(Direction, p.Normal);
            float dis = p.DistanceTo(Origin);

            if (dis == 0)
            {
                return(true);
            }

            if (dir >= 0)
            {
                return(false);
            }

            float actualLength = -(dis / dir);

            if (actualLength > Length)
            {
                return(false);
            }
            else
            {
                return(true);
            }
        }
コード例 #2
0
ファイル: NavMesh.cs プロジェクト: HoHoHoson/AIE_2018_MidYear
        public void RemovePolygon(Vector pos)
        {
            foreach (Polygon p in polygons)
            {
                bool isSelected = true;

                foreach (Edge ed in p.edges)
                {
                    Plane2D temp = new Plane2D(ed.start, ed.end);

                    if (temp.CheckCollision(pos) == true)
                    {
                        isSelected = false;
                        break;
                    }
                }

                if (isSelected == true)
                {
                    polygons.Remove(p);
                    return;
                }
            }
        }
コード例 #3
0
ファイル: NavMesh.cs プロジェクト: HoHoHoson/AIE_2018_MidYear
        /// <summary>
        /// Checks that the polygon being made is valid.
        /// </summary>
        private void ValidatePoly()
        {
            if (tempNodes.Count >= 2)
            {
                // Checks if the polygon will overlap another.
                List <Vector> tempArray = new List <Vector>(tempNodes);
                if (nodeSelect != originNode)
                {
                    tempArray.Add(nodeSelect);
                }

                Vector checkPoint = new Vector((tempArray.ElementAt(0).X + tempArray.ElementAt(1).X + tempArray.ElementAt(2).X) / 3,
                                               (tempArray.ElementAt(0).Y + tempArray.ElementAt(1).Y + tempArray.ElementAt(2).Y) / 3);
                Plane2D plane = new Plane2D(tempArray.ElementAt(0), tempArray.ElementAt(1));

                if (plane.CheckCollision(checkPoint) == true)
                {
                    tempArray.Reverse();
                }

                List <Plane2D> tempPlanes = new List <Plane2D>();
                for (int i = 0; i < tempArray.Count; ++i)
                {
                    if (i == tempArray.Count - 1)
                    {
                        tempPlanes.Add(new Plane2D(tempArray[i], tempArray[0]));
                    }
                    else
                    {
                        tempPlanes.Add(new Plane2D(tempArray[i], tempArray[i + 1]));
                    }
                }

                List <Vector> vSet = new List <Vector>();

                foreach (Polygon p in polygons)
                {
                    foreach (Edge ed in p.edges)
                    {
                        vSet.Add(ed.start);
                    }
                }

                foreach (Vector v in vSet)
                {
                    bool isValid = false;

                    foreach (Plane2D pl in tempPlanes)
                    {
                        if (tempArray.Any(vec => vec == v) == true || pl.CheckCollision(v) == true)
                        {
                            isValid = true;
                        }
                    }

                    if (isValid == false)
                    {
                        nodeSelect = tempNodes.ElementAt(tempNodes.Count - 1);
                        MessageBox.Show("The polygon will overlap with another.", "Invalid edge");

                        return;
                    }
                }
            }

            if (tempNodes.Count < 3)
            {
                tempNodes.Add(nodeSelect);
                return;
            }

            int tailNode = tempNodes.Count - 1;

            if (tempNodes.Count == 3)
            {
                Vector checkPoint = new Vector((tempNodes.ElementAt(0).X + tempNodes.ElementAt(1).X + tempNodes.ElementAt(2).X) / 3,
                                               (tempNodes.ElementAt(0).Y + tempNodes.ElementAt(1).Y + tempNodes.ElementAt(2).Y) / 3);
                Plane2D plane = new Plane2D(tempNodes.ElementAt(0), tempNodes.ElementAt(1));

                if (plane.CheckCollision(checkPoint) == true)
                {
                    polyPositive = false;
                }
                else
                {
                    polyPositive = true;
                }
            }

            // Checks if Polygon is convex by comparing with the other temp nodes.
            Plane2D checkPlane;

            if (nodeSelect != originNode)
            {
                if (polyPositive == true)
                {
                    checkPlane = new Plane2D(tempNodes.ElementAt(tailNode), nodeSelect);
                }
                else
                {
                    checkPlane = new Plane2D(nodeSelect, tempNodes.ElementAt(tailNode));
                }

                for (int i = 0; i < tailNode - 1; ++i)
                {
                    if (checkPlane.CheckCollision(tempNodes.ElementAt(i)) == true)
                    {
                        nodeSelect = tempNodes.ElementAt(tailNode);
                        MessageBox.Show("Polygon needs to be convex.", "Invalid edge");

                        return;
                    }
                }
            }
            else
            {
                if (polyPositive == true)
                {
                    checkPlane = new Plane2D(tempNodes.ElementAt(tailNode), nodeSelect);
                }
                else
                {
                    checkPlane = new Plane2D(nodeSelect, tempNodes.ElementAt(tailNode));
                }

                for (int i = 1; i < tailNode; ++i)
                {
                    if (checkPlane.CheckCollision(tempNodes.ElementAt(i)) == true)
                    {
                        tempNodes.RemoveAt(tailNode);
                        nodeSelect = tempNodes.ElementAt(tailNode - 1);
                        MessageBox.Show("Polygon needs to be convex.", "Invalid edge");

                        return;
                    }
                }
            }

            // Adds selected node if it passes all the validation checks.
            if (nodeSelect != originNode)
            {
                tempNodes.Add(nodeSelect);
            }

            // Removes uneeded nodes that were inlined with the current node.
            Vector cur          = tempNodes.ElementAt(tailNode) - tempNodes.ElementAt(tailNode - 1);
            Vector prev         = tempNodes.ElementAt(tailNode - 1) - tempNodes.ElementAt(tailNode - 2);
            float  crossProduct = (float)(prev.X * cur.Y - prev.Y * cur.X);

            if (crossProduct == 0)
            {
                tempNodes.RemoveAt(tailNode - 1);
            }

            // One last check to see if the polygon already exists. Then stores the polygon once it is complete.
            if (tempNodes.Count >= 3 && nodeSelect == originNode)
            {
                foreach (Polygon p in polygons)
                {
                    int edgeCount = p.edges.Count;

                    for (int i = 0; i < p.edges.Count; ++i)
                    {
                        foreach (Vector v in tempNodes)
                        {
                            if (v == p.edges.ElementAt(i).start)
                            {
                                edgeCount--;
                                if (edgeCount == 0)
                                {
                                    originNode = new Vector(double.NaN, double.NaN);
                                    nodeSelect = new Vector(double.NaN, double.NaN);
                                    tempNodes.Clear();
                                    polyPositive = true;

                                    MessageBox.Show("Polygon is a duplicate and/or overlaps another.", "Invalid Polygon");

                                    return;
                                }
                            }
                        }
                    }
                }

                var nodeArray = tempNodes.ToArray();

                if (polyPositive == false)
                {
                    Array.Reverse(nodeArray);
                }

                polygons.Add(new Polygon(nodeArray));

                originNode = new Vector(double.NaN, double.NaN);
                nodeSelect = new Vector(double.NaN, double.NaN);
                tempNodes.Clear();
                polyPositive = true;
            }
        }