diff --git a/MeshLib/ConvertRasterToMesh.cpp b/MeshLib/ConvertRasterToMesh.cpp index 9c9d24306747f7b34df14f9c02fe37249151d55b..e6fc470c8ee7dbaf4f612539b4826605e9468022 100644 --- a/MeshLib/ConvertRasterToMesh.cpp +++ b/MeshLib/ConvertRasterToMesh.cpp @@ -34,46 +34,43 @@ MeshLib::Mesh* ConvertRasterToMesh::execute() const const size_t size(height*width); double* pix_vals(new double[size]); bool* vis_nodes(new bool[size]); - int* node_idx_map(new int[size]); // determine a valid value for substitution of no data values - double substitution (getExistingValue(_raster.begin(), _raster.end())); + double substitution(getExistingValue(_raster.begin(), _raster.end())); - for (size_t j = 0; j < _raster.getNRows(); j++) { + // fill first row with non visual nodes + for (size_t j = 0; j < _raster.getNCols(); j++) { pix_vals[j] = 0; vis_nodes[j] = false; - node_idx_map[j] = -1; } GeoLib::Raster::const_iterator raster_it(_raster.begin()); - for (size_t i = 0; i < _raster.getNCols(); i++) { - for (size_t j = 0; j < _raster.getNRows(); ++j) { - const size_t index = (i + 1) * height + j; + for (size_t i = 0; i < _raster.getNRows(); ++i) { + for (size_t j = 0; j < _raster.getNCols(); ++j) { + const size_t index = (i+1) * width + j; if (*raster_it == _raster.getNoDataValue()) { - vis_nodes[index] = false; pix_vals[index] = substitution; + vis_nodes[index] = false; } else { - pix_vals[index] = *raster_it; // img[img_idx]; + pix_vals[index] = *raster_it; vis_nodes[index] = true; } ++raster_it; - node_idx_map[index] = -1; } - pix_vals[(i + 2) * height - 1] = 0; - vis_nodes[(i + 2) * height - 1] = false; - node_idx_map[(i + 2) * height - 1] = -1; + // fill last column with non-visual nodes + pix_vals[(i + 2) * width - 1] = 0; + vis_nodes[(i + 2) * width - 1] = false; } - MeshLib::Mesh* mesh = constructMesh(pix_vals, node_idx_map, vis_nodes); + MeshLib::Mesh* mesh = constructMesh(pix_vals, vis_nodes); delete [] pix_vals; delete [] vis_nodes; - delete [] node_idx_map; return mesh; } -MeshLib::Mesh* ConvertRasterToMesh::constructMesh(const double* pix_vals, int* node_idx_map, const bool* vis_nodes) const +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; @@ -82,24 +79,28 @@ MeshLib::Mesh* ConvertRasterToMesh::constructMesh(const double* pix_vals, int* n 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 < width; i++) { - for (size_t j = 0; j < height; j++) { - const size_t index = i * height + j; - - bool set_node(false); - if (j == 0 && i == width) - 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) { + 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 @@ -107,29 +108,30 @@ MeshLib::Mesh* ConvertRasterToMesh::constructMesh(const double* pix_vals, int* n nodes.push_back(node); node_idx_map[index] = node_idx_count; node_idx_count++; - } +// } } } // set mesh elements - for (size_t i = 0; i < _raster.getNCols(); i++) { - for (size_t j = 0; j < _raster.getNRows(); j++) { - const int index = i * height + j; + 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 + height] != -1) && (node_idx_map[index - + height + 1] != -1) && (vis_nodes[index + height])) { + && (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 + height]); + : 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 + height]]; + 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 + height + 1]]; - tri2_nodes[2] = nodes[node_idx_map[index + height]]; + 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 @@ -138,13 +140,14 @@ MeshLib::Mesh* ConvertRasterToMesh::constructMesh(const double* pix_vals, int* n 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 + height + 1]]; - quad_nodes[3] = nodes[node_idx_map[index + height]]; + 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 } diff --git a/MeshLib/ConvertRasterToMesh.h b/MeshLib/ConvertRasterToMesh.h index 9289fb5e4bb892bb63123da3833598bceb633760..c01964111914255b1fedba11d81aa849b8e2d994 100644 --- a/MeshLib/ConvertRasterToMesh.h +++ b/MeshLib/ConvertRasterToMesh.h @@ -24,7 +24,9 @@ namespace MeshLib { // forward declaration class Mesh; -/// Selection of possible interpretations for intensities +/** + * Struct gives a selection of possible interpretations for intensities + */ struct UseIntensityAs { enum type { @@ -35,7 +37,7 @@ struct UseIntensityAs }; /** - * Class to convert raster data into meshes. + * Class to convert raster data into meshes. Based on Karsten Rinks algorithm. */ class ConvertRasterToMesh { public: @@ -45,7 +47,7 @@ public: MeshLib::Mesh* execute() const; private: double getExistingValue(GeoLib::Raster::const_iterator beg, GeoLib::Raster::const_iterator last) const; - MeshLib::Mesh* constructMesh(const double* pix_vals, int* node_idx_map, const bool* vis_nodes) const; + MeshLib::Mesh* constructMesh(const double* pix_vals, const bool* vis_nodes) const; GeoLib::Raster const& _raster; MshElemType::type _elem_type; UseIntensityAs::type _intensity_type; diff --git a/Utils/SimpleMeshCreation/createMeshElemPropertiesFromASCRaster.cpp b/Utils/SimpleMeshCreation/createMeshElemPropertiesFromASCRaster.cpp index aa504c197e5b005434ad8e21b2f9515af354c892..a3bb19ba43bb2a2ad7f66b944c61491aff479f3b 100644 --- a/Utils/SimpleMeshCreation/createMeshElemPropertiesFromASCRaster.cpp +++ b/Utils/SimpleMeshCreation/createMeshElemPropertiesFromASCRaster.cpp @@ -106,23 +106,9 @@ int main (int argc, char* argv[]) std::cout << "variance of source: " << src_varianz << std::endl; } -// double spacing(raster->getRasterPixelDistance()); -// double *raster_with_alpha(new double[raster->getNRows() * raster->getNCols()]); -// raster_it = raster->begin(); -// for (std::size_t k(0); k<raster->getNRows() * raster->getNCols(); k++) { -// raster_with_alpha[k] = *raster_it; -// ++raster_it; -// } - -// double origin[3] = {raster->getOrigin()[0] + spacing/2.0, raster->getOrigin()[1] + spacing/2.0, raster->getOrigin()[2]}; -// MeshLib::Mesh* src_mesh (VtkMeshConverter::convertImgToMesh(raster_with_alpha, origin, raster->getNCols(), raster->getNRows(), -// spacing, MshElemType::QUAD, UseIntensityAs::MATERIAL)); - MeshLib::Mesh* src_mesh(MeshLib::ConvertRasterToMesh(*raster, MshElemType::QUAD, MeshLib::UseIntensityAs::MATERIAL).execute()); -// delete [] raster_with_alpha; - std::vector<size_t> src_perm(n_cols*n_rows); for (size_t k(0); k<n_cols*n_rows; k++) src_perm[k] = k; BaseLib::Quicksort<double>(src_properties, 0, n_cols*n_rows, src_perm);