private static List <SubsectorEdge> CreateSubsectorEdges(ConvexTraversal convexTraversal, Rotation rotation) { List <ConvexTraversalPoint> traversal = convexTraversal.Traversal; Debug.Assert(traversal.Count >= 3, "Traversal must yield at least a triangle in size"); List <SubsectorEdge> subsectorEdges = new List <SubsectorEdge>(); ConvexTraversalPoint firstTraversal = traversal.First(); Vec2D startPoint = firstTraversal.Vertex; foreach (ConvexTraversalPoint traversalPoint in traversal) { BspSegment segment = traversalPoint.Segment; Vec2D endingPoint = segment.Opposite(traversalPoint.Endpoint).Struct(); bool traversedFrontSide = CheckIfTraversedFrontSide(traversalPoint, rotation); SubsectorEdge edge = new SubsectorEdge(startPoint, endingPoint, segment.Line.Value, traversedFrontSide); subsectorEdges.Add(edge); Debug.Assert(startPoint != endingPoint, "Traversal produced the wrong endpoint indices"); startPoint = endingPoint; } Debug.Assert(subsectorEdges.Count == traversal.Count, "Added too many subsector edges in traversal"); return(subsectorEdges); }
/// <summary> /// Takes the convex traversal that was done and adds it to the top BSP /// node on the stack. This effectively creates the subsector. /// </summary> private void AddConvexTraversalToTopNode() { Debug.Assert(!workItems.Empty(), "Cannot add convex traversal to an empty work item stack"); ConvexTraversal traversal = ConvexChecker.States.ConvexTraversal; Rotation rotation = ConvexChecker.States.Rotation; List <SubsectorEdge> edges = SubsectorEdge.FromClockwiseTraversal(traversal, rotation); workItems.Peek().Node.ClockwiseEdges = edges; }
/// <summary> /// Using the convex traversal and the rotation of the traversal, this /// will create a clockwise traversal to form the final subsector for /// a BSP node. /// </summary> /// <param name="convexTraversal">The traversal we did earlier that /// resulted in a convex subsector.</param> /// <param name="rotation">What direction that traversal went.</param> /// <returns>A convex series of sequential subsector edges that make up /// the closed subsector.</returns> public static List <SubsectorEdge> FromClockwiseTraversal(ConvexTraversal convexTraversal, Rotation rotation) { List <SubsectorEdge> edges = CreateSubsectorEdges(convexTraversal, rotation); if (rotation == Rotation.Left) { edges.ForEach(edge => edge.Reverse()); edges.Reverse(); } // TODO: Assert valid subsector edges! return(edges); }