17 for(
const auto& entry :
mesh.simplices())
19 const auto vertices=entry.second->vertexPositionMatrix();
20 std::vector<Eigen::Vector2d> points;
23 for(
int j=
i+1;
j<4;++
j)
25 const double a=(
vertices.col(
i)-plane.P).dot(plane.unitNormal);
26 const double b=(
vertices.col(
j)-plane.P).dot(plane.unitNormal);
37 Eigen::Vector2d center=Eigen::Vector2d::Zero();
38 for(
const auto& point : points)
40 center+=point/double(points.size());
42 std::sort(points.begin(),points.end(),[&](
const auto&
a,
const auto&
b)
44 return std::atan2(a.y()-center.y(),a.x()-center.x())<std::atan2(b.y()-center.y(),b.x()-center.x());
46 for(
size_t k=0;
k<points.size();++
k)
48 const Eigen::Vector2d
a=points[
k]-center;
49 const Eigen::Vector2d
b=points[(
k+1)%points.size()]-center;
78 const double scale=14693.56435087598;
80 scale*Eigen::Matrix3d::Identity(),Eigen::Vector3d::Zero(),{});
82 const Eigen::Vector3d
a(-4724.304124390713,15395.35594008324,0);
83 const Eigen::Vector3d
b(6756.931196017786,15784.62596385352,0);
84 const Eigen::Vector3d
c(-4183.466787360541,11902.59340322532,3411.985017726859);
87 for(
const double maxArea : {1.e6,2.e5})
89 require(std::abs(
check(
mesh,plane,maxArea)-expected)<1.e-8*expected,
"Section area differs from tetrahedron cuts");
92 "Outside plane should produce an empty section");
94 Eigen::Matrix3d::Identity(),Eigen::Vector3d::Zero(),{});
95 const Eigen::Vector3d center=0.5*(cube.xMin()+cube.xMax());
98 const double boxArea=(cube.xMax().
y()-cube.xMin().y())*(cube.xMax().
z()-cube.xMin().z());
99 require(std::abs(gbArea-boxArea)<1.e-9,
"Coincident internal face duplicated or missing");
101 -(cube.xMax().x()-cube.xMin().x())*(cube.xMax().y()-cube.xMin().y()))<1.e-9,
"External coincident face missing");
108 catch(
const std::invalid_argument&)
112 require(rejected,
"Zero mesh area accepted");
113 std::cout<<
"PASS: non-convex field plane, area, refinement, outside and coincident cuts\n";
115 catch(
const std::exception& error)
117 std::cerr<<error.what()<<
'\n';