26 namespace perception {
60 bool IsValid() {
return (
ISqrt(IQquaresum3(p)) > static_cast<T>(0)); }
71 sf = -(
IDot3(npi, p) + npi[3]);
72 q[0] = p[0] + sf * npi[0];
73 q[1] = p[1] + sf * npi[1];
74 q[2] = p[2] + sf * npi[2];
102 template <
typename T>
104 return IDot3(pi, p) + pi[3];
109 template <
typename T>
115 template <
typename T>
117 T normal_p[3], normal_q[3];
122 if (normal_p[2] < static_cast<T>(0.0)) {
125 if (normal_q[2] < static_cast<T>(0.0)) {
140 template <
typename T>
147 T mat_a[9], eigv[3], mat_q[9];
149 T xm =
static_cast<T
>(0.0);
150 T ym =
static_cast<T
>(0.0);
151 T zm =
static_cast<T
>(0.0);
152 for (i = 0, j = 0; i < n; i++) {
157 xm /=
static_cast<T
>(n);
158 ym /=
static_cast<T
>(n);
159 zm /=
static_cast<T
>(n);
160 for (i = 0, j = 0; i < n; i++) {
173 pi[3] = -(pi[0] * xm + pi[1] * ym + pi[2] * zm);
182 template <
typename T>
189 T xm = (X[0] + X[3] + X[6]) / 3;
190 T ym = (X[1] + X[4] + X[7]) / 3;
191 T zm = (X[2] + X[5] + X[8]) / 3;
209 pi[3] = -(pi[0] * xm + pi[1] * ym + pi[2] * zm);
217 template <
typename T>
219 T *centroid, T *err_stat) {
221 if (centroid !=
nullptr) {
224 if (err_stat !=
nullptr) {
231 int i, j, n3 = n * 3;
232 T mat_a[9], eigv[3], mat_q[9],
t[3];
234 T xm =
static_cast<T
>(0.0);
235 T ym =
static_cast<T
>(0.0);
236 T zm =
static_cast<T
>(0.0);
237 for (i = 0, j = 0; i < n; i++) {
245 for (i = 0; i < n3; i += 3) {
246 ISub3(X + i, t, Xp + i);
248 IMultAtANx3(Xp, mat_a, n);
257 pi[3] = -
IDot3(pi, t);
259 if (centroid !=
nullptr) {
264 if (err_stat !=
nullptr) {
265 const T *cptr_data = X;
266 for (i = 0; i < n; ++i) {
270 err_stat[0] =
IMean(Xp, n);
271 err_stat[1] =
ISdv(Xp, err_stat[0], n);
281 template <
typename T>
284 if (n < 3 || n > m) {
289 T mat_a[9], eigv[3], mat_q[9];
291 T xm =
static_cast<T
>(0.0);
292 T ym =
static_cast<T
>(0.0);
293 T zm =
static_cast<T
>(0.0);
294 for (i = 0, j = 0; i < n; i++) {
302 for (i = 0, j = 0; i < n; i++) {
307 IMultAtANx3(X, mat_a, n);
315 pi[3] = -(pi[0] * xm + pi[1] * ym + pi[2] * zm);
324 template <
typename T>
328 if (n < 3 || n > m) {
333 T mat_a[9], eigv[3], mat_q[9];
335 T xm =
static_cast<T
>(0.0);
336 T ym =
static_cast<T
>(0.0);
337 T zm =
static_cast<T
>(0.0);
338 for (i = 0, j = 0; i < n; i++) {
346 for (i = 0, j = 0; i < n; i++) {
351 IMultAtANx3(X, mat_a, n);
359 pi[3] = -(pi[0] * xm + pi[1] * ym + pi[2] * zm);
361 if (centroid !=
nullptr) {
372 template <
typename T>
376 if (n < 3 || n > m) {
380 T *xp = IAlloc<T>(n * 3);
381 for (i = 0; i < n; i++) {
383 ICopy3(X + j * 3, xp + i * 3);
385 T mat_a[9], eigv[3], mat_q[9];
387 T xm =
static_cast<T
>(0.0);
388 T ym =
static_cast<T
>(0.0);
389 T zm =
static_cast<T
>(0.0);
390 for (i = 0, j = 0; i < n; i++) {
398 for (i = 0, j = 0; i < n; i++) {
403 IMultAtANx3(xp, mat_a, n);
415 para[3] = -
IDot3(para, para + 4);
418 for (i = 0; i < n; ++i) {
422 para[7] =
IMean(xp, n);
423 para[8] =
ISdv(xp, para[7], n);
429 template <
typename T>
430 inline void IPlaneFit(
const T *X1,
const T *X2,
const T *X3, T *pi) {
431 T mat_a[9] = {X1[0], X1[1], X1[2], X2[0], X2[1], X2[2], X3[0], X3[1], X3[2]};
437 template <
typename T>
447 template <
typename T>
454 template <
typename T>
456 T mat_a[9], mat_ap[9];
void IZero3(T a[3])
Definition: i_blas.h:334
void IMultAtAnx3(const T *A, T AtA[9], int n)
Definition: i_blas.h:4840
float IAbs(float a)
Definition: i_basic.h:29
T ISdv(const T *x, T mean, int n)
Definition: i_blas.h:2500
T IPlaneToPlaneNormalDeltaDegreeZUp(const T *pi_p, const T *pi_q)
Definition: i_plane.h:116
PlanePara & operator=(const PlanePara< T > &pi)
Definition: i_plane.h:38
void IScale4(T x[4], T sf)
Definition: i_blas.h:1874
T IL2Norm3(const T x[3])
Definition: i_blas.h:2812
T data_stat[2]
Definition: i_plane.h:49
void IPlaneFitTotalLeastSquareAdv(T *X, int *indices, T *para, int m, int n)
Definition: i_plane.h:373
void Assign(const T *pi)
Definition: i_plane.h:55
PlanePara(const PlanePara< T > &pi)
Definition: i_plane.h:33
void ICopy3(const T src[3], T dst[3])
Definition: i_blas.h:40
float IRec(float a)
Definition: i_basic.h:69
void IPlaneFitDestroyed(T *Xs, T *pi)
Definition: i_plane.h:448
void IPlaneFitTotalLeastSquare(T *X, T *pi, int n)
Definition: i_plane.h:141
T IPlaneToPointSignedDistanceWUnitNorm(const T *pi, const T *p)
Definition: i_plane.h:103
float IRadiansToDegree(float r)
Definition: i_basic.h:260
T IPlaneToPointDistanceWNormalizedPlaneNorm(const T *pi, const T *p)
Definition: i_plane.h:110
T IMean(const T *x, int n)
Definition: i_blas.h:2434
void IPointOnPlaneProjection(const T *pi, const T *p, T *q)
Definition: i_plane.h:66
void Clear()
Definition: i_plane.h:50
void IPlaneFitAdv(const T *Xs, T *para)
Definition: i_plane.h:455
void IEigSymmetric3x3Closed(const T *A, T *EV, T *Q)
Definition: i_util.h:56
void ISub3(const T x[3], const T y[3], T z[3])
Definition: i_blas.h:1405
void IZero9(T a[9])
Definition: i_blas.h:358
void ICopy2(const T src[2], T dst[2])
Definition: i_blas.h:35
float IDiv(float a, float b)
Definition: i_basic.h:35
PlanePara()
Definition: i_plane.h:61
void IZero4(T a[4])
Definition: i_blas.h:338
void IPlaneFitTotalLeastSquare3(T *X, T *pi)
Definition: i_plane.h:183
float IAcos(float alpha)
Definition: i_basic.h:239
void IPlaneFit(const T *X1, const T *X2, const T *X3, T *pi)
Definition: i_plane.h:430
void IMultAtA3x3(const T A[9], T AtA[9])
Definition: i_blas.h:4830
T p[4]
Definition: i_plane.h:45
void INeg3(T x[3])
Definition: i_blas.h:415
T t[3]
Definition: i_plane.h:46
T IDot3(const T x[3], const T y[3])
Definition: i_blas.h:2260
float ISqrt(float a)
Definition: i_basic.h:76
void IUnitize3(T x[3])
Definition: i_blas.h:2955
void IIndexedShuffle(T *a, int *indices, int n, int element_size, int nr_indexed_elements, bool is_sort_indices=true)
Definition: i_sort.h:80
T IPlaneToPointDistanceWUnitNorm(const T *pi, const T *p)
Definition: i_plane.h:94
T IPlaneToPointDistance(const T *pi, const T *p)
Definition: i_plane.h:80
void IZero2(T a[2])
Definition: i_blas.h:330
void IScale3(T x[3], T sf)
Definition: i_blas.h:1868
bool IsValid()
Definition: i_plane.h:60
void ICopy9(const T src[9], T dst[9])
Definition: i_blas.h:91
void ICopy4(const T src[4], T dst[4])
Definition: i_blas.h:46