R3.Math.Isometry.CalculateFromTwoPolygonsInternal C# (CSharp) Method

CalculateFromTwoPolygonsInternal() private method

private CalculateFromTwoPolygonsInternal ( Polygon home, Polygon boundary, CircleNE homeVertexCircle, Geometry g ) : void
home Polygon
boundary Polygon
homeVertexCircle CircleNE
g Geometry
return void
        private void CalculateFromTwoPolygonsInternal( Polygon home, Polygon boundary, CircleNE homeVertexCircle, Geometry g )
        {
            // ZZZ - We have to use the boundary, but that can be projected to infinity for some of the spherical tilings.
            //		 Trying to use the Drawn tile produced weird (yet interesting) results.
            Polygon poly1 = boundary;
            Polygon poly2 = home;

            if( poly1.Segments.Count < 3 ||
                poly2.Segments.Count < 3 )	// Poor poor digons.
            {
                Debug.Assert( false );
                return;
            }

            // Same?
            Vector3D p1 = poly1.Segments[0].P1, p2 = poly1.Segments[1].P1, p3 = poly1.Segments[2].P1;
            Vector3D w1 = poly2.Segments[0].P1, w2 = poly2.Segments[1].P1, w3 = poly2.Segments[2].P1;
            if( p1 == w1 && p2 == w2 && p3 == w3 )
            {
                this.Mobius = Mobius.Identity();
                return;
            }

            Mobius m = new Mobius();
            m.MapPoints( p1, p2, p3, w1, w2, w3 );
            this.Mobius = m;

            // Worry about reflections as well.
            if( g == Geometry.Spherical )
            {
                // If inverted matches the orientation, we need a reflection.
                bool inverted = poly1.IsInverted;
                if( !(inverted ^ poly1.Orientation) )
                    this.Reflection = homeVertexCircle;
            }
            else
            {
                if( !poly1.Orientation )
                    this.Reflection = homeVertexCircle;
            }

            // Some testing.
            Vector3D test = this.Apply( boundary.Center );
            if( test != home.Center )
            {
                // ZZZ: What is happening here is that the mobius can project a point to infinity before the reflection brings it back to the origin.
                //		It hasn't been much of a problem in practice yet, but will probably need fixing at some point.
                //Trace.WriteLine( "oh no!" );
            }
        }