Пример #1
0
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;
}
Пример #2
0
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
}
Пример #3
0
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
}
Пример #4
0
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
}