// Create a texture that hides the integer translation in the parametrization void line_texture(Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic> &texture_R, Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic> &texture_G, Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic> &texture_B) { unsigned size = 128; unsigned size2 = size/2; unsigned lineWidth = 3; texture_R.setConstant(size, size, 255); for (unsigned i=0; i<size; ++i) for (unsigned j=size2-lineWidth; j<=size2+lineWidth; ++j) texture_R(i,j) = 0; for (unsigned i=size2-lineWidth; i<=size2+lineWidth; ++i) for (unsigned j=0; j<size; ++j) texture_R(i,j) = 0; texture_G = texture_R; texture_B = texture_R; }
Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> Interpolation::generate_DEM(PointCloudElement* pElement, float post_spacing) { StepResource pStep("Generating DEM", "app", "ffe16048-1e58-11e4-b4be-b2227cce2b54"); ProgressResource pResource("ProgressBar"); Progress *pProgress = pResource.get(); pProgress-> setSettingAutoClose(true); Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> demRM;// dem stored in a Row major eigen matrix /* Main processing loop */ FactoryResource<PointCloudDataRequest> req; req->setWritable(true); PointCloudAccessor acc(pElement->getPointCloudAccessor(req.release())); if (!acc.isValid()) { interpolation_msg += "Unable to write to point cloud for generating DEM.\n"; pProgress->updateProgress("Unable to write to point cloud for generating DEM.", 0, ERRORS); pStep->finalize(Message::Abort, interpolation_msg); return demRM.matrix(); // in this way it should return NULL matrix, see http://eigen.tuxfamily.org/dox/classEigen_1_1Matrix.html: Matrix(): For dynamic-size matrices, creates an empty matrix of size 0. Does not allocate any array. Such a matrix is called a null matrix. This constructor is the unique way to create null matrices: resizing a matrix to 0 is not supported. } const PointCloudDataDescriptor* pDesc = static_cast<const PointCloudDataDescriptor*>(pElement->getDataDescriptor()); double xMin = pDesc->getXMin() * pDesc->getXScale() + pDesc->getXOffset(); double xMax = pDesc->getXMax() * pDesc->getXScale() + pDesc->getXOffset(); double yMin = pDesc->getYMin() * pDesc->getYScale() + pDesc->getYOffset(); double yMax = pDesc->getYMax() * pDesc->getYScale() + pDesc->getYOffset(); int mDim = static_cast<int>(std::ceil((xMax - xMin) / post_spacing)); //columns int nDim = static_cast<int>(std::ceil((yMax - yMin) / post_spacing)); //rows xMax = xMin + mDim * post_spacing; yMin = yMax - nDim * post_spacing; const float badVal = -9999.f; demRM.setConstant(nDim, mDim, badVal); int prog = 0; uint32_t adv = pDesc->getPointCount() / 100; for (size_t idx = 0; idx < pDesc->getPointCount(); ++idx) { if (!acc.isValid()) { interpolation_msg += "Unable to access data for generating DEM.\n"; pProgress->updateProgress("Unable to access data for generating DEM.", 0, ERRORS); pStep->finalize(Message::Abort, interpolation_msg); return demRM.matrix();// in this way it should return NULL matrix, see http://eigen.tuxfamily.org/dox/classEigen_1_1Matrix.html: Matrix(): For dynamic-size matrices, creates an empty matrix of size 0. Does not allocate any array. Such a matrix is called a null matrix. This constructor is the unique way to create null matrices: resizing a matrix to 0 is not supported. } if (idx % adv == 0) { pProgress->updateProgress("Generating DEM", ++prog, NORMAL); } if (!acc->isPointValid()) { acc->nextValidPoint(); continue; } double x = acc->getXAsDouble(true); double y = acc->getYAsDouble(true); float z = static_cast<float>(acc->getZAsDouble(true)); // calculate nearest DEM point int xIndex = std::max(0, static_cast<int>(std::floor((x - xMin) / post_spacing))); int yIndex = std::max(0, static_cast<int>(std::floor((yMax - y) / post_spacing))); float demVal = demRM(yIndex, xIndex); if (demVal == badVal || demVal < z) { demRM(yIndex, xIndex) = z; } acc->nextValidPoint(); } pProgress->updateProgress("DEM generation is complete.", 100, NORMAL); pStep->finalize(); return demRM; }