27 #include <DGtal/base/Common.h>
28 #include <DGtal/helpers/StdDefs.h>
29 #include <DGtal/helpers/Shortcuts.h>
30 #include <DGtal/helpers/ShortcutsGeometry.h>
31 #include <DGtal/shapes/SurfaceMesh.h>
32 #include <DGtal/geometry/surfaces/DigitalSurfaceRegularization.h>
33 #include <DGtal/dec/PolygonalCalculus.h>
34 #include <DGtal/math/linalg/DirichletConditions.h>
36 #include <polyscope/polyscope.h>
37 #include <polyscope/surface_mesh.h>
38 #include <polyscope/point_cloud.h>
41 #include <Eigen/Dense>
42 #include <Eigen/Sparse>
44 using namespace DGtal;
66 DC::IntegerVector b = DC::IntegerVector::Zero( g.rows() );
70 std::cout<<
"Number of boundary edges= "<<boundaryEdges.size()<<std::endl;
74 for(
auto &e: boundaryEdges)
77 g(adjVertices.first) = pihVertex(adjVertices.first);
78 g(adjVertices.second) = pihVertex(adjVertices.second);
79 b(adjVertices.first) = 1;
80 b(adjVertices.second) = 1;
84 PolyDEC::Solver solver;
86 solver.compute( L_dirichlet );
87 ASSERT(solver.info()==Eigen::Success);
88 PolyDEC::Form g_dirichlet = DC::dirichletVector(
L, g, b, g );
89 PolyDEC::Form x_dirichlet = solver.solve( g_dirichlet );
90 PolyDEC::Form u = DC::dirichletSolution( x_dirichlet, b, g );
93 psMesh->addVertexScalarQuantity(
"g", g);
94 psMesh->addVertexScalarQuantity(
"u", u);
99 ImGui::SliderFloat(
"Phi scale", &scale, 0., 10.);
100 if(ImGui::Button(
"Compute Laplace problem"))
106 auto params = SH3::defaultParameters() | SHG3::defaultParameters() | SHG3::parametersGeometryEstimation();
109 params(
"polynomial",
"0.1*y*y -0.1*x*x - 2.0*z" )(
"gridstep", h );
110 auto implicit_shape = SH3::makeImplicitShape3D ( params );
111 auto digitized_shape = SH3::makeDigitizedImplicitShape3D( implicit_shape, params );
112 auto K = SH3::getKSpace( params );
113 auto binary_image = SH3::makeBinaryImage( digitized_shape, params );
115 auto primalSurface = SH3::makePrimalSurfaceMesh(
surface);
118 std::vector<std::vector<SH3::SurfaceMesh::Vertex>> faces;
119 std::vector<RealPoint> positions = primalSurface->positions();
120 for(
auto face= 0 ; face < primalSurface->nbFaces(); ++face)
121 faces.push_back(primalSurface->incidentVertices( face ));
127 psMesh = polyscope::registerSurfaceMesh(
"digital surface", positions, faces);
Aim: A helper class to solve a system with Dirichlet boundary conditions.
Implements differential operators on polygonal surfaces from .
SparseMatrix globalLaplaceBeltrami(const double lambda=1.0) const
Aim: This class is used to simplify shape and surface creation. With it, you can create new shapes an...
Aim: This class is used to simplify shape and surface creation. With it, you can create new shapes an...
CountedPtr< SH3::DigitalSurface > surface
CountedPtr< SH3::BinaryImage > binary_image
SurfaceMesh< RealPoint, RealVector > SurfMesh
polyscope::SurfaceMesh * psMesh
Shortcuts< Z3i::KSpace > SH3
ShortcutsGeometry< Z3i::KSpace > SHG3
DGtal is the top-level namespace which contains all DGtal functions and types.
Aim: Represents an embedded mesh as faces and a list of vertices. Vertices may be shared among faces ...
RealPoint & position(Vertex v)
Edges computeManifoldBoundaryEdges() const
VertexPair edgeVertices(Edge e) const
K init(Point(0, 0, 0), Point(512, 512, 512), true)
EigenLinearAlgebraBackend::SparseMatrix SparseMatrix