std::vector<MeshLib::Node*> RasterToMesh::createNodeVector( std::vector<double> const& elevation, std::vector<int> & node_idx_map, GeoLib::RasterHeader const& header, bool use_elevation) { std::size_t node_idx_count(0); double const x_offset(header.origin[0] - header.cell_size/2.0); double const y_offset(header.origin[1] - header.cell_size/2.0); std::vector<MeshLib::Node*> nodes; for (std::size_t i = 0; i < (header.n_rows+1); i++) for (std::size_t j = 0; j < (header.n_cols+1); j++) { std::size_t const index = i * (header.n_cols+1) + j; if (elevation[index] == std::numeric_limits<double>::max()) continue; double const zValue = (use_elevation) ? elevation[index] : 0; MeshLib::Node* node (new MeshLib::Node(x_offset + (header.cell_size * j), y_offset + (header.cell_size * i), zValue)); nodes.push_back(node); node_idx_map[index] = node_idx_count; node_idx_count++; } return nodes; }
MeshLib::Mesh* ConvertRasterToMesh::constructMesh(const double* pix_vals, const bool* vis_nodes) const { const size_t height = _raster.getNRows()+1; const size_t width = _raster.getNCols()+1; size_t node_idx_count(0); const double distance(_raster.getRasterPixelDistance()); const double x_offset(_raster.getOrigin()[0]); // - distance / 2.0); const double y_offset(_raster.getOrigin()[1]); // - distance / 2.0); const size_t size(height*width); int* node_idx_map(new int[size]); for (std::size_t k(0); k<size; ++k) node_idx_map[k] = -1; std::vector<MeshLib::Node*> nodes; std::vector<MeshLib::Element*> elements; for (size_t i = 0; i < height; i++) { for (size_t j = 0; j < width; j++) { const size_t index = i * width + j; // bool set_node(true); // bool set_node(false); // if (j == 0 && i == height) // set_node = vis_nodes[index]; // else if (j == 0) // set_node = (vis_nodes[index] || vis_nodes[index + height]); // else if (i == width) // set_node = (vis_nodes[index] || vis_nodes[index - 1]); // else set_node = (vis_nodes[index] || vis_nodes[index - 1] || vis_nodes[index + height] // || vis_nodes[index + height - 1]); // if (set_node) { double zValue = (_intensity_type == UseIntensityAs::ELEVATION) ? pix_vals[index] : _raster.getOrigin()[2]; MeshLib::Node* node(new MeshLib::Node(x_offset + (distance * j), y_offset + (distance * i), zValue)); nodes.push_back(node); node_idx_map[index] = node_idx_count; node_idx_count++; // } } } // set mesh elements for (size_t i = 0; i < _raster.getNRows(); i++) { for (size_t j = 0; j < _raster.getNCols(); j++) { const int index = i * width + j; if ((node_idx_map[index] != -1) && (node_idx_map[index + 1] != -1) && (node_idx_map[index + width] != -1) && (node_idx_map[index + width + 1] != -1) && (vis_nodes[index + width])) { const int mat = (_intensity_type != UseIntensityAs::MATERIAL) ? 0 : static_cast<int> (pix_vals[index + width]); if (_elem_type == MshElemType::TRIANGLE) { MeshLib::Node** tri1_nodes = new MeshLib::Node*[3]; tri1_nodes[0] = nodes[node_idx_map[index]]; tri1_nodes[1] = nodes[node_idx_map[index + 1]]; tri1_nodes[2] = nodes[node_idx_map[index + width]]; MeshLib::Node** tri2_nodes = new MeshLib::Node*[3]; tri2_nodes[0] = nodes[node_idx_map[index + 1]]; tri2_nodes[1] = nodes[node_idx_map[index + width + 1]]; tri2_nodes[2] = nodes[node_idx_map[index + width]]; elements.push_back(new MeshLib::Tri(tri1_nodes, mat)); // upper left triangle elements.push_back(new MeshLib::Tri(tri2_nodes, mat)); // lower right triangle } if (_elem_type == MshElemType::QUAD) { MeshLib::Node** quad_nodes = new MeshLib::Node*[4]; quad_nodes[0] = nodes[node_idx_map[index]]; quad_nodes[1] = nodes[node_idx_map[index + 1]]; quad_nodes[2] = nodes[node_idx_map[index + width + 1]]; quad_nodes[3] = nodes[node_idx_map[index + width]]; elements.push_back(new MeshLib::Quad(quad_nodes, mat)); } } } } delete [] node_idx_map; return new MeshLib::Mesh("RasterDataMesh", nodes, elements); // the name is only a temp-name, the name given in the dialog is set later }
MeshLib::Mesh* VtkMeshConverter::constructMesh(const double* pixVal, int* node_idx_map, const bool* visNodes, const double origin[3], const size_t &imgHeight, const size_t &imgWidth, const double &scalingFactor, MeshElemType elem_type, UseIntensityAs intensity_type) { const size_t incHeight = imgHeight+1; const size_t incWidth = imgWidth+1; size_t node_idx_count(0); const double x_offset(origin[0] - scalingFactor/2.0); const double y_offset(origin[1] - scalingFactor/2.0); std::vector<MeshLib::Node*> nodes; std::vector<MeshLib::Element*> elements; for (size_t i = 0; i < incWidth; i++) for (size_t j = 0; j < incHeight; j++) { const size_t index = i * incHeight + j; bool set_node (false); if (j==0 && i==imgWidth) set_node = visNodes[index]; else if (j==0) set_node = (visNodes[index] || visNodes[index+incHeight]); else if (i==imgWidth) set_node = (visNodes[index] || visNodes[index-1]); else set_node = (visNodes[index] || visNodes[index-1] || visNodes[index+incHeight] || visNodes[index+incHeight-1]); if (set_node) { double zValue = (intensity_type == UseIntensityAs::ELEVATION) ? pixVal[index] : 0; MeshLib::Node* node (new MeshLib::Node(x_offset + (scalingFactor * j), y_offset + (scalingFactor * i), zValue)); nodes.push_back(node); node_idx_map[index] = node_idx_count; node_idx_count++; } } MeshLib::Properties properties; boost::optional< MeshLib::PropertyVector<double>& > value_vec = properties.createNewPropertyVector<double>("Colour", MeshLib::MeshItemType::Cell, 1); // set mesh elements for (size_t i = 0; i < imgWidth; i++) for (size_t j = 0; j < imgHeight; j++) { int const index = i * incHeight + j; if ((node_idx_map[index]!=-1) && (node_idx_map[index+1]!=-1) && (node_idx_map[index+incHeight]!=-1) && (node_idx_map[index+incHeight+1]!=-1) && (visNodes[index+incHeight])) { if (elem_type == MeshElemType::TRIANGLE) { MeshLib::Node** tri1_nodes = new MeshLib::Node*[3]; tri1_nodes[0] = nodes[node_idx_map[index]]; tri1_nodes[1] = nodes[node_idx_map[index+1]]; tri1_nodes[2] = nodes[node_idx_map[index+incHeight]]; MeshLib::Node** tri2_nodes = new MeshLib::Node*[3]; tri2_nodes[0] = nodes[node_idx_map[index+1]]; tri2_nodes[1] = nodes[node_idx_map[index+incHeight+1]]; tri2_nodes[2] = nodes[node_idx_map[index+incHeight]]; elements.push_back(new MeshLib::Tri(tri1_nodes)); // upper left triangle elements.push_back(new MeshLib::Tri(tri2_nodes)); // lower right triangle if (intensity_type == UseIntensityAs::DATAVECTOR) { value_vec->push_back(pixVal[index+incHeight]); value_vec->push_back(pixVal[index+incHeight]); } } if (elem_type == MeshElemType::QUAD) { MeshLib::Node** quad_nodes = new MeshLib::Node*[4]; quad_nodes[0] = nodes[node_idx_map[index]]; quad_nodes[1] = nodes[node_idx_map[index + 1]]; quad_nodes[2] = nodes[node_idx_map[index + incHeight + 1]]; quad_nodes[3] = nodes[node_idx_map[index + incHeight]]; elements.push_back(new MeshLib::Quad(quad_nodes)); if (intensity_type == UseIntensityAs::DATAVECTOR) value_vec->push_back(pixVal[index+incHeight]); } } } if (elements.empty()) return nullptr; if (value_vec->empty()) properties.removePropertyVector("Colour"); boost::optional< MeshLib::PropertyVector<unsigned>& > materials = properties.createNewPropertyVector<unsigned>("MaterialIDs", MeshLib::MeshItemType::Cell, 1); materials->insert(materials->end(), elements.size(), 0); return new MeshLib::Mesh("RasterDataMesh", nodes, elements, properties); // the name is only a temp-name, the name given in the dialog is set later }
MeshLib::Mesh* VtkMeshConverter::constructMesh(const double* pixVal, int* node_idx_map, const bool* visNodes, const double origin[3], const size_t &imgHeight, const size_t &imgWidth, const double &scalingFactor, MeshElemType elem_type, UseIntensityAs intensity_type) { const size_t incHeight = imgHeight+1; const size_t incWidth = imgWidth+1; size_t node_idx_count(0); const double x_offset(origin[0] - scalingFactor/2.0); const double y_offset(origin[1] - scalingFactor/2.0); std::vector<MeshLib::Node*> nodes; std::vector<MeshLib::Element*> elements; for (size_t i = 0; i < incWidth; i++) for (size_t j = 0; j < incHeight; j++) { const size_t index = i * incHeight + j; bool set_node (false); if (j==0 && i==imgWidth) set_node = visNodes[index]; else if (j==0) set_node = (visNodes[index] || visNodes[index+incHeight]); else if (i==imgWidth) set_node = (visNodes[index] || visNodes[index-1]); else set_node = (visNodes[index] || visNodes[index-1] || visNodes[index+incHeight] || visNodes[index+incHeight-1]); if (set_node) { double zValue = (intensity_type == UseIntensityAs::ELEVATION) ? pixVal[index] : origin[2]; MeshLib::Node* node (new MeshLib::Node(x_offset + (scalingFactor * j), y_offset + (scalingFactor * i), zValue)); nodes.push_back(node); node_idx_map[index] = node_idx_count; node_idx_count++; } } // set mesh elements for (size_t i = 0; i < imgWidth; i++) for (size_t j = 0; j < imgHeight; j++) { const int index = i * incHeight + j; if ((node_idx_map[index]!=-1) && (node_idx_map[index+1]!=-1) && (node_idx_map[index+incHeight]!=-1) && (node_idx_map[index+incHeight+1]!=-1) && (visNodes[index+incHeight])) { const int mat = (intensity_type != UseIntensityAs::MATERIAL) ? 0 : static_cast<int>(pixVal[index+incHeight]); if (elem_type == MeshElemType::TRIANGLE) { MeshLib::Node** tri1_nodes = new MeshLib::Node*[3]; tri1_nodes[0] = nodes[node_idx_map[index]]; tri1_nodes[1] = nodes[node_idx_map[index+1]]; tri1_nodes[2] = nodes[node_idx_map[index+incHeight]]; MeshLib::Node** tri2_nodes = new MeshLib::Node*[3]; tri2_nodes[0] = nodes[node_idx_map[index+1]]; tri2_nodes[1] = nodes[node_idx_map[index+incHeight+1]]; tri2_nodes[2] = nodes[node_idx_map[index+incHeight]]; elements.push_back(new MeshLib::Tri(tri1_nodes, mat)); // upper left triangle elements.push_back(new MeshLib::Tri(tri2_nodes, mat)); // lower right triangle } if (elem_type == MeshElemType::QUAD) { MeshLib::Node** quad_nodes = new MeshLib::Node*[4]; quad_nodes[0] = nodes[node_idx_map[index]]; quad_nodes[1] = nodes[node_idx_map[index + 1]]; quad_nodes[2] = nodes[node_idx_map[index + incHeight + 1]]; quad_nodes[3] = nodes[node_idx_map[index + incHeight]]; elements.push_back(new MeshLib::Quad(quad_nodes, mat)); } } } if (elements.empty()) return nullptr; return new MeshLib::Mesh("RasterDataMesh", nodes, elements); // the name is only a temp-name, the name given in the dialog is set later }