public Disc(FundamentalRegion region, Bitmap bitmap, bool isInverting) { this.fundamentalRegion = region; this.isInverting = isInverting; currentFace = new Face(fundamentalRegion); // TBD fix extra face bug when centered initialFace = currentFace; // texture GL.Hint(HintTarget.PerspectiveCorrectionHint, HintMode.Nicest); texture = CreateTexture(bitmap); int r = 0, g = 0, b = 0; int size = bitmap.Width * bitmap.Height; int skip = 16; size = 0; for (int i = 0; i < bitmap.Width; i += skip) { for (int j = 0; j < bitmap.Height; j += skip) { Color color = bitmap.GetPixel(i, j); r += color.R; g += color.G; b += color.B; size++; } } r /= size; g /= size; b /= size; backgroundColor = Color.FromArgb(r, g, b); drawCount = 1; totalDraw = 0; }
/* * ----/ vertex * ---- / * spine ---- / * ---- | halfEdge * ---- interior | * ---- | * center --------------------------- edgeCenter * dualEdge * * 08 * 09 07 * 10 14 06 * 11 12 13 05 * 00 01 02 03 04 * */ public Face(FundamentalRegion region) { this.region = region; this.center = Complex.Zero; p = region.P; isFlipped = false; Mobius increment = Mobius.CreateRotation(2 * Math.PI / p); Complex midvertex = region.P1; Edge edge = new Edge( this, region.C, midvertex, increment.Inverse * midvertex ); mesh = region.Mesh.Points; edges = new Edge[p]; vertices = new Complex[p]; edgeCenters = new Complex[p]; halfEdgePoints = new Complex[2 * p][]; spinePoints = new Complex[p][]; dualEdgePoints = new Complex[p][]; interiorPoints = new Complex[2 * p][]; Mobius rotation = Mobius.Identity; for (int i = 0; i < p; i++) { edges[i] = rotation * edge; dualEdgePoints[i] = new Complex[meshInternalCount]; dualEdgePoints[i][0] = rotation * mesh[1]; dualEdgePoints[i][1] = rotation * mesh[2]; dualEdgePoints[i][2] = rotation * mesh[3]; edgeCenters[i] = rotation * mesh[4]; halfEdgePoints[i] = new Complex[meshInternalCount]; halfEdgePoints[i][0] = rotation * mesh[5]; halfEdgePoints[i][1] = rotation * mesh[6]; halfEdgePoints[i][2] = rotation * mesh[7]; halfEdgePoints[i + p] = new Complex[meshInternalCount]; halfEdgePoints[i + p][0] = rotation * mesh[5].Conjugate; halfEdgePoints[i + p][1] = rotation * mesh[6].Conjugate; halfEdgePoints[i + p][2] = rotation * mesh[7].Conjugate; vertices[i] = rotation * mesh[8]; spinePoints[i] = new Complex[meshInternalCount]; spinePoints[i][0] = rotation * mesh[9]; spinePoints[i][1] = rotation * mesh[10]; spinePoints[i][2] = rotation * mesh[11]; interiorPoints[i] = new Complex[meshInternalCount]; interiorPoints[i][0] = rotation * mesh[12]; interiorPoints[i][1] = rotation * mesh[13]; interiorPoints[i][2] = rotation * mesh[14]; interiorPoints[i + p] = new Complex[meshInternalCount]; interiorPoints[i + p][0] = rotation * mesh[12].Conjugate; interiorPoints[i + p][1] = rotation * mesh[13].Conjugate; interiorPoints[i + p][2] = rotation * mesh[14].Conjugate; rotation = rotation * increment; } }
Face(FundamentalRegion region, Edge[] edges, Complex center, Complex[] vertices, Complex[] edgeCenters, Complex[][] halfEdges, Complex[][] spines, Complex[][] dualEdges, Complex[][] interiors, bool isFlipped) { this.region = region; this.edges = edges; this.center = center; this.vertices = vertices; this.edgeCenters = edgeCenters; this.halfEdgePoints = halfEdges; this.spinePoints = spines; this.dualEdgePoints = dualEdges; this.interiorPoints = interiors; this.isFlipped = isFlipped; p = region.P; mesh = region.Mesh.Points; }