// ============================================================================= std::vector<mesh::edge_data> mesh_tri:: compute_edge_data_() const { #ifdef NOSH_TEUCHOS_TIME_MONITOR // timer for this routine Teuchos::TimeMonitor tm(*compute_edge_data_time_); #endif moab::Range cells = this->mbw_->get_entities_by_dimension(0, 2); size_t num_cells = cells.size(); size_t num_edges = relations_.edge_vertices.size(); std::vector<edge_data> _edge_data(num_edges); // compute all coordinates std::vector<Eigen::Vector3d> edge_coords(num_edges); for (size_t k = 0; k < num_edges; k++) { auto tmp1 = std::get<0>(relations_.edge_vertices[k]); std::vector<double> coords0 = this->mbw_->get_coords({tmp1}); tmp1 = std::get<1>(relations_.edge_vertices[k]); std::vector<double> coords1 = this->mbw_->get_coords({tmp1}); edge_coords[k][0] = coords0[0] - coords1[0]; edge_coords[k][1] = coords0[1] - coords1[1]; edge_coords[k][2] = coords0[2] - coords1[2]; _edge_data[k].length = edge_coords[k].norm(); } // Compute the contributions cell by cell. for (size_t k = 0; k < num_cells; k++) { const std::vector<size_t> edge_idxs = { this->local_index(relations_.cell_edges[k][0]), this->local_index(relations_.cell_edges[k][1]), this->local_index(relations_.cell_edges[k][2]) }; const std::vector<Eigen::Vector3d> local_edge_coords = { edge_coords[edge_idxs[0]], edge_coords[edge_idxs[1]], edge_coords[edge_idxs[2]] }; Eigen::VectorXd edge_coeffs = edge_coefficients_numerically_(local_edge_coords); // Fill the edge coefficients into the vector. for (int i = 0; i < edge_coeffs.size(); i++) { const size_t edge_idx = this->local_index(relations_.cell_edges[k][i]); // const int edge_id = this->liddd _edge_data[edge_idx].covolume += edge_coeffs[i] * _edge_data[edge_idx].length; } } return _edge_data; }
// find the intersection with the sphere static vec sphere_coords(GLdouble mx, GLdouble my) { GLdouble ax,ay,az; gluUnProject(mx,my,0,ab_glm,ab_glp,ab_glv,&ax,&ay,&az); vec m = vec((float)ax,(float)ay,(float)az) - ab_eye; // mouse position represents ray: eye + t*m // intersecting with a sphere centered at the origin GLfloat a = m*m; GLfloat b = (ab_eye*m); GLfloat root = (b*b) - a*(ab_zoom2 - ab_sphere2); if(root <= 0) return edge_coords(m); GLfloat t = (0.0 - b - sqrt(root)) / a; return (ab_eye+(m*t)).unit(); }