40 using PointType = MeshType::VertexType::PositionType;
41 using ScalarType = PointType::ScalarType;
42 using ConstIterator = std::ranges::iterator_t<PosView>;
46 enableIfPerVertexNormalOptional(mMesh);
47 enableIfPerVertexQualityOptional(mMesh);
49 mMesh.name() =
"Sampling";
53 const MeshType& samples()
const {
return mMesh; }
55 const PointType& sample(
uint i)
const {
return mMesh.vertex(
i).position(); }
57 std::size_t size()
const {
return mMesh.vertexNumber(); }
59 void clear() { mMesh.clear(); }
63 if (
n > mMesh.vertexNumber()) {
64 uint k =
n - mMesh.vertexNumber();
69 void reserve(
uint n) { mMesh.reserveVertices(
n); }
71 void add(
const PointType&
p) { mMesh.addVertex(
p); }
73 void set(
uint i,
const PointType&
p) { mMesh.vertex(
i).position() =
p; }
75 template<VertexConcept VertexType>
76 void add(
const VertexType& v)
78 uint vi = mMesh.addVertex(v.position());
79 mMesh.vertex(
vi).importFrom(v,
false);
81 setBirthElement(
vi,
"birthVertex", v.index());
84 template<VertexConcept VertexType>
85 void set(
uint i,
const VertexType& v)
87 mMesh.vertex(
i).position() = v.position();
88 mMesh.vertex(
i).importFrom(v,
false);
90 setBirthElement(
i,
"birthVertex", v.index());
93 template<EdgeConcept EdgeType>
94 void add(
const EdgeType& e,
double u,
bool copyQuality =
true)
97 (e.vertex(0).position() * (1 - u)) + (e.vertex(1).position() * u));
102 if (isPerVertexQualityAvailable(mMesh) &&
103 comp::isQualityAvailableOn(e)) {
104 mMesh.vertex(
vi).quality() = e.quality();
109 setBirthElement(
vi,
"birthEdge", e.index());
112 template<EdgeConcept EdgeType>
115 mMesh.vertex(
i).position() =
116 (e.vertex(0).position() * (1 - u)) + (e.vertex(1).position() * u);
121 if (isPerVertexQualityAvailable(mMesh) &&
122 comp::isQualityAvailableOn(e)) {
123 mMesh.vertex(
i).quality() = e.quality();
128 setBirthElement(
i,
"birthEdge", e.index());
131 template<FaceConcept FaceType>
140 setBirthElement(
vi,
"birthFace", f.index());
143 template<FaceConcept FaceType>
153 setBirthElement(
i,
"birthFace", f.index());
156 template<FaceConcept FaceType>
159 const std::vector<ScalarType>&
barCoords,
166 for (
uint i = 0;
i < f.vertexNumber();
i++)
172 setBirthElement(
vi,
"birthFace", f.index());
175 template<FaceConcept FaceType>
179 const std::vector<ScalarType>&
barCoords,
186 for (
uint i = 0;
i < f.vertexNumber();
i++)
189 mMesh.vertex(
i).position() =
p;
192 setBirthElement(
i,
"birthFace", f.index());
195 template<FaceConcept FaceType>
202 static_assert(FaceType::NV == 3 || FaceType::NV == -1);
203 if constexpr (FaceType::NV == -1) {
204 assert(f.vertexNumber() == 3);
212 setBirthElement(
vi,
"birthFace", f.index());
215 template<FaceConcept FaceType>
223 static_assert(FaceType::NV == 3 || FaceType::NV == -1);
224 if constexpr (FaceType::NV == -1) {
225 assert(f.vertexNumber() == 3);
230 mMesh.vertex(
i).position() =
p;
233 setBirthElement(
i,
"birthFace", f.index());
236 ConstIterator begin()
const
238 return std::ranges::begin(mMesh.vertices() | views::positions);
241 ConstIterator end()
const
243 return std::ranges::end(mMesh.vertices() | views::positions);
247 template<FaceConcept FaceType>
257 if (isPerVertexNormalAvailable(mMesh) &&
258 comp::isNormalAvailableOn(f)) {
259 mMesh.vertex(
vi).normal() = f.normal();
267 if (isPerVertexQualityAvailable(mMesh) &&
268 comp::isQualityAvailableOn(f)) {
269 mMesh.vertex(
vi).quality() = f.quality();
275 void setBirthElement(
uint vi,
const std::string& key,
uint value)
278 if (!mMesh.hasPerVertexCustomComponent(key)) {
FaceType::VertexType::PositionType faceBarycenter(const FaceType &f)
Computes the barycenter of a face. Works both for triangle and polygonal faces, and it is optimized i...
Definition geometry.h:81