⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gm_vizp.cpp

📁 算断裂的
💻 CPP
📖 第 1 页 / 共 2 页
字号:
            for (unsigned int subsetmask = 0;       subsetmask < (1 << (fdim + 1));      ++subsetmask) {        selected_verts.resize(0);        for (int j = 0; j < fdim + 1; ++j) {          if (subsetmask & (1<<j)) selected_verts.push_back(j);        }        if (selected_verts.size() != dim + 1) continue;        for (Brep::FaceIndex faceind = 0; faceind < levsize; ++faceind) {          Brep::Face_Spec fspec(fdim, faceind);          int nmf = sc.num_meshface_on_face(fspec);                              // Get all the subfaces with the selected vertices.                    for (int seqno = 0; seqno < nmf; ++seqno) {            for (int l = 0; l < dim + 1; ++l) {              SimpComplex::VertexGlobalIndex vnum =                 sc.node_of_meshface_on_face(fspec, seqno, selected_verts[l]);              key.verts[l] = sc.global_to_ordinal(vnum);            }            key.sort();            if (faces_drawn[key] == 0) {              faces_drawn[key] = 1;              Colorspec cspec = colortable[fspec];              for (int l1 = 0; l1 < dim + 1; ++l1) {                outputsimps.push_back(key.verts[l1]);              }              colors.push_back(cspec);            }          }        }      }    }      int outputcount = outputsimps.size() / (dim + 1);    IntMatrix faces(outputcount, dim + 1);    Matrix colorso(outputcount, 4);    int pos = 0;    for (int ocount = 0; ocount < outputcount; ++ocount) {      for (int l = 0; l < dim + 1; ++l) {        faces(ocount, l) = outputsimps[pos++];      }      for (int cc = 0; cc < 4; ++cc) {        colorso(ocount, cc) = colors[ocount].co[cc];      }    }    return Vizp_data(vc, faces, colorso);  }      // ------------------------------------------------------------------  // This routine is for extracting coordinates and simplices  // from a brep.  The routine generates only straight segments  // and triangles, so curved objects are approximated via subdivision.  // The argument beziersub determines how many pieces to  // in which to subdivide.  Vizp_data get_pts_simps(const Brep& g,     const vector<Real>& default_color,    int dim,     int beziersub) {    int di = g.embedded_dim();    Point::init_static_data(di);    int gdim = g.gdim();    if (dim > gdim || dim < 0)      throw_error("dim argument out of range in get_pts_simps");    if (default_color.size() != 4)      throw_error("Wrong color length in get_pts_simps");    if (beziersub < 0 || beziersub > 10000)      throw_error("Beziersub out of range in get_pts_simps");    Point realcoord;    Point paramcoord;    int pcount = 0;    vector<Real> pt_coords;    vector<int> simp_vtx;    vector<Colorspec> colors;    for (Brep::Face_Spec_Loop_Over_Faces_Of_Dim fspec(g, dim);    fspec.notdone();    ++fspec) {      Colorspec facecolor = parse_color_propval(g,fspec);      if (facecolor.co[0] < 0) {        for (int j = 0; j < 4; ++j)          facecolor.co[j] = default_color[j];      }      for (Brep::Loop_over_patches_of_face patch(g, fspec);      patch.notdone();      ++patch) {        int pbase = pcount;        if (dim == 0) {          Brep::ControlPointIndex cpi = patch.control_point(0);            for (int i = 0; i < di; ++i)            pt_coords.push_back(g.control_point(cpi,i));          ++pcount;                simp_vtx.push_back(pbase);          colors.push_back(facecolor);        }        else if (dim == 1) {          int subdiv = (patch.degree1() == 1)? 1 : beziersub;          for (int vcount = 0; vcount <= subdiv; ++vcount) {            paramcoord[0] = static_cast<double>(vcount) /              static_cast<double>(subdiv);            realcoord = g.patchmath(fspec, patch.index()).              get_real_point(paramcoord);            for (int i = 0; i < di; ++i)              pt_coords.push_back(realcoord[i]);            ++pcount;          }          for (int sub = 0; sub < subdiv; ++sub) {            simp_vtx.push_back(pbase + sub);            simp_vtx.push_back(pbase + sub + 1);            colors.push_back(facecolor);          }        }        else if (dim == 2) {          if (patch.ptype() == BEZIER_TRIANGLE) {            int subdiv = (patch.degree1() == 1)? 1 : beziersub;            {              for (int rownum = 0; rownum <= subdiv; ++rownum) {                for (int colnum = 0; colnum <= rownum; ++colnum) {                  paramcoord[0] = static_cast<double>(colnum) /                     static_cast<double>(subdiv);                  paramcoord[1] = static_cast<double>(rownum-colnum) /                    static_cast<double>(subdiv);                  realcoord = g.patchmath(fspec, patch.index()).                    get_real_point(paramcoord);                  for (int i = 0; i < di; ++i)                    pt_coords.push_back(realcoord[i]);                  ++pcount;                }              }            }            int sub = 0;            {              for (int rownum = 0; rownum < subdiv; ++rownum) {                for (int colnum = 0; colnum <= rownum; ++colnum) {                  simp_vtx.push_back(pbase + sub);                  simp_vtx.push_back(pbase + sub + rownum + 1);                  simp_vtx.push_back(pbase + sub + rownum + 2);                  colors.push_back(facecolor);                  if (rownum < subdiv - 1) {                    simp_vtx.push_back(pbase + sub + rownum + 2);                    simp_vtx.push_back(pbase + sub + rownum + 1);                    simp_vtx.push_back(pbase + sub + 2 * rownum + 4);                    colors.push_back(facecolor);                  }                  ++sub;                }              }            }          }          else { //patchtype == QUAD            int subdiv1 = beziersub;            int subdiv2 = beziersub;            {              for (int rownum = 0; rownum <= subdiv2; ++rownum) {                for (int colnum = 0; colnum <= subdiv1; ++colnum) {                  paramcoord[0] = static_cast<double>(colnum) /                     static_cast<double>(subdiv1);                  paramcoord[1] = static_cast<double>(rownum) /                    static_cast<double>(subdiv2);                  realcoord = g.patchmath(fspec, patch.index()).                    get_real_point(paramcoord);                  for (int i = 0; i < di; ++i)                    pt_coords.push_back(realcoord[i]);                  ++pcount;                }              }            }            {              for (int rownum = 0; rownum < subdiv2; ++rownum) {                for (int colnum = 0; colnum < subdiv1; ++colnum) {                  int startpoint = colnum + (rownum * (subdiv1 + 1));                  simp_vtx.push_back(pbase + startpoint);                  simp_vtx.push_back(pbase + startpoint + subdiv1 + 2);                  simp_vtx.push_back(pbase + startpoint + subdiv1 + 1);                  simp_vtx.push_back(pbase + startpoint);                  simp_vtx.push_back(pbase + startpoint + 1);                  simp_vtx.push_back(pbase + startpoint + subdiv1 + 2);                  for (int c0 = 0; c0 < 2; ++c0) {                    colors.push_back(facecolor);                  }                }              }            }          }        }      }    }    int numsimp = simp_vtx.size() / (dim + 1);#ifdef DEBUGGING    if (pt_coords.size() != pcount * di ||      simp_vtx.size() != numsimp * (dim + 1) ||      colors.size() != numsimp)      throw_error("Array size error in gm_vizp");#endif    int pos = 0;    Matrix coord(pcount,di);    for (int j1 = 0; j1 < pcount; ++j1)      for (int d = 0; d < di; ++d)        coord(j1,d) = pt_coords[pos++];    int pos1 = 0;    IntMatrix simpv(numsimp, dim + 1);    Matrix colorm(numsimp, 4);    for (int j2 = 0; j2 < numsimp; ++j2) {      for (int d = 0; d < dim + 1; ++d)        simpv(j2, d) = simp_vtx[pos1++];      for (int c = 0; c < 4; ++c)        colorm(j2, c) = colors[j2].co[c];    }    return Vizp_data(coord, simpv, colorm);  }  #define GM_ROUTINE_NAME gm_vizp#define GM_ROUTINE_NAME_Q "gm_vizp"  // ------------------------------------------------------------------  // This is the driver for gm_vizp and is a standard driver.    static void worker(const QMG::FrontEnd::ArgValType& argvalhandle,    QMG::FrontEnd::ReturnValType& returnvalhandle,    QMG::FrontEnd::Interpreter& interp) {        using namespace QMG;    using namespace QMG::FrontEnd;        argvalhandle.verify_nargin(4, 5, GM_ROUTINE_NAME_Q);    returnvalhandle.verify_nargout(3,3, GM_ROUTINE_NAME_Q);    // possible calling sequences:    // gm_vizp(brep, default_color, dim, bezier_sub)    // gm_vizp(simpcomp, default_color, dim, unused)    // gm_vizp(simpcomp, brep, default_color, dim, unused)    if (argvalhandle.nargin() == 4) {      Object_Type_Code code = argvalhandle.determine_argument_type(0);      if (code == UNKNOWN)        throw_error("Argument 0 could not be interpreted as brep or simpcomplex");            if (code == BREP) {              Vizp_data vizpdata = get_pts_simps(argvalhandle.get_brep(0),           argvalhandle.get_vector_double(1),          argvalhandle.get_int(2),           argvalhandle.get_int(3));        returnvalhandle.put_matrix(0, vizpdata.coords);        returnvalhandle.put_intmatrix(1, vizpdata.simps);        returnvalhandle.put_matrix(2, vizpdata.colors);        return;      }      else {              Vizp_data vizpdata = get_pts_simps(argvalhandle.get_simpcomp(0),           argvalhandle.get_vector_double(1),          argvalhandle.get_int(2));         returnvalhandle.put_matrix(0, vizpdata.coords);        returnvalhandle.put_intmatrix(1, vizpdata.simps);        returnvalhandle.put_matrix(2, vizpdata.colors);        return;      }    }     else { // nargin = 5      Vizp_data vizpdata = get_pts_simps(argvalhandle.get_simpcomp(0),        argvalhandle.get_brep(1),        argvalhandle.get_vector_double(2),        argvalhandle.get_int(3));      returnvalhandle.put_matrix(0, vizpdata.coords);      returnvalhandle.put_intmatrix(1, vizpdata.simps);      returnvalhandle.put_matrix(2, vizpdata.colors);    }    return;  }}#include "gm_entrypoint.cpp"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -