Ponca  4d2a58fa5c6375adef5c4b208f4d47e016cecd6d
Point Cloud Analysis library
Loading...
Searching...
No Matches
concepts.h
1#pragma once
2
3#include "../Common/concepts.h"
4#include "enums.h"
5
6namespace Ponca
7{
8 template <typename T>
9 concept ProvidesProjectionOperator = requires(T t, const T ct, typename T::VectorType v, typename T::Scalar s) {
10 ct.projectionOperator();
11
12 { ct.projectionOperator().project(v) } -> std::same_as<typename T::VectorType>;
13 };
14
15 template <typename T>
17 ProvidesProjectionOperator<T> && requires(T t, const T ct, typename T::VectorType v, typename T::Scalar s) {
18 t.implicitPrimitive();
19 ct.implicitPrimitive();
20
21 { ct.implicitPrimitive().potential() } -> std::same_as<typename T::Scalar>;
22 { ct.implicitPrimitive().potential(v) } -> std::same_as<typename T::Scalar>;
23
24 { ct.implicitPrimitive().primitiveGradient() } -> std::convertible_to<typename T::VectorType>;
25 { ct.implicitPrimitive().primitiveGradient(v) } -> std::same_as<typename T::VectorType>;
26
27 t.implicitPrimitive().changeBasis(v);
28 };
29
30 template <typename T>
31 concept ProvidesImplicitPrimitiveDerivative = requires(const T ct) {
32 ct.implicitPrimitiveDer();
33
34 { ct.implicitPrimitiveDer().dPotential() } -> std::convertible_to<typename T::ScalarArray>;
35 { ct.implicitPrimitiveDer().dNormal() } -> std::convertible_to<typename T::VectorArray>;
36 };
37
38 template <typename T>
40 ProvidesImplicitPrimitive<T> && requires(T t, const T ct, typename T::VectorType v, typename T::Scalar s) {
41 ct.algebraicSphere();
42
43 { ct.algebraicSphere().isPlane() } -> std::same_as<bool>;
44 { ct.algebraicSphere().isValid() } -> std::same_as<bool>;
45 { ct.algebraicSphere().isNormalized() } -> std::same_as<bool>;
46 { ct.algebraicSphere().isApprox(ct, s) } -> std::same_as<bool>;
47
48 { t.algebraicSphere().applyPrattNorm() } -> std::same_as<bool>;
49 { ct.algebraicSphere().prattNorm() } -> std::same_as<typename T::Scalar>;
50 { ct.algebraicSphere().prattNorm2() } -> std::same_as<typename T::Scalar>;
51
52 { ct.algebraicSphere().radius() } -> std::convertible_to<typename T::Scalar>;
53 { ct.algebraicSphere().center() } -> std::convertible_to<typename T::VectorType>;
54 };
55
56 template <typename T>
57 concept ProvidesMeanPosition = requires(const T ct) {
58 ct.meanPosition();
59
60 { ct.meanPosition().barycenter() } -> std::convertible_to<typename T::VectorType>;
61 { ct.meanPosition().barycenterDistance() } -> std::same_as<typename T::Scalar>;
62 // This is only for subclasses
63 // TODO: Make this function public / private ?
64 // { ct.meanPosition().barycenterLocal() } -> std::convertible_to<typename T::VectorType>;
65 };
66
67 template <typename T>
68 concept ProvidesMeanPositionDerivative = requires(const T ct) {
69 ct.meanPositionDer();
70
71 { ct.meanPositionDer().barycenterDerivatives() } -> std::convertible_to<typename T::VectorArray>;
72 };
73
74 template <typename T>
75 concept ProvidesMeanNormal = requires(const T ct) {
76 ct.meanNormal();
77
78 { ct.meanNormal().meanNormalVector() } -> std::convertible_to<typename T::VectorType>;
79 };
80
81 template <typename T>
82 concept ProvidesMeanNormalDer = requires(const T ct) {
83 ct.meanNormalDer();
84
85 { ct.meanNormal().dMeanNormal() } -> std::convertible_to<typename T::VectorArray>;
86 };
87
88 template <typename T>
89 concept ProvidesGLSParam = requires(const T ct) {
90 ct.glsParam();
91
92 { ct.glsParam().tau() } -> std::same_as<typename T::Scalar>;
93 { ct.glsParam().eta() } -> std::same_as<typename T::VectorType>;
94 { ct.glsParam().kappa() } -> std::same_as<typename T::Scalar>;
95
96 { ct.glsParam().tau_normalized() } -> std::same_as<typename T::Scalar>;
97 { ct.glsParam().eta_normalized() } -> std::same_as<typename T::VectorType>;
98 { ct.glsParam().kappa_normalized() } -> std::same_as<typename T::Scalar>;
99
100 { ct.glsParam().fitness() } -> std::same_as<typename T::Scalar>;
101 { ct.glsParam().compareTo(ct, true) } -> std::same_as<typename T::Scalar>;
102 };
103
104 template <typename T>
105 concept ProvidesGLSDer = requires(const T ct) {
106 ct.glsDer();
107
108 { ct.glsDer().tau() } -> std::same_as<typename T::ScalarArray>;
109 { ct.glsDer().eta() } -> std::same_as<typename T::VectorTypeArray>;
110 { ct.glsDer().kappa() } -> std::same_as<typename T::ScalarArray>;
111
112 { ct.glsDer().tau_normalized() } -> std::same_as<typename T::ScalarArray>;
113 { ct.glsDer().eta_normalized() } -> std::same_as<typename T::VectorTypeArray>;
114 { ct.glsDer().kappa_normalized() } -> std::same_as<typename T::ScalarArray>;
115 };
116
117 template <typename T>
118 concept ProvidesGeomVar = requires(const T ct, typename T::Scalar s) {
119 ct.geomVar();
120
121 { ct.geomVar().geomVar(s, s, s) } -> std::same_as<typename T::Scalar>;
122 };
123
124 template <typename T>
126 ProvidesImplicitPrimitive<T> && requires(T t, const T ct, typename T::Scalar s, typename T::VectorType v) {
127 t.plane();
128 ct.plane();
129
130 t.plane().setPlane(v, v);
131 };
132
133 template <typename T>
134 concept ProvidesLine =
135 ProvidesImplicitPrimitive<T> && requires(T t, const T ct, typename T::Scalar s, typename T::VectorType v) {
136 t.line();
137 ct.line();
138
139 t.line().setLine(v, v);
140 };
141
142 template <typename T>
144 requires(const T ct, typename T::Scalar s, const typename T::VectorType cv, typename T::VectorType v) {
145 ct.heightFieldBase();
146
147 { ct.heightFieldBase().getHFromLocalCoordinates(cv) } -> std::same_as<const typename T::Scalar&>;
148 { ct.heightFieldBase().getUFromLocalCoordinates(cv) } -> std::same_as<const typename T::Scalar&>;
149 { ct.heightFieldBase().getVFromLocalCoordinates(cv) } -> std::same_as<const typename T::Scalar&>;
150 };
151
152 template <typename T>
153 concept ProvidesHeightField = requires(const T ct, typename T::Scalar s, typename T::VectorType v) {
154 ct.heightField();
155
156 { ct.heightField().height(s, s) } -> std::same_as<typename T::Scalar>;
157 { ct.heightField().h_uu() } -> std::same_as<const typename T::Scalar&>;
158 { ct.heightField().h_vv() } -> std::same_as<const typename T::Scalar&>;
159 { ct.heightField().h_uv() } -> std::same_as<const typename T::Scalar&>;
160 { ct.heightField().h_c() } -> std::same_as<const typename T::Scalar&>;
161 { ct.heightField().h_uu() } -> std::same_as<const typename T::Scalar&>;
162 { ct.heightField().h_uu() } -> std::same_as<const typename T::Scalar&>;
163
164 { ct.heightField().dh_du(s, s) } -> std::same_as<typename T::Scalar>;
165 { ct.heightField().dh_dv(s, s) } -> std::same_as<typename T::Scalar>;
166 { ct.heightField().d2h_duu(s, s) } -> std::same_as<typename T::Scalar>;
167 { ct.heightField().d2h_dvv(s, s) } -> std::same_as<typename T::Scalar>;
168 { ct.heightField().d2h_duv(s, s) } -> std::same_as<typename T::Scalar>;
169
170 { ct.heightField().heightTangentULocal(v) } -> std::same_as<typename T::VectorType>;
171 { ct.heightField().heightTangentVLocal(v) } -> std::same_as<typename T::VectorType>;
172 };
173
174 template <typename T>
175 concept ProvidesMongePatch = requires(const T ct) { ct.mongePatchPrimitive(); };
176
177 template <typename T>
178 concept ProvidesPositionCovariance = requires(const T ct) {
179 ct.covarianceBase();
180
181 { ct.covarianceBase().solver() } -> std::convertible_to<typename T::Solver>;
182 };
183
184 template <typename T>
185 concept ProvidesPositionCovarianceDer = requires(const T ct) { ct.covarianceDer(); };
186
187 template <typename T>
188 concept ProvidesCovariancePlaneDer = requires(const T ct) {
189 ct.covariancePlaneDer();
190
191 { ct.covariancePlaneDer().dPotential() } -> std::convertible_to<typename T::ScalarArray>;
192 };
193
194 template <typename T>
195 concept ProvidesTangentPlaneBasis = requires(const T ct, typename T::VectorType v) {
196 ct.tangentPlaneBasis();
197
198 { ct.tangentPlaneBasis().worldToTangentPlane(v, true) } -> std::same_as<typename T::VectorType>;
199 { ct.tangentPlaneBasis().tangentPlaneToWorld(v, true) } -> std::same_as<typename T::VectorType>;
200 };
201
202 template <typename T>
203 concept ProvidesMeanCurvature = requires(const T ct) {
204 ct.meanCurvature();
205
206 { ct.meanCurvature().kMean() } -> std::same_as<typename T::Scalar>;
207 };
208
214 template <typename T>
215 concept ProvidesPrincipalCurvatures = ProvidesMeanCurvature<T> && requires(const T ct) {
216 ct.curvatureTensor();
217
218 { ct.curvatureTensor().kmin() } -> std::same_as<typename T::Scalar>;
219 { ct.curvatureTensor().kmax() } -> std::same_as<typename T::Scalar>;
220 { ct.curvatureTensor().GaussianCurvature() } -> std::same_as<typename T::Scalar>;
221
222 { ct.curvatureTensor().kminDirection() } -> std::convertible_to<typename T::VectorType>;
223 { ct.curvatureTensor().kmaxDirection() } -> std::convertible_to<typename T::VectorType>;
224 };
225
226 template <typename T>
227 concept ProvidesFirstFondamentalFormComponents = requires(const T ct, typename T::Scalar s) {
228 ct.firstFondamentalFormComponent();
229 ct.firstFondamentalFormComponent().firstFundamentalFormComponents(s, s, s);
230 };
231
232 template <typename T>
233 concept ProvidesSecondFondamentalFormComponents = requires(const T ct, typename T::Scalar s) {
234 ct.secondFondamentalFormComponent();
235 ct.secondFondamentalFormComponent().secondFundamentalFormComponents(s, s, s);
236 };
237
238 template <typename T>
239 concept ProvidesWeingartenMap = requires(const T ct, typename T::Matrix2 m) {
240 { ct.weingartenMap() } -> std::convertible_to<typename T::Matrix2>;
241 ct.weingartenMap(m);
242 };
243} // namespace Ponca
Base concept for any 3d curvature estimator: provides , and associated vectors, such that .
Definition concepts.h:215
This Source Code Form is subject to the terms of the Mozilla Public License, v.
Definition concepts.h:11