70 sf = -(
IDot3(npi, p) + npi[3]);
71 q[0] = p[0] + sf * npi[0];
72 q[1] = p[1] + sf * npi[1];
73 q[2] = p[2] + sf * npi[2];
103 return IDot3(pi, p) + pi[3];
116 T normal_p[3], normal_q[3];
121 if (normal_p[2] <
static_cast<T
>(0.0)) {
124 if (normal_q[2] <
static_cast<T
>(0.0)) {
146 T mat_a[9], eigv[3], mat_q[9];
148 T xm =
static_cast<T
>(0.0);
149 T ym =
static_cast<T
>(0.0);
150 T zm =
static_cast<T
>(0.0);
151 for (i = 0, j = 0; i < n; i++) {
156 xm /=
static_cast<T
>(n);
157 ym /=
static_cast<T
>(n);
158 zm /=
static_cast<T
>(n);
159 for (i = 0, j = 0; i < n; i++) {
172 pi[3] = -(pi[0] * xm + pi[1] * ym + pi[2] * zm);
188 T xm = (X[0] + X[3] + X[6]) / 3;
189 T ym = (X[1] + X[4] + X[7]) / 3;
190 T zm = (X[2] + X[5] + X[8]) / 3;
208 pi[3] = -(pi[0] * xm + pi[1] * ym + pi[2] * zm);
218 T *centroid, T *err_stat) {
220 if (centroid !=
nullptr) {
223 if (err_stat !=
nullptr) {
230 int i, j, n3 = n * 3;
231 T mat_a[9], eigv[3], mat_q[9], t[3];
233 T xm =
static_cast<T
>(0.0);
234 T ym =
static_cast<T
>(0.0);
235 T zm =
static_cast<T
>(0.0);
236 for (i = 0, j = 0; i < n; i++) {
244 for (i = 0; i < n3; i += 3) {
245 ISub3(X + i, t, Xp + i);
247 IMultAtANx3(Xp, mat_a, n);
256 pi[3] = -
IDot3(pi, t);
258 if (centroid !=
nullptr) {
263 if (err_stat !=
nullptr) {
264 const T *cptr_data = X;
265 for (i = 0; i < n; ++i) {
269 err_stat[0] =
IMean(Xp, n);
270 err_stat[1] =
ISdv(Xp, err_stat[0], n);
283 if (n < 3 || n > m) {
288 T mat_a[9], eigv[3], mat_q[9];
290 T xm =
static_cast<T
>(0.0);
291 T ym =
static_cast<T
>(0.0);
292 T zm =
static_cast<T
>(0.0);
293 for (i = 0, j = 0; i < n; i++) {
301 for (i = 0, j = 0; i < n; i++) {
306 IMultAtANx3(X, mat_a, n);
314 pi[3] = -(pi[0] * xm + pi[1] * ym + pi[2] * zm);
327 if (n < 3 || n > m) {
332 T mat_a[9], eigv[3], mat_q[9];
334 T xm =
static_cast<T
>(0.0);
335 T ym =
static_cast<T
>(0.0);
336 T zm =
static_cast<T
>(0.0);
337 for (i = 0, j = 0; i < n; i++) {
345 for (i = 0, j = 0; i < n; i++) {
350 IMultAtANx3(X, mat_a, n);
358 pi[3] = -(pi[0] * xm + pi[1] * ym + pi[2] * zm);
360 if (centroid !=
nullptr) {
375 if (n < 3 || n > m) {
379 T *xp = IAlloc<T>(n * 3);
380 for (i = 0; i < n; i++) {
382 ICopy3(X + j * 3, xp + i * 3);
384 T mat_a[9], eigv[3], mat_q[9];
386 T xm =
static_cast<T
>(0.0);
387 T ym =
static_cast<T
>(0.0);
388 T zm =
static_cast<T
>(0.0);
389 for (i = 0, j = 0; i < n; i++) {
397 for (i = 0, j = 0; i < n; i++) {
402 IMultAtANx3(xp, mat_a, n);
414 para[3] = -
IDot3(para, para + 4);
417 for (i = 0; i < n; ++i) {
421 para[7] =
IMean(xp, n);
422 para[8] =
ISdv(xp, para[7], n);
429inline void IPlaneFit(
const T *X1,
const T *X2,
const T *X3, T *pi) {
430 T mat_a[9] = {X1[0], X1[1], X1[2], X2[0], X2[1], X2[2], X3[0], X3[1], X3[2]};
455 T mat_a[9], mat_ap[9];
void IPlaneFitDestroyed(T *Xs, T *pi)
void IPlaneFitAdv(const T *Xs, T *para)
void IPlaneFitTotalLeastSquareAdv(T *X, int *indices, T *para, int m, int n)
float IRadiansToDegree(float r)
T IPlaneToPointDistance(const T *pi, const T *p)
T IMean(const T *x, int n)
T IPlaneToPointDistanceWNormalizedPlaneNorm(const T *pi, const T *p)
void ICopy9(const T src[9], T dst[9])
void IIndexedShuffle(T *a, int *indices, int n, int element_size, int nr_indexed_elements, bool is_sort_indices=true)
void IPlaneFitTotalLeastSquare3(T *X, T *pi)
void ICopy3(const T src[3], T dst[3])
void IMultAtAnx3(const T *A, T AtA[9], int n)
T IPlaneToPointDistanceWUnitNorm(const T *pi, const T *p)
float IDiv(float a, float b)
T IPlaneToPointSignedDistanceWUnitNorm(const T *pi, const T *p)
void IMultAtA3x3(const T A[9], T AtA[9])
void ICopy2(const T src[2], T dst[2])
T IPlaneToPlaneNormalDeltaDegreeZUp(const T *pi_p, const T *pi_q)
void IPlaneFitTotalLeastSquare(T *X, T *pi, int n)
T ISdv(const T *x, T mean, int n)
void IPlaneFit(const T *X1, const T *X2, const T *X3, T *pi)
void IScale3(T x[3], T sf)
void IEigSymmetric3x3Closed(const T *A, T *EV, T *Q)
void IScale4(T x[4], T sf)
void ICopy4(const T src[4], T dst[4])
T IDot3(const T x[3], const T y[3])
void ISub3(const T x[3], const T y[3], T z[3])
void IPointOnPlaneProjection(const T *pi, const T *p, T *q)
PlanePara(const PlanePara< T > &pi)
PlanePara & operator=(const PlanePara< T > &pi)