Beispiel #1
0
        public int Closest(Vector3D p)
        {
            // Needs to be non-euclidean calc,
            // Moving the hex to the center will make that be the case.
            Mobius  m    = MobiusToCenter;
            Polygon poly = Hexagon.Clone();

            poly.Transform(m);
            p = m.Apply(p);

            double d1  = poly.Segments[1].Midpoint.Dist(p);
            double d2  = poly.Segments[3].Midpoint.Dist(p);
            double d3  = poly.Segments[5].Midpoint.Dist(p);
            double min = Math.Min(d1, Math.Min(d2, d3));

            if (min == d1)
            {
                return(4);
            }
            if (min == d2)
            {
                return(0);
            }
            if (min == d3)
            {
                return(2);
            }
            return(-1);
        }
Beispiel #2
0
        public Pants Clone()
        {
            Pants pants = new Pants();

            pants.Hexagon      = Hexagon.Clone();
            pants.TestCircle   = TestCircle.Clone();
            pants.CircumCircle = CircumCircle.Clone();
            return(pants);
        }
Beispiel #3
0
        public void HexagonCloneTest()
        {
            Hexagon       shape      = new Hexagon();
            PrivateObject testTarget = new PrivateObject(shape);

            shape.SetStartPoint(x1, y1);
            shape.OnDrag(x2, y2);
            shape.SetStopPoint(x3, y3);
            Shape newShape = shape.Clone();

            shape.SetStopPoint(x2, y2);
            Assert.AreEqual("Hexagon", newShape.GetShapeName());
            Assert.AreEqual("Selected : Hexagon(100,100,300,300)", newShape.GetShapeInfo());
        }
Beispiel #4
0
        public Vector3D TinyOffset(int awayFromSeg)
        {
            // Center;
            Mobius   m    = MobiusToCenter;
            Vector3D p    = Hexagon.Center;
            Polygon  poly = Hexagon.Clone();

            poly.Transform(m);
            p = m.Apply(p);

            // Do the offset.
            p -= poly.Segments[awayFromSeg].Midpoint / 10;

            // Go back.
            p = m.Inverse().Apply(p);
            return(p);
        }
Beispiel #5
0
        public void SetupHexagonForKQ()
        {
            Polygon centralTile = new Polygon();

            centralTile.CreateRegular(7, 3);
            Vector3D vertex0 = centralTile.Segments[0].P1;

            CircleNE[] otherThreeSides = OtherThreeSides();
            CircleNE[] systoles        = SystolesForKQ();

            // Calc verts.
            List <Vector3D> verts = new List <Vector3D>();
            Vector3D        t1, t2;

            Euclidean2D.IntersectionCircleCircle(otherThreeSides[0], systoles[0], out t1, out t2);
            Vector3D intersection = t1.Abs() < 1 ? t1 : t2;

            verts.Add(intersection);
            intersection.Y *= -1;
            verts.Add(intersection);
            Mobius m = RotMobius(vertex0);

            verts.Add(m.Apply(verts[0]));
            verts.Add(m.Apply(verts[1]));
            verts.Add(m.Apply(verts[2]));
            verts.Add(m.Apply(verts[3]));

            // Setup all the segments.
            bool clockwise = true;

            Hexagon.Segments.AddRange(new Segment[]
            {
                Segment.Arc(verts[0], verts[1], otherThreeSides[0].Center, clockwise),
                Segment.Arc(verts[1], verts[2], systoles[1].Center, clockwise),
                Segment.Arc(verts[2], verts[3], otherThreeSides[1].Center, clockwise),
                Segment.Arc(verts[3], verts[4], systoles[2].Center, clockwise),
                Segment.Arc(verts[4], verts[5], otherThreeSides[2].Center, clockwise),
                Segment.Arc(verts[5], verts[0], systoles[0].Center, clockwise),
            });
            Hexagon.Center = vertex0;

            // Setup the test circle.
            m.Isometry(Geometry.Hyperbolic, 0, -vertex0);
            Polygon clone = Hexagon.Clone();

            clone.Transform(m);

            Circle temp = new Circle(
                clone.Segments[0].Midpoint,
                clone.Segments[2].Midpoint,
                clone.Segments[4].Midpoint);
            CircleNE tempNE = new CircleNE(temp, new Vector3D());

            tempNE.Transform(m.Inverse());
            TestCircle = tempNE;

            temp = new Circle(
                clone.Segments[0].P1,
                clone.Segments[1].P1,
                clone.Segments[2].P1);
            tempNE = new CircleNE(temp, new Vector3D());
            tempNE.Transform(m.Inverse());
            CircumCircle = tempNE;
        }