void PolyMolecule::computeNormals() { m_FaceNormals.fill(vec3_t(0,0,0), m_Faces.size()); m_NodeNormals.fill(vec3_t(0,0,0), m_Nodes.size()); for (int i = 0; i < m_Faces.size(); ++i) { QVector<vec3_t> x(m_Faces[i].size() + 1); vec3_t x_face(0,0,0); for (int j = 0; j < m_Faces[i].size(); ++j) { x[j] = getXNode(m_Faces[i][j]); x_face += x[j]; } x.last() = x.first(); x_face *= 1.0/m_Faces[i].size(); m_FaceNormals[i] = vec3_t(0,0,0); for (int j = 0; j < m_Faces[i].size(); ++j) { m_FaceNormals[i] += triNormal(x_face, x[j], x[j+1]); } for (int j = 0; j < m_Faces[i].size(); ++j) { vec3_t n = m_FaceNormals[i]; //n.normalise(); m_NodeNormals[m_Faces[i][j]] += n; } } for (int i = 0; i < m_Nodes.size(); ++i) { m_NodeNormals[i].normalise(); } }
void PolyMolecule::createPolyData(vtkPolyData *poly_data) { int N = m_Nodes.size(); EG_VTKSP(vtkPoints, points); points->SetNumberOfPoints(N); for (int i = 0; i < N; ++i) { vec3_t x = getXNode(i); points->SetPoint(i, x.data()); } poly_data->Allocate(m_Faces.size()); poly_data->SetPoints(points); for (int i = 0; i < m_Faces.size(); ++i) { QVector<vtkIdType> pts(m_Faces[i].size()); for (int j = 0; j < m_Faces[i].size(); ++j) { pts[j] = m_Faces[i][j]; } if (pts.size() == 3) { poly_data->InsertNextCell(VTK_TRIANGLE, pts.size(), pts.data()); } else if (pts.size() == 4) { poly_data->InsertNextCell(VTK_QUAD, pts.size(), pts.data()); } else { poly_data->InsertNextCell(VTK_POLYGON, pts.size(), pts.data()); } } }
void PolyMolecule::computeCentreOfGravity() { m_AllPositive = true; // first guess of centre of gravity vec3_t x_centre(0,0,0); for (int i = 0; i < m_Faces.size(); ++i) { x_centre += getXFace(i); } m_N2BadFaces.resize(m_Nodes.size()); for (int i = 0; i < m_Nodes.size(); ++i) { m_N2BadFaces[i].clear(); } x_centre *= 1.0/m_Faces.size(); for (int iter = 0; iter < 2; ++iter) { double V_total = 0; m_CentreOfGravity = vec3_t(0,0,0); m_MaxPyramidVolume = -1e99; m_MinPyramidVolume = 1e99; for (int i = 0; i < m_Faces.size(); ++i) { double V_pyramid = 0; vec3_t x_face = getXFace(i); QVector<vec3_t> x(m_Faces[i].size() + 1); for (int j = 0; j < m_Faces[i].size(); ++j) { x[j] = getXNode(m_Faces[i][j]); } x.last() = x.first(); for (int j = 0; j < m_Faces[i].size(); ++j) { double V = GeometryTools::tetraVol(x_face, x[j+1], x[j], x_centre, true); if (V <= 0) { m_AllPositive = false; } V_total += V; V_pyramid += V; m_CentreOfGravity += 0.25*V*(x_face + x[j+1] + x[j] + x_centre); } if (V_pyramid <= 0) { for (int j = 0; j < m_Faces[i].size(); ++j) { m_N2BadFaces[m_Faces[i][j]].insert(i); } } m_MaxPyramidVolume = max(V_pyramid, m_MaxPyramidVolume); m_MinPyramidVolume = min(V_pyramid, m_MinPyramidVolume); } m_CentreOfGravity *= 1.0/V_total; x_centre = m_CentreOfGravity; } }
void PolyMolecule::writeVtkFile(QString file_name) { EG_VTKSP(vtkUnstructuredGrid, grid); allocateGrid(grid, m_Faces.size(), m_Nodes.size()); EG_VTKSP(vtkDoubleArray, normals); normals->SetNumberOfComponents(3); normals->SetNumberOfTuples(m_Nodes.size()); normals->SetName("N"); EG_VTKSP(vtkDoubleArray, badness); badness->SetNumberOfComponents(1); badness->SetNumberOfTuples(m_Nodes.size()); badness->SetName("badness"); for (int i = 0; i < m_Nodes.size(); ++i) { vec3_t x = getXNode(i); grid->GetPoints()->SetPoint(i, x.data()); normals->SetTuple(i, m_NodeNormals[i].data()); badness->SetValue(i, double(m_N2BadFaces[i].size())); } grid->GetPointData()->AddArray(normals); grid->GetPointData()->AddArray(badness); for (int i = 0; i < m_Faces.size(); ++i) { QVector<vtkIdType> pts(m_Faces[i].size()); for (int j = 0; j < m_Faces[i].size(); ++j) { pts[j] = m_Faces[i][j]; } grid->InsertNextCell(VTK_POLYGON, m_Faces[i].size(), pts.data()); } EG_VTKSP(vtkXMLUnstructuredGridWriter, vtu); file_name = GuiMainWindow::pointer()->getCwd() + "/" + file_name + ".vtu"; vtu->SetFileName(qPrintable(file_name)); vtu->SetDataModeToBinary(); vtu->SetInputData(grid); vtu->Write(); }
gboolean loadConfig(const gchar *filename, CfgFile *lcfg) { /* Parse hosts.xml document. */ xmlDocPtr xcfg = xmlParseFile(filename); if(xcfg == NULL) return(FALSE); /* Handle Xincludes. */ xmlSetGenericErrorFunc(NULL, xmlErrIgnoreHandler); xmlXIncludeProcess(xcfg); handleXMLError( xmlGetLastError() ); xmlSetGenericErrorFunc(NULL, NULL); /* Validate against DTD. */ xmlValidCtxtPtr xval = xmlNewValidCtxt(); if(xmlValidateDocument(xval, xcfg) == 0) { xmlFreeValidCtxt(xval); return(FALSE); } xmlFreeValidCtxt(xval); /* Allocate XPath context. */ xmlXPathContextPtr xctx = xmlXPathNewContext(xcfg); if(!xctx) { g_error("%s: xmlXPathNewContext failed!\n", filename); return(FALSE); } xmlNodePtr s_ssh[2] = {getXNode(xctx, "/apt-dater/ssh"), NULL}; xmlNodePtr s_path[2] = {getXNode(xctx, "/apt-dater/paths"), NULL}; #ifdef FEAT_TMUX xmlNodePtr s_tmux[2] = {getXNode(xctx, "/apt-dater/tmux"), NULL}; #else xmlNodePtr s_screen[2] = {getXNode(xctx, "/apt-dater/screen"), NULL}; #endif xmlNodePtr s_appearance[2] = {getXNode(xctx, "/apt-dater/appearance"), NULL}; xmlNodePtr s_notify[2] = {getXNode(xctx, "/apt-dater/notify"), NULL}; xmlNodePtr s_hooks[2] = {getXNode(xctx, "/apt-dater/hooks"), NULL}; #ifdef FEAT_AUTOREF xmlNodePtr s_autoref[2] = {getXNode(xctx, "/apt-dater/auto-ref"), NULL}; #endif #ifdef FEAT_HISTORY xmlNodePtr s_history[2] = {getXNode(xctx, "/apt-dater/history"), NULL}; #endif #ifdef FEAT_TCLFILTER xmlNodePtr s_tclfilter[2] = {getXNode(xctx, "/apt-dater/tcl-filter"), NULL}; #endif lcfg->ssh_optflags = getXPropStr(s_ssh, "opt-cmd-flags", "-t"); lcfg->ssh_cmd = getXPropStr(s_ssh, "cmd", "/usr/bin/ssh"); lcfg->sftp_cmd = getXPropStr(s_ssh, "sftp-cmd", "/usr/bin/sftp"); lcfg->umask = getXPropInt(s_path, "umask", S_IRWXG | S_IRWXO); umask(lcfg->umask); lcfg->hostsfile = getXPropStr(s_path, "hosts-file", g_strdup_printf("%s/%s/%s", g_get_user_config_dir(), PROG_NAME, "hosts.xml")); lcfg->statsdir = getXPropStr(s_path, "stats-dir", g_strdup_printf("%s/%s/%s", g_get_user_cache_dir(), PROG_NAME, "stats")); if(g_mkdir_with_parents(lcfg->statsdir, S_IRWXU | S_IRWXG) == -1) { g_warning("Failed to create %s: %s", lcfg->statsdir, g_strerror(errno)); exit(1); } #ifdef FEAT_TMUX lcfg->tmuxconffile = getXPropStr(s_tmux, "conf-file", g_strdup_printf("%s/%s/%s", g_get_user_config_dir(), PROG_NAME, "tmux.conf")); lcfg->tmuxsockpath = getXPropStr(s_tmux, "socket-path", g_strdup_printf("%s/%s/%s", g_get_user_cache_dir(), PROG_NAME, "tmux")); if(g_mkdir_with_parents(lcfg->tmuxsockpath, S_IRWXU | S_IRWXG) == -1) { g_warning("Failed to create %s: %s", lcfg->tmuxsockpath, g_strerror(errno)); exit(1); } #else lcfg->screenrcfile = getXPropStr(s_screen, "rc-file", g_strdup_printf("%s/%s/%s", g_get_user_config_dir(), PROG_NAME, "screenrc")); lcfg->screentitle = getXPropStr(s_screen, "title", g_strdup("%m # %U%H")); #endif lcfg->ssh_agent = getXPropBool(s_ssh, "spawn-agent", FALSE); xmlNodeSetPtr s_addkeys = getXNodes(xctx, "/apt-dater/ssh/add-key"); if(!xmlXPathNodeSetIsEmpty(s_addkeys)) { lcfg->ssh_add = g_new0(char*, s_addkeys->nodeNr + 1); int i; for(i = 0; i < s_addkeys->nodeNr; i++) { lcfg->ssh_add[i] = g_strdup((gchar *)xmlGetProp(s_addkeys->nodeTab[i], BAD_CAST("name"))); xmlChar *c = xmlGetProp(s_addkeys->nodeTab[i], BAD_CAST("fn")); if(!c) { g_printerr(_("Empty SSH key filename (%s/@fn) in configuration."), xmlGetNodePath(s_addkeys->nodeTab[i])); exit(1); } lcfg->ssh_add[i] = g_strdup((gchar *)c); } lcfg->ssh_numadd = s_addkeys->nodeNr; }
vec3_t PolyMolecule::getXFace(int face) { vec3_t x(0,0,0); foreach (int i, m_Faces[face]) { x += getXNode(i); }