コード例 #1
0
        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;
        }
コード例 #2
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;
            }
        }
コード例 #3
0
 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;
 }