Ejemplo n.º 1
0
        /// <summary>
        /// Determines if a Vertex is inside the Polygon using Fast Winding Number method
        /// </summary>
        /// <param name="vertex"></param>
        /// <returns></returns>
        public bool ContainsVertex(Vertex vertex)
        {
            // http://geomalgorithms.com/a03-_inclusion.html
            Ray ray        = Ray.XAxis(vertex);
            int windNumber = 0;

            foreach (Edge edge in edges)
            {
                if (vertex.OnEdge(edge))
                {
                    return(true);
                }
                Vertex intersection = ray.Intersection(edge) as Vertex;
                if (intersection != null)
                {
                    if (edge.StartVertex.Y <= vertex.Y)
                    {
                        if (edge.EndVertex.Y > vertex.Y)
                        {
                            if (vertex.IsLeftFrom(edge) > 0)
                            {
                                ++windNumber;
                            }
                        }
                    }
                    else
                    {
                        if (edge.EndVertex.Y < vertex.Y)
                        {
                            if (vertex.IsLeftFrom(edge) < 0)
                            {
                                --windNumber;
                            }
                        }
                    }
                }
            }

            // If windNumber is different from 0, vertex is in polygon
            return(windNumber != 0);
        }