trixd.c

来自「细胞自动机的一个源代码」· C语言 代码 · 共 477 行

C
477
字号
/*are for kids!  matrix library...  matrix[ROW][COLUMN]  vectors are defined to be column vectors  if we have points in a 3x3 matrix, they are in the COLUMNS of the matrix  matricies should always be thought of as being multiplied on the LEFT of the    vector...i.e. A*v  thank you  internal rep. of matricies is  [row]  [column]  *---->x x x x  *---->x x x x  *---->x x x x  *---->x x x x   *---->x x x x  would represent a 5x4 matrix  makedyntrixd     - constructor  destroydyntrixd  - destructor  printtrixd - print the matrix to stdout, for debuggin'  trixmultd  - a*b --> out  trixrottz  - a rotated by theta --> b  trixrotty  - a rotated by theta --> b  trixrottx  - a rotated by theta --> b  trixtransd  - translates trix by double vec  trixtrans3d - blah  lengthsqd -length squared of trixpoint  lengthd   -length of trix point  length2d  -length between two trixd points  lengthsq2d-length between two trixd points squared  closestpoint*/#include "trixd.h"void printtrixd(trixd *m) {  int i, j;  for (i=0; i<(m->row); i++) {    for (j=0; j<(m->column); j++) {      printf("%f ", (float)((m->d)[i][j]));    }    printf("\n");  }}/*mat not to be allocated before calling this function (this function  will allocate space for it).  mat will be a rowXcolumn matrix*/trixd *makedyntrixd(int row, int column) {  int i, j, k;  trixd *m;  m = (trixd *)malloc(sizeof(trixd));  m->d = malloc( (sizeof(double *)*row) + (sizeof(double)*row*column));  /*ansi c should be smart enough to know that i'm referencing double * stuff*/  /*not sure, but this code probably isn't that portable (but its still cool)*/  for (i=0; i<row; i++) {    j = (int)m->d;    j+=row*sizeof(double *);    j+=i*column*sizeof(double);    m->d[i]=(double *)j;    /*    m->d[i] = (double *)m->d + row + i*column;    */  }  for (i=0; i<row; i++) {    for (j=0; j<column; j++) {      m->d[i][j]=(double)((i*column)+j);    }  }  m->row = row;  m->column = column;  m->f = NULL;  m->fpos = NULL;  m->dpos = m->d[m->row];  m->dpos = &(m->d[0][0]);  /*  m->dpos = m->d + row;/*this won't work as of right now...change later*/  return(m);}int destroydyntrixd(trixd *m) {  int i, j;  free(m->d);  free(m);  return(0);}/*translate inp[][3] by vec[3], put in oot*//*void trans(double inp[][3], double oot[][3], double t[3], int n) {*/void trixtrans3d(trixd *inp, double x, double y, double z) {  int i, j;  for (i=0; i<(inp->column); i++) {    inp->d[0][i]+=x;    inp->d[1][i]+=y;    inp->d[2][i]+=z;  }}/*void trixtransd(trixd *inp, double *v) {  int i, j;  for (i=0; i<(inp->column); i++) {    inp->d[0][i]+=v[0];    inp->d[1][i]+=v[1];    inp->d[2][i]+=v[2];  }}*/void trixtransd(trixd *inp, trixd *outp, double x, double y, double z) {  int i, j, k;  static trixd *tem = NULL;  tem = ( tem ? tem : makedyntrixd(4, 4) );  for (i=0; i<4; i++) {    for (j=0; j<4; j++) {      tem->d[i][j]=((i==j)?1.0:0.0);    }  }  tem->d[0][3] = x;  tem->d[1][3] = y;  tem->d[2][3] = z;  /*  printf("trixtransd:\n");  printf("  tem\n");  printtrixd(tem);  printf("  inp\n");  printtrixd(inp);  */  trixmultd(tem, inp, outp);  //printf("  outp\n");  //printtrixd(outp);}trixd *trixmultd(trixd *l, trixd *r, trixd *out) {  int i, j, k;  for (i=0; i<(l->row); i++) {    for (j=0; j<(r->column); j++) {      out->d[i][j]=0.0;      for (k=0; k<(l->column); k++) {	out->d[i][j]+= (l->d[i][k])*(r->d[k][j]);      }    }  }  return(out);}void trixrottzd(trixd *inp, trixd *outp, double theta) {  int i, j, k;  static trixd *rd=NULL;  rd = (rd ? rd : makedyntrixd(4, 4));  rd->d[0][0]=cos(theta*PI/180.0);  rd->d[0][1]=-sin(theta*PI/180.0);  rd->d[1][0]=-(rd->d[0][1]);  rd->d[1][1]=rd->d[0][0];  rd->d[2][0]=rd->d[2][1]=rd->d[0][2]=rd->d[1][2]=0.0;  rd->d[2][2]=1.0;  rd->d[0][3]=0.0;  rd->d[1][3]=0.0;  rd->d[2][3]=0.0;  rd->d[3][0]=0.0;  rd->d[3][1]=0.0;  rd->d[3][2]=0.0;  rd->d[3][3]=1.0;  trixmultd(rd, inp, outp);  /*  destroydyntrixd(rd); */}void trixrottyd(trixd *inp, trixd *outp, double theta) {  int i, j, k;  static trixd *rd=NULL;  rd = (rd ? rd : makedyntrixd(4, 4));  rd->d[0][0]=cos(theta*PI/180.0);  rd->d[0][2]=sin(theta*PI/180.0);  rd->d[2][0]=-rd->d[0][2];  rd->d[2][2]=rd->d[0][0];  rd->d[1][1]=1.0;  rd->d[1][0]=rd->d[1][2]=rd->d[0][1]=rd->d[2][1]=0.0;  rd->d[0][3]=0.0;  rd->d[1][3]=0.0;  rd->d[2][3]=0.0;  rd->d[3][0]=0.0;  rd->d[3][1]=0.0;  rd->d[3][2]=0.0;  rd->d[3][3]=1.0;  trixmultd(rd, inp, outp);  /*  destroydyntrixd(rd); */}void trixrottxd(trixd *inp, trixd *outp, double theta) {  int i, j, k;  static trixd *rd=NULL;  rd = (rd ? rd : makedyntrixd(4, 4));  rd->d[0][0]=1.0;  rd->d[0][1]=rd->d[0][2]=rd->d[1][0]=rd->d[2][0]=0.0;  rd->d[1][1]=rd->d[2][2]=cos(theta*PI/180.0);  rd->d[2][1]=sin(theta*PI/180.0);  rd->d[1][2]=-rd->d[2][1];  rd->d[0][3]=0.0;  rd->d[1][3]=0.0;  rd->d[2][3]=0.0;  rd->d[3][0]=0.0;  rd->d[3][1]=0.0;  rd->d[3][2]=0.0;  rd->d[3][3]=1.0;  trixmultd(rd, inp, outp);  /*  destroydyntrixd(rd); */}void trixrottd(trixd *inp, trixd *outp, double theta,	       double x, double y, double z) {  int i, j, k;  static trixd *rd=NULL;  double c, s, omc;  double len;  rd = (rd ? rd : makedyntrixd(4, 4));  c = cos(theta*PI/180.0);  s = sin(theta*PI/180.0);  omc = 1.0 - c;  len = sqrt((x*x)+(y*y)+(z*z));  if ( (len<.99999) || (len>1.000001) ) {    x/=len;    y/=len;    z/=len;  }  rd->d[0][0]=(x*x*omc)+c;  rd->d[0][1]=(x*y*omc)-(z*s);  rd->d[0][2]=(x*z*omc)+(y*s);  rd->d[0][3]=0.0;  rd->d[1][0]=(y*x*omc)+(z*s);  rd->d[1][1]=(y*y*omc)+c;  rd->d[1][2]=(y*z*omc)-(x*s);  rd->d[1][3]=0.0;  rd->d[2][0]=(x*z*omc)-(y*s);  rd->d[2][1]=(y*z*omc)+(x*s);  rd->d[2][2]=(z*z*omc)+c;  rd->d[2][3]=0.0;  rd->d[3][0]=0.0;  rd->d[3][1]=0.0;  rd->d[3][2]=0.0;  rd->d[3][3]=1.0;  trixmultd(rd, inp, outp);}/*rotate nx3  inp matrix by theta (in degrees), put it oot*/void rottz(double inp[][3], double oot[][3], double theta, int n) {  int i, j, k;  double rot[3][3], t;  rot[0][0]=cos(theta*PI/180.0);  rot[0][1]=-sin(theta*PI/180.0);  rot[1][0]=-rot[0][1];  rot[1][1]=rot[0][0];  rot[2][0]=rot[2][1]=rot[0][2]=rot[1][2]=0.0;  rot[2][2]=1.0;  for (i=0; i<n; i++) {    for (j=0; j<3; j++) {      t=0.0;      for (k=0; k<3; k++) {	t+=inp[i][k]*rot[j][k];      }      oot[i][j]=t;    }  }}void rotty(double inp[][3], double oot[][3], double theta, int n) {  int i, j, k;  double rot[3][3], t;  rot[0][0]=cos(theta*PI/180.0);  rot[0][2]=sin(theta*PI/180.0);  rot[2][0]=-rot[0][2];  rot[2][2]=rot[0][0];  rot[1][1]=1.0;  rot[1][0]=rot[1][2]=rot[0][1]=rot[2][1]=0.0;  for (i=0; i<n; i++) {    for (j=0; j<3; j++) {      t=0.0;      for (k=0; k<3; k++) {	t+=inp[i][k]*rot[j][k];      }      oot[i][j]=t;    }  }}void rottx(double inp[][3], double oot[][3], double theta, int n) {  int i, j, k;  double rot[3][3], t;  rot[0][0]=1.0;  rot[0][1]=rot[0][2]=rot[1][0]=rot[2][0]=0.0;  rot[1][1]=rot[2][2]=cos(theta*PI/180.0);  rot[2][1]=sin(theta*PI/180.0);  rot[1][2]=-rot[2][1];    for (i=0; i<n; i++) {    for (j=0; j<3; j++) {      t=0.0;      for (k=0; k<3; k++) {	t+=inp[i][k]*rot[j][k];      }      oot[i][j]=t;    }  }}/*find point on line of p1 to p2, closest to p3*/int trixclosepnt(trixd *p1, trixd *p2, trixd *p3, trixd *oot) {  int i, j, k;  double tem, len;  double v1[3], v2[3];  v1[0] = p2->d[0][0] - p1->d[0][0];    v1[1] = p2->d[1][0] - p1->d[1][0];  v1[2] = p2->d[2][0] - p1->d[2][0];  v2[0] = p3->d[0][0] - p1->d[0][0];  v2[1] = p3->d[1][0] - p1->d[1][0];  v2[2] = p3->d[2][0] - p1->d[2][0];  tem=len=0.0;  for (i=0; i<3; i++) {    tem+=v1[i]*v2[i];    len+=v1[i]*v1[i];  }  for (i=0; i<3; i++) {    v1[i]*=tem/len;    v1[i]+=p1->d[i][0];    oot->d[i][0]=v1[i];  }  return(1);}double trixlensq2d(trixd *p1, trixd *p2) {  int i;  double temp, v[3];  temp=0.0;  for (i=0; i<3; i++) {    v[i] = p1->d[i][0] - p2->d[i][0];    temp+=v[i]*v[i];  }  return(temp);}double trixlen2d(trixd *p1, trixd *p2) {  int i;  double temp, v[3];  temp=0.0;  for (i=0; i<3; i++) {    v[i] = p1->d[i][0] - p2->d[i][0];    temp+=v[i]*v[i];  }  return(sqrt(temp));}double trixlensqd(trixd *p1) {  return( ((p1->d[0][0])*(p1->d[0][0])) + ((p1->d[1][0])*(p1->d[1][0])) + ((p1->d[2][0])*(p1->d[2][0]))); }double trixlend(trixd *p1) {  return( sqrt( ((p1->d[0][0])*(p1->d[0][0])) + ((p1->d[1][0])*(p1->d[1][0])) + ((p1->d[2][0])*(p1->d[2][0]))));}/*int main(void) {  trixd *p1, *p2, *p3;  trixd *out;  p1 = makedyntrixd(4, 1);  p2 = makedyntrixd(4, 1);  p3 = makedyntrixd(3, 1);  out = makedyntrixd(3, 1);  p1->d[0][0]=1.0;  p1->d[1][0]=1.0;  p1->d[2][0]=0.0;  p1->d[3][0]=1.0;    p2->d[0][0]=4.0;  p2->d[1][0]=2.0;  p2->d[2][0]=0.0;  p2->d[3][0]=1.0;  p3->d[0][0]=3.0;  p3->d[1][0]=3.0;  p3->d[2][0]=0.0;  trixclosepnt(p1, p2, p3, out);  printtrixd(out);  printf("p1: %f %f %f\n", p1->d[0][0], p1->d[1][0], p1->d[2][0]);  trixrottd(p1, p2, 90.0, 1.0, 0.0, 0.0);  printf("p2: %f %f %f\n", p2->d[0][0], p2->d[1][0], p2->d[2][0]);  trixrottd(p2, p1, 90.0, 1.0, 0.0, 0.0);  printf("p1: %f %f %f\n", p1->d[0][0], p1->d[1][0], p1->d[2][0]);  trixrottd(p1, p2, 90.0, 1.0, 0.0, 0.0);  printf("p2: %f %f %f\n", p2->d[0][0], p2->d[1][0], p2->d[2][0]);  trixrottd(p2, p1, 90.0, 1.0, 0.0, 0.0);  printf("p1: %f %f %f\n", p1->d[0][0], p1->d[1][0], p1->d[2][0]);}*/

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?