Beispiel #1
0
        /// <summary>
        /// Tessellates the given polygon with triangles
        /// </summary>
        /// <param name="poly">The polygon to be tessellated</param>
        /// <returns>Returns the calculated triangles</returns>
        public static Vec2I[][] Polygon2Triangles(Vec2I[] poly)
        {
            var tris = new Vec2I[poly.Length - 2][];
            int k    = 0;

            var list = new LinkedList <Vec2I>();

            for (int i = 0; i < poly.Length; i++)
            {
                list.AddLast(poly[i]);
            }

            var node = list.First;

            while (node.Next != null &&
                   node.Next.Next != null)
            {
                var  p1       = node.Value;
                var  p2       = node.Next.Value;
                var  p3       = node.Next.Next.Value;
                bool doRemove = true;
                var  forward  = node.Next.Next;
                while (forward.Next != null)
                {
                    forward = forward.Next;
                    if (PointInTri(forward.Value, p1, p2, p3))
                    {
                        doRemove = false;
                        break;
                    }
                }
                if (doRemove)
                {
                    var backward = node;
                    while (backward.Previous != null)
                    {
                        backward = backward.Previous;
                        if (PointInTri(backward.Value, p1, p2, p3))
                        {
                            doRemove = false;
                            break;
                        }
                    }

                    if (doRemove)
                    {
                        list.Remove(node.Next);
                        tris[k++] = new Vec2I[] { p1, p2, p3 };
                    }
                }
                node = node.Next;
            }
            return(tris);
        }
Beispiel #2
0
 public bool Contains(Vec2I p)
 {
     return(L <= p.X && R >= p.X && T <= p.Y && B >= p.Y);
 }