Example #1
0
        private void ReflectInternal(Circle c)
        {
            // Reflecting to a line?
            if (IsPointOn(c.Center))
            {
                // Grab 2 points to reflect to P1/P2.
                // We'll use the 2 points that are 120 degrees from c.Center.
                Vector3D v = c.Center - this.Center;
                v.RotateXY(2 * Math.PI / 3);
                P1 = c.ReflectPoint(this.Center + v);
                v.RotateXY(2 * Math.PI / 3);
                P2 = c.ReflectPoint(this.Center + v);

                Radius = double.PositiveInfinity;
                Center.Empty();
            }
            else
            {
                // NOTE: We can't just reflect the center.
                //		 See http://mathworld.wolfram.com/Inversion.html
                double   a = Radius;
                double   k = c.Radius;
                Vector3D v = Center - c.Center;
                double   s = k * k / (v.MagSquared() - a * a);
                Center = c.Center + v * s;
                Radius = Math.Abs(s) * a;
                P1.Empty();
                P2.Empty();
            }
        }
Example #2
0
 public Vector3D ReflectPoint(Vector3D input)
 {
     if (SegmentType.Arc == Type)
     {
         Circle c = this.Circle;
         return(c.ReflectPoint(input));
     }
     else
     {
         return(Euclidean2D.ReflectPointInLine(input, P1, P2));
     }
 }
Example #3
0
        /// <summary>
        /// Helper to do one step of reflections.
        /// Returns a new list of region edges.
        /// </summary>
        private static List <H3.Cell.Edge> DoOneStep(List <H3.Cell.Edge> regionEdges, Tiling tiling, Circle region)
        {
            HashSet <H3.Cell.Edge> newEdges = new HashSet <H3.Cell.Edge>(new H3.Cell.EdgeEqualityComparer());

            foreach (Tile tile in tiling.Tiles)
            {
                foreach (H3.Cell.Edge edge in regionEdges)
                {
                    H3.Cell.Edge toAdd = null;
                    if (!Tolerance.Zero(tile.Center.Abs()))
                    {
                        // Translate
                        // The isometry is necessary for the 363, but seems to mess up 636
                        Vector3D start = tile.Isometry.Apply(edge.Start);
                        Vector3D end   = tile.Isometry.Apply(edge.End);
                        //Vector3D start = edge.Start + tile.Center;
                        //Vector3D end = edge.End + tile.Center;

                        // Reflect
                        start = region.ReflectPoint(start);
                        end   = region.ReflectPoint(end);

                        toAdd = new H3.Cell.Edge(start, end);
                    }
                    else
                    {
                        toAdd = edge;
                    }

                    if (EdgeOkUHS(toAdd, region))
                    {
                        newEdges.Add(toAdd);
                    }
                }
            }

            return(newEdges.ToList());
        }
Example #4
0
 public override void Reflect(Circle c)
 {
     base.Reflect(c);
     CenterNE = c.ReflectPoint(CenterNE);
 }