void GICPOptimizer::apply_state(dgc_transform_t t, gsl_vector const* x) { double tx, ty, tz, rx, ry, rz; tx = gsl_vector_get(x, 0); ty = gsl_vector_get(x, 1); tz = gsl_vector_get(x, 2); rx = gsl_vector_get(x, 3); ry = gsl_vector_get(x, 4); rz = gsl_vector_get(x, 5); dgc_transform_rotate_x(t, rx); dgc_transform_rotate_y(t, ry); dgc_transform_rotate_z(t, rz); dgc_transform_translate(t, tx, ty, tz); }
int dgc_transform_read(dgc_transform_t t, const char *filename) { FILE *fp; char *err, *mark, *unit, line[1001]; double arg, x, y, z; /* start with identity transform */ dgc_transform_identity(t); fp = fopen(filename, "r"); if(fp == NULL) { dgc_warning("Error: could not open transform file %s.\n", filename); return -1; } do { err = fgets(line, 1000, fp); if(err != NULL) { unit = dgc_next_word(line); mark = dgc_next_word(unit); if(strncasecmp(line, "rx ", 3) == 0) { arg = strtod(mark, &mark); if(strncasecmp(unit, "deg", 3) == 0) arg = dgc_d2r(arg); dgc_transform_rotate_x(t, arg); } else if(strncasecmp(line, "ry ", 3) == 0) { arg = strtod(mark, &mark); if(strncasecmp(unit, "deg", 3) == 0) arg = dgc_d2r(arg); dgc_transform_rotate_y(t, arg); } else if(strncasecmp(line, "rz ", 3) == 0) { arg = strtod(mark, &mark); if(strncasecmp(unit, "deg", 3) == 0) arg = dgc_d2r(arg); dgc_transform_rotate_z(t, arg); } else if(strncasecmp(line, "t ", 2) == 0) { char *a = strdup("test"); x = strtod(mark, &mark); y = strtod(mark, &mark); z = strtod(mark, &mark); if(strncasecmp(unit, "in", 2) == 0) { x *= 0.0254; y *= 0.0254; z *= 0.0254; } else if(strncasecmp(unit, "cm", 2) == 0) { x *= 0.01; y *= 0.01; z *= 0.01; } dgc_transform_translate(t, x, y, z); } else { dgc_warning("Error: could not parse line \"%s\" from %s\n", line, filename); return -1; } } } while(err != NULL); fclose(fp); return 0; }
int dgc_transform_read_string(dgc_transform_t t, char *str) { int done; char *end, *mark, *mark2, *unit; char line[1001]; double arg, x, y, z; /* start with identity transform */ dgc_transform_identity(t); if(str != NULL) { mark = str; done = 0; do { end = strchr(mark, '\n'); if(end == NULL) { strcpy(line, mark); done = 1; } else { strncpy(line, mark, end - mark + 1); line[end - mark + 1] = '\0'; mark = end + 1; } if(strlen(line) > 0) { unit = dgc_next_word(line); mark2 = dgc_next_word((char *)unit); if(strncasecmp(line, "rx ", 3) == 0) { arg = strtod(mark2, &mark2); if(strncasecmp(unit, "deg", 3) == 0) arg = dgc_d2r(arg); dgc_transform_rotate_x(t, arg); } else if(strncasecmp(line, "ry ", 3) == 0) { arg = strtod(mark2, &mark2); if(strncasecmp(unit, "deg", 3) == 0) arg = dgc_d2r(arg); dgc_transform_rotate_y(t, arg); } else if(strncasecmp(line, "rz ", 3) == 0) { arg = strtod(mark2, &mark2); if(strncasecmp(unit, "deg", 3) == 0) arg = dgc_d2r(arg); dgc_transform_rotate_z(t, arg); } else if(strncasecmp(line, "t ", 2) == 0) { x = strtod(mark2, &mark2); y = strtod(mark2, &mark2); z = strtod(mark2, &mark2); if(strncasecmp(unit, "in", 2) == 0) { x *= 0.0254; y *= 0.0254; z *= 0.0254; } else if(strncasecmp(unit, "cm", 2) == 0) { x *= 0.01; y *= 0.01; z *= 0.01; } dgc_transform_translate(t, x, y, z); } else { dgc_warning("Error: could not parse line \"%s\" from transform\n", line); return -1; } } } while(!done); } return 0; }