8#include <kernel/geometry/atlas/chart.hpp>
49 template<
typename Mesh_>
51 public ChartCRTP<Circle<Mesh_>, Mesh_, CircleTraits>
140 _midpoint.set_mat_vec_mult(rot, tmp) += offset;
157 CoordType distance(grad_dist.norm_euclid());
159 if(distance < Math::eps<CoordType>())
182 grad_dist = (projected - point);
183 CoordType my_dist(grad_dist.norm_euclid());
184 grad_dist.normalize();
203 if(my_dist < Math::eps<CoordType>())
212 grad_dist.normalize();
220 auto& vtx = mesh.get_vertex_set();
221 const auto& target_vtx = meshpart.template get_target_set<0>();
243 point[0] = this->_midpoint[0] + this->_radius *
Math::cos(x);
244 point[1] = this->_midpoint[1] + this->_radius *
Math::sin(x);
254 virtual void write(std::ostream& os,
const String& sindent)
const override
256 os << sindent <<
"<Circle";
257 os <<
" radius=\"" << this->_radius <<
"\"";
258 os <<
" midpoint=\"" << this->_midpoint[0] <<
" " << this->_midpoint[1] <<
"\"";
264 os <<
" domain=\"" << param_l <<
" " << param_r <<
"\"";
270 template<
typename Mesh_,
typename ChartReturn_ = ChartBase<Mesh_>>
277 std::unique_ptr<ChartReturn_>& _chart;
285 virtual bool attribs(std::map<String,bool>& attrs)
const override
287 attrs.emplace(
"radius",
true);
288 attrs.emplace(
"midpoint",
true);
289 attrs.emplace(
"domain",
false);
297 const std::map<String, String>& attrs,
300 CoordType radius = CoordType(0);
301 CoordType mid_x = CoordType(0);
302 CoordType mid_y = CoordType(0);
303 CoordType dom_0 = CoordType(0);
304 CoordType dom_1 = CoordType(1);
305 bool have_domain(
false);
308 if(!attrs.find(
"radius")->second.parse(radius))
310 if(radius < CoordType(1E-5))
314 std::deque<String> mids = attrs.find(
"midpoint")->second.split_by_whitespaces();
315 if(mids.size() != std::size_t(2))
317 if(!mids.front().parse(mid_x) || !mids.back().parse(mid_y))
321 auto it = attrs.find(
"domain");
322 if(it != attrs.end())
325 std::deque<String> doms = it->second.split_by_whitespaces();
326 if(doms.size() != std::size_t(2))
328 if(!doms.front().parse(dom_0) || !doms.back().parse(dom_1))
334 _chart.reset(
new ChartType(mid_x, mid_y, radius, dom_0, dom_1));
336 _chart.reset(
new ChartType(mid_x, mid_y, radius));
#define XASSERTM(expr, msg)
Assertion macro definition with custom message.
Chart CRTP base-class template.
BaseClass::WorldPoint WorldPoint
our world point type
VertexSetType::CoordType CoordType
coordinate type
virtual void close(int, const String &) override
Closes this markup parser node.
virtual std::shared_ptr< Xml::MarkupParser > markup(int, const String &, const String &) override
Called to process a child markup node.
virtual bool attribs(std::map< String, bool > &attrs) const override
Specifies the mandatory and optional attributes.
virtual void create(int iline, const String &sline, const String &, const std::map< String, String > &attrs, bool) override
Creates this markup parser node.
virtual bool content(int, const String &) override
Called to process a content line.
Circle chart class template.
CoordType _trafo_b
Right parametrization domain boundary.
Circle(CoordType mid_x, CoordType mid_y, CoordType radius)
Creates a Circle chart for implicit adaption.
CoordType _trafo_a
Left parametrization domain boundary.
virtual String get_type() const override
Writes the type as String.
CoordType compute_signed_dist(const WorldPoint &point, WorldPoint &grad_dist) const
virtual void transform(const WorldPoint &origin, const WorldPoint &angles, const WorldPoint &offset) override
Circle(CoordType mid_x, CoordType mid_y, CoordType radius, CoordType param_l, CoordType param_r)
Creates a Circle chart for both implicit and explicit adaption.
CoordType compute_dist(const WorldPoint &point, WorldPoint &grad_dist) const
CoordType compute_dist(const WorldPoint &point) const
Computes the distance of a point to this chart.
ChartCRTP< Circle< Mesh_ >, Mesh_, CircleTraits > BaseClass
The CRTP base class.
CoordType _radius
the circle's radius
virtual bool can_explicit() const override
WorldPoint _midpoint
the circle's midpoint
BaseClass::WorldPoint WorldPoint
Vector type for world points, aka image points.
CoordType compute_signed_dist(const WorldPoint &point) const
BaseClass::CoordType CoordType
Floating point type.
BaseClass::ParamPoint ParamPoint
Vector type for parametrization points, aka domain points.
void project_meshpart(Mesh_ &mesh, const MeshPart< Mesh_ > &meshpart) const
bool _have_domain
Specifies whether the circle mapping has a domain.
virtual void write(std::ostream &os, const String &sindent) const override
Writes the Chart into a stream in XML format.
void project_point(WorldPoint &point) const
Projects a single world point.
void map_param(WorldPoint &point, const ParamPoint ¶m) const
Maps a single parameter point.
Class template for partial meshes.
Index get_num_entities(int dim) const
Returns the number of entities.
String class implementation.
Tiny Matrix class template.
CUDA_HOST_DEVICE Matrix & set_rotation_2d(T_ angle)
Sets this matrix to a 2D rotation matrix.
Tiny Vector class template.
XML Markup Parser interface.
T_ abs(T_ x)
Returns the absolute value.
T_ sin(T_ x)
Returns the sine of a value.
T_ signum(T_ x)
Returns the sign of a value.
T_ cos(T_ x)
Returns the cosine of a value.
std::uint64_t Index
Index data type.
static constexpr int world_dim
this is a 2D object
static constexpr bool is_explicit
we support explicit map
static constexpr bool is_implicit
we support implicit projection
static constexpr int param_dim
we have 1D parameters