public CrossBoundaryBrushes(Mesh _mesh, Option _opt)
        {
            this.mesh = _mesh;
            this.opt = _opt;
            this.regionNum = opt.NumberOfIsolines;

            // initialize triareas
            int fn = mesh.FaceCount, vn = mesh.VertexCount;
            this.triArea = new double[fn];
            for (int i = 0; i < fn; ++i)
            {
                triArea[i] = mesh.ComputeFaceArea(i);
            }
            this.colorInterpolater = new ColorInterpolater();
            this.vrtDisplayColor = new double[vn * 3];
            this.triDisplayColor = new double[fn * 3];
            this.linesOnFace = new List<int>[fn];
            for (int i = 0; i < fn; ++i)
            {
                this.linesOnFace[i] = new List<int>();
            }

            // --- for patch -type --
            this.fnode = new GraphNode[fn];
            this.vnode = new GraphNode[vn];
            for (int i = 0; i < fn; ++i) fnode[i] = new GraphNode(i, -1);
            for (int i = 0; i < vn; ++i) vnode[i] = new GraphNode(i, -1);

            // --- initialize sampling ---
            this.finalFaceRec = new IsoFaceRec[fn];
            for (int i = 0; i < fn; ++i)
            {
                finalFaceRec[i] = new IsoFaceRec();
                finalFaceRec[i].index = i;
            }

            this.ShowCuts = true;
            this.patchid = new byte[fn];
            this.user_operation_stack = new Stack<bool>();
        }
 public FaceRecord(IsoFaceRec r, PQPairs _pq)
 {
     face = r;
     pq = _pq;
 }