defrc.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:7k
源码类别:

GIS编程

开发平台:

Visual C++

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <GL/glut.h>
  5. #include "matrix.h"
  6. /* Some <math.h> files do not define M_PI... */
  7. #ifndef M_PI
  8. #define M_PI 3.14159265358979323846
  9. #endif
  10. typedef struct parameter
  11. {
  12.     double value;
  13.     double speed;
  14.     int steps;
  15. } Parameter;
  16. Matrix pos;
  17. Parameter roll, alignment, heading, pitch;
  18. double tot_al = 0.0;
  19. int tot = 0;
  20. #define MAX 10000
  21. extern GLfloat x[MAX], y[MAX], z[MAX];
  22. extern GLfloat dx[MAX], dy[MAX], dz[MAX];
  23. extern GLfloat hd[MAX], al[MAX], pt[MAX], rl[MAX];
  24. extern GLfloat strips[27][MAX][3], normal[24][MAX][3];
  25. extern int opt[MAX];
  26. extern GLfloat bnormal[2][MAX][3];
  27. extern GLfloat r1[MAX], r2[MAX], r3[MAX];
  28. void update_parameters(void);
  29. void update_parameter(Parameter *p);
  30. void init_parameter(Parameter *p);
  31. Vector strips_tmp[27], normal_tmp[27];
  32. void calculate_rc(void)
  33. {
  34.     FILE *in;
  35.     int i, j;
  36.     char cmd[256];
  37.     double a;
  38.     Vector v;
  39.     Matrix tmp, t2;
  40. #if 0
  41.     GLfloat nx, ny, nz, ac;
  42. #endif
  43.     printf("Reading RC parameters.n");
  44. /*
  45.     out = fopen("rc.in", "w");
  46.     if (!out)
  47.     {
  48. fprintf(stderr, "Failed to open file 'rc.in' for writing.n");
  49. exit(1);
  50.     }
  51. */
  52.     in = fopen("rc.def", "r");
  53.     if (!in)
  54.     {
  55. fprintf(stderr, "Failed to open file 'rc.def'.n");
  56. exit(1);
  57.     }
  58.     init_parameter(&roll);
  59.     init_parameter(&pitch);
  60.     init_parameter(&heading);
  61.     init_parameter(&alignment);
  62.     init_matrix(&pos);
  63.     pos.index[3][2] = 0;
  64.     for (i=0;i<27;i++)
  65.     {
  66. init_vector(&normal_tmp[i]);
  67. init_vector(&strips_tmp[i]);
  68.     }
  69.     for (i=0;i<8;i++)
  70.     {
  71. strips_tmp[i].index[2] = 1.0;
  72. strips_tmp[i+8].index[2] = -1.0;
  73. strips_tmp[i+16].index[1] = -1.0;
  74.     }
  75.     for (i=0;i<3;i++)
  76.     {
  77. for (j=0;j<8;j++)
  78. {
  79.     normal_tmp[i*8+j].index[2] = cos(j*M_PI/4);
  80.     normal_tmp[i*8+j].index[1] = sin(j*M_PI/4);
  81.     strips_tmp[i*8+j].index[2] += cos(j*M_PI/4)/(i==2?2:4);
  82.     strips_tmp[i*8+j].index[1] += sin(j*M_PI/4)/(i==2?2:4);
  83. }
  84. strips_tmp[24].index[2] = 1.0;
  85. strips_tmp[25].index[2] = -1.0;
  86. strips_tmp[26].index[1] = -1.0;
  87.     }
  88.     while (!feof(in))
  89.     {
  90. for (i=0;i<256;i++)
  91. {
  92.     int ch;
  93.     ch = fgetc(in);
  94.     if ((ch == 'n') || (ch == EOF))
  95.     {
  96. cmd[i] = 0;
  97. break;
  98.     }
  99.     cmd[i] = ch;
  100. }
  101. if (cmd[0] == '#')
  102.     continue;
  103. else if (!cmd[0])
  104.     continue;
  105. else if (sscanf(cmd, "pitch %lf %d", &a, &i))
  106. {
  107.     pitch.speed = (a - pitch.value)/i;
  108.     pitch.steps = i;
  109. }
  110. else if (sscanf(cmd, "alignment %lf %d", &a, &i))
  111. {
  112.     alignment.speed = (a - alignment.value)/i;
  113.     alignment.steps = i;
  114. }
  115. else if (sscanf(cmd, "heading %lf %d", &a, &i))
  116. {
  117.     heading.speed = (a - heading.value)/i;
  118.     heading.steps = i;
  119. }
  120. else if (sscanf(cmd, "roll %lf %d", &a, &i))
  121. {
  122.     roll.speed = (a - roll.value)/i;
  123.     roll.steps = i;
  124. }
  125. else if (sscanf(cmd, "wait %d", &i))
  126. {
  127.     for (;i>=0;i--)
  128.     {
  129. update_parameters();
  130. init_vector(&v);
  131. v.index[0] = 0.15;
  132. multiply_matrix_vector(&pos, &v);
  133. for (j=0;j<3;j++)
  134.     pos.index[3][j] = v.index[j];
  135. rotate_x(-roll.value*M_PI/(180*50), &pos);
  136. rotate_y(-heading.value*M_PI/(180*50), &pos);
  137. rotate_z(-pitch.value*M_PI/(180*50), &pos);
  138. x[tot] = v.index[0];
  139. y[tot] = v.index[1];
  140. z[tot] = v.index[2];
  141. al[tot] = alignment.value/50.0;
  142. rl[tot] = roll.value/50.0;
  143. hd[tot] = heading.value/50.0;
  144. pt[tot] = pitch.value/50.0;
  145. opt[tot] = 100*fabs(rl[tot] - al[tot]) + 100*fabs(hd[tot])+
  146.     100*fabs(pt[tot]);
  147. copy_matrix(&tmp, &pos);
  148. init_vector(&v);
  149. v.index[1] = 1;
  150. tot_al += alignment.value*M_PI/180/50;
  151. rotate_x(-tot_al, &tmp);
  152. multiply_matrix_vector(&tmp, &v);
  153. dx[tot] = v.index[0] - tmp.index[3][0];
  154. dy[tot] = v.index[1] - tmp.index[3][1];
  155. dz[tot] = v.index[2] - tmp.index[3][2];
  156. copy_matrix(&tmp, &pos);
  157. tot_al += alignment.value*M_PI/180/50;
  158. rotate_x(-tot_al, &tmp);
  159. copy_matrix(&t2, &tmp);
  160. for (j=0;j<27;j++)
  161. {
  162.     copy_vector(&v, &strips_tmp[j]);
  163.     multiply_matrix_vector(&t2, &v);
  164.     
  165.     strips[j][tot][0] = v.index[0];
  166.     strips[j][tot][1] = v.index[1];
  167.     strips[j][tot][2] = v.index[2];
  168.     copy_vector(&v, &normal_tmp[j]);
  169.     multiply_matrix_vector(&t2, &v);
  170.     
  171.     normal[j][tot][0] = v.index[0] - t2.index[3][0];
  172.     normal[j][tot][1] = v.index[1] - t2.index[3][1];
  173.     normal[j][tot][2] = v.index[2] - t2.index[3][2];
  174. }
  175. init_vector(&v);
  176. v.index[0] = -1.0;
  177. v.index[1] = -1.5;
  178. multiply_matrix_vector(&pos, &v);
  179. bnormal[0][tot][0] = v.index[0] - pos.index[3][0];
  180. bnormal[0][tot][1] = v.index[1] - pos.index[3][1];
  181. bnormal[0][tot][2] = v.index[2] - pos.index[3][2];
  182. init_vector(&v);
  183. v.index[2] = -1.0;
  184. v.index[1] = 1.5;
  185. multiply_matrix_vector(&pos, &v);
  186. bnormal[0][tot][0] = v.index[0] - pos.index[3][0];
  187. bnormal[0][tot][1] = v.index[1] - pos.index[3][1];
  188. bnormal[0][tot][2] = v.index[2] - pos.index[3][2];
  189. #if 0
  190. copy_matrix(&tmp, &pos);
  191. tmp.index[3][0] = 0.0;
  192. tmp.index[3][1] = 0.0;
  193. tmp.index[3][2] = 0.0;
  194. init_vector(&v);
  195. v.index[0] = 1.0;
  196. multiply_matrix_vector(&tmp, &v);
  197. nx = v.index[0];
  198. ny = v.index[1];
  199. nz = v.index[2];
  200. ac = sqrt(nx*nx+nz*nz);
  201. if (ac == 0.0)
  202.     r1[tot] = 0.0;
  203. else if (nx > 0)
  204.     r1[tot] = asin(nz/ac);
  205. else
  206.     r1[tot] = M_PI-asin(nz/ac);
  207. r2[tot] = asin(ny);
  208. rotate_y(-r1[tot], &tmp);
  209. rotate_z(-r2[tot], &tmp);
  210. init_vector(&v);
  211. v.index[1] = 1.0;
  212. multiply_matrix_vector(&tmp, &v);
  213. nx = v.index[0];
  214. ny = v.index[1];
  215. nz = v.index[2];
  216. ac = sqrt(nz*nz+ny*ny); /* this *should* be 1 */
  217. if (ac == 0.0)
  218.     r3[tot] = 0.0;
  219. else if (nz > 0)
  220.     r3[tot] = M_PI-asin(ny/ac);
  221. else
  222.     r3[tot] = asin(ny/ac);
  223. #endif
  224. copy_matrix(&tmp, &pos);
  225. rotate_x(-tot_al, &tmp);
  226. if (tmp.index[0][0] == 0.0 && tmp.index[0][1] == 0.0) {
  227.     r1[tot] = atan2(- tmp.index[1][0], - tmp.index[2][0]);
  228.     r2[tot] = 0.5 * M_PI;
  229.     r3[tot] = 0.0;
  230. } else {
  231.     r1[tot] = atan2(tmp.index[1][2], tmp.index[2][2]);
  232.     r2[tot] = asin(tmp.index[0][2]);
  233.     r3[tot] = atan2(tmp.index[0][1], tmp.index[0][0]);
  234. }
  235. #if 0
  236. printf("R: %f, %f, %f.n", r1[tot], r2[tot], r3[tot]);
  237. #endif
  238. tot ++;
  239.     }
  240. }
  241. else
  242.    fprintf(stderr, "Not understood: %sn", cmd);
  243.     }
  244.     printf("Done.nTotal of %d partsn", tot);
  245.     printf("Ended at %f, %f, %fn", x[tot-1], y[tot-1], z[tot-1]);
  246. }
  247. void update_parameters(void)
  248. {
  249.     update_parameter(&roll);
  250.     update_parameter(&pitch);
  251.     update_parameter(&heading);
  252.     update_parameter(&alignment);
  253. }
  254. void update_parameter(Parameter *p)
  255. {
  256.     if (!p->steps)
  257. return;
  258.     p->steps--;
  259.     p->value += p->speed;
  260. }
  261. void init_parameter(Parameter *p)
  262. {
  263.     p->value = 0;
  264.     p->speed = 0;
  265.     p->steps = 10;
  266. }