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); }
public Pants Clone() { Pants pants = new Pants(); pants.Hexagon = Hexagon.Clone(); pants.TestCircle = TestCircle.Clone(); pants.CircumCircle = CircumCircle.Clone(); return(pants); }
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()); }
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); }
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; }