RenderStack 11.06.1
Public Member Functions | Public Attributes
RenderStack.Geometry.TruncateGeometryOperation Class Reference
Inheritance diagram for RenderStack.Geometry.TruncateGeometryOperation:
RenderStack.Geometry.GeometryOperation

List of all members.

Public Member Functions

void UpdateTruncatedEdge (Polygon newPolygon, Corner oldCorner1, Corner oldCorner2, float t)
 TruncateGeometryOperation (Geometry src, bool close)

Public Attributes

Dictionary< Edge, List< Edge > > oldEdgeToNews = new Dictionary<Edge,List<Edge>>()
Dictionary< Point, List< Edge > > oldPointToOpenEdges = new Dictionary<Point,List<Edge>>()
Dictionary< Point, PointnewPointToOld = new Dictionary<Point,Point>()

Detailed Description

Definition at line 33 of file TruncateGeometryOperation.cs.


Constructor & Destructor Documentation

RenderStack.Geometry.TruncateGeometryOperation.TruncateGeometryOperation ( Geometry  src,
bool  close 
)

Definition at line 86 of file TruncateGeometryOperation.cs.

References RenderStack.Geometry.Edge.A, RenderStack.Geometry.Edge.B, RenderStack.Geometry.Polygon.Corners, RenderStack.Geometry.Edge.Equals(), RenderStack.Geometry.Polygon.MakeCorner(), and RenderStack.Geometry.Corner.Point.

        {
            Source = src;

            //  Pass 1: Create truncated versions of old polygons
            foreach(Polygon oldPolygon in Source.Polygons)
            {
                Polygon newPolygon = MakeNewPolygonFromPolygon(oldPolygon);

                double  n1      = (double)(oldPolygon.Corners.Count);
                double  n2      = (double)(2 * oldPolygon.Corners.Count);
                float   ratio   = (float)(System.Math.Tan(System.Math.PI / n2) / System.Math.Tan(System.Math.PI / n1));
                float   t       = 0.5f - 0.5f * ratio;

                //  Pass 1A: Create truncated corners
                for(int i = 0; i < oldPolygon.Corners.Count; ++i)
                {
                    Corner  oldCorner   = oldPolygon.Corners[i];
                    Corner  nextCorner  = oldPolygon.Corners[(i + 1) % oldPolygon.Corners.Count];

                    UpdateTruncatedEdge(newPolygon, oldCorner, nextCorner, t);
                }

                //  Pass 1B: Collect open edges from new polygon to per point dictionary
                //  Note the order of points in new edge is important in this case.
                for(int i = 0; i < newPolygon.Corners.Count; i += 2)
                {
                    Corner  newCorner       = newPolygon.Corners[i];
                    Corner  previousCorner  = newPolygon.Corners[(i + newPolygon.Corners.Count - 1) % newPolygon.Corners.Count];
                    Point   newPoint        = newCorner.Point;
                    Point   previousPoint   = previousCorner.Point;
                    Point   oldPoint        = newPointToOld[newPoint];
                    Edge    newEdge         = new Edge(newPoint, previousPoint);

                    if(oldPointToOpenEdges.ContainsKey(oldPoint) == false)
                    {
                        oldPointToOpenEdges[oldPoint] = new List<Edge>();
                    }
                    oldPointToOpenEdges[oldPoint].Add(newEdge);
                }
            }

            //  Pass 2: Connect open edges
            if(close)
            {
                foreach(Point oldPoint in src.Points)
                {
                    if(oldPointToOpenEdges.ContainsKey(oldPoint) == false)
                    {
                        continue;
                    }
                    if(oldPointToOpenEdges[oldPoint].Count < 3)
                    {
                        continue;
                    }
                    Polygon newPolygon  = Destination.MakePolygon();
                    //  TODO This polygon has no sources.. inherit average of surrounding polygons?

                    Edge    edge        = oldPointToOpenEdges[oldPoint].First();
                    Edge    startEdge   = edge;
                    //  TODO MUSTFIX    This loop does not terminate for some geometries
                    //                  such as tetrahemihexahedron
                    do
                    {
                        bool nextEdgeFound = false;
                        int edgeIndex = 0;
                        foreach(Edge nextEdge in oldPointToOpenEdges[oldPoint])
                        {
                            ++edgeIndex;
                            if(nextEdge.A == edge.B)
                            {
                                Point   newPoint = edge.A;
                                Corner  newCorner = newPolygon.MakeCorner(newPoint);
                                DistributeCornerSources(newCorner, 1.0f, newPoint);
                                edge = nextEdge;
                                nextEdgeFound = true;
                                break;
                            }
                        }
                        /*  This can happen  */ 
                        if(nextEdgeFound == false)
                        {
                            break;
                        }
                    }
                    while(edge.Equals(startEdge) == false);

                    if(newPolygon.Corners.Count < 3)
                    {
                        Destination.RemovePolygon(newPolygon);
                    }
                }
            }

            Destination.BuildEdges();
            InterpolateAllAttributeMaps();
        }

Member Function Documentation

void RenderStack.Geometry.TruncateGeometryOperation.UpdateTruncatedEdge ( Polygon  newPolygon,
Corner  oldCorner1,
Corner  oldCorner2,
float  t 
)

Definition at line 46 of file TruncateGeometryOperation.cs.

References RenderStack.Geometry.Polygon.MakeCorner(), and RenderStack.Geometry.Corner.Point.

        {
            Point   oldPoint    = oldCorner1.Point;
            Point   nextPoint   = oldCorner2.Point;
            Edge    oldEdge     = new Edge(oldPoint, nextPoint);

            Point   newPoint2;
            Point   newPoint3;

            if(oldEdgeToNews.ContainsKey(oldEdge) == false)
            {
                oldEdgeToNews[oldEdge] = new List<Edge>();

                newPoint2           = Destination.MakePoint();
                newPoint3           = Destination.MakePoint();
                AddPointSource(newPoint2, 1.0f - t, oldPoint);
                AddPointSource(newPoint2, t,        nextPoint);
                AddPointSource(newPoint3, t,        oldPoint);
                AddPointSource(newPoint3, 1.0f - t, nextPoint);
                newPointToOld[newPoint2] = oldPoint;
                newPointToOld[newPoint3] = nextPoint;
                //  This is new the 'middle' edge, the edges that remain touching.
                //  For the other two 'open' edges, see the second pass.
                Edge newEdge = new Edge(newPoint2, newPoint3);
                oldEdgeToNews[oldEdge].Add(newEdge);
                AddEdgeSource(newEdge, 1.0f, oldEdge);
            }
            else
            {
                newPoint2 = oldEdgeToNews[oldEdge].First().B;
                newPoint3 = oldEdgeToNews[oldEdge].First().A;
            }

            newPolygon.MakeCorner(newPoint2);
            newPolygon.MakeCorner(newPoint3);
            AddPointSource(newPoint2, 1.0f - t, oldCorner1);
            AddPointSource(newPoint2, t,        oldCorner2);
            AddPointSource(newPoint3, t,        oldCorner1);
            AddPointSource(newPoint3, 1.0f - t, oldCorner2);
        }

Member Data Documentation

Dictionary<Edge, List<Edge> > RenderStack.Geometry.TruncateGeometryOperation.oldEdgeToNews = new Dictionary<Edge,List<Edge>>()

Definition at line 42 of file TruncateGeometryOperation.cs.

Definition at line 43 of file TruncateGeometryOperation.cs.

Definition at line 44 of file TruncateGeometryOperation.cs.


The documentation for this class was generated from the following file: