// // main.c // Aff // Created by user on 3/2/17. // Copyright © 2017 user. All rights reserved. // #include #include #include #include #include "dclapack.h" #define LH_ID 1 #define NUM_HMD 32 #define MAX_POINTS 128 //#define _ABS(a) ( (a)<=0 ? -(a) : (a) ) #define _SIGN(a) ( (a)<=0 ? -1.0f : 1.0f ) #define RANDF ( (float)rand() / (float)RAND_MAX ) #define PI 3.14159265358979323846264 #define STEP_SIZE_ROT 1.0 #define STEP_SIZE_POS 1.0 #define FALLOFF 0.99999 #define NITER 2000000 #define TOO_SMALL 0.0001 #define ORTHOG_PENALTY 1.0 float hmd_pos[NUM_HMD][3]; void ReadHmdPoints() { int i; FILE *fin = fopen("HMD_points.csv","r"); if (fin==NULL) { printf("ERROR: could not open HMD_points.csv for reading\n"); exit(1); } for (i=0; i TOO_SMALL) { float scaleRot = stepSizeRot / gradSizeRot; for (j=0; j<3; j++) { for (k=0; k<3; k++) { T[j][k] += scaleRot * conj[j][k]; } } stepSizeRot *= falloff; } if (gradSizePos > TOO_SMALL) { float scalePos = stepSizePos / gradSizePos; for (j=0; j<3; j++) { T[j][3] += scalePos * conj[j][3]; } stepSizePos *= falloff; } // Constrain the gradient (such that scaling is one) if (constrain) { // Measure the scales float len[3] = {0.0, 0.0, 0.0}; for (j=0; j<3; j++) { double lenSq = 0.0; for (k=0; k<3; k++) { lenSq += (double)T[j][k] * (double)T[j][k]; } len[j] = sqrt(lenSq); } // How far off is the scale? float xzLen = 0.5 * (len[0] + len[2]); if (xzLen > TOO_SMALL) { float inv_xzLen = 1.0 / xzLen; for (j=0; j<3; j++) { T[3][j] *= inv_xzLen; } } // Rescale the thing for (j=0; j<3; j++) { if (len[j] > TOO_SMALL) { float inv_len = 1.0 / len[j]; for (k=0; k<3; k++) { T[j][k] *= inv_len; } } } } } float dist = sqrt(T[0][3]*T[0][3] + T[1][3]*T[1][3] + T[2][3]*T[2][3]); printf("AffineSolve: pos: %f %f %f dist: %f\n", T[0][3], T[1][3], T[2][3], dist); } int main() { int i,j,k,sen,axis; // Read the data files printf( "...\n" ); ReadHmdPoints(); ReadPtinfo(); //------------------------- // Package the lighthouse data for "AffineSolve" //------------------------- // Data for the "iterative" affine solve formula // float Tcalc[4][4]; float O[MAX_POINTS][4]; float N[MAX_POINTS][3]; float D[MAX_POINTS]; int nPlanes = 0; for (sen=0; sen