#ifndef _DATA_FUNC_H #define _DATA_FUNC_H #include #include #include #include #include #include #include #include #include #include #include #include #include #define G0 6.67191e-3 #define pi 3.1415926535897932384626433832795 #define T0 50000 #define DBL_MAX 1e+36 using namespace std; // ∏¡øΩ·ππ”Î∫Ø ˝ struct point3d //∂®“ ∏¡øΩ·ππà{ double x,y,z; }; point3d operator -(point3d a, point3d b)//÷ÿ‘ÿºı∫≈≤Ÿ◊˜∑˚◊˜”√”⁄ ∏¡ø { point3d m; m.x=a.x-b.x; m.y=a.y-b.y; m.z=a.z-b.z; return m; } point3d operator *(int sign,point3d b)//÷ÿ‘ÿ≥À∫≈≤Ÿ◊˜∑˚◊˜”√”⁄ ∏¡ø { point3d m; m.x=sign*b.x; m.y=sign*b.y; m.z=sign*b.z; return m; } bool operator ==(point3d a, point3d b)//÷ÿ‘ÿ¬flº≠µ»≤Ÿ◊˜∑˚◊˜”√”⁄ ∏¡ø { if(a.x==b.x&&a.y==b.y&&a.z==b.z) { return 1; } else return 0; } point3d point3d_martix(point3d a,double *m)//∂®“ ∏¡ø«∞≥Àæÿ’Û { point3d v; double ma[3][3]; for(int i=0;i<3;i++) { for(int j=0;j<3;j++) { ma[i][j] = *(m+i*3+j); } } v.x = a.x*ma[0][0]+a.y*ma[1][0]+a.z*ma[2][0]; v.y = a.x*ma[0][1]+a.y*ma[1][1]+a.z*ma[2][1]; v.z = a.x*ma[0][2]+a.y*ma[1][2]+a.z*ma[2][2]; return v; } point3d martix_point3d(point3d a,double *m)//∂®“ ∏¡ø∫Û≥Àæÿ’Û { point3d v; double ma[3][3]; for(int i=0;i<3;i++) { for(int j=0;j<3;j++) { ma[i][j] = *(m+i*3+j); } } v.x = a.x*ma[0][0]+a.y*ma[0][1]+a.z*ma[0][2]; v.y = a.x*ma[1][0]+a.y*ma[1][1]+a.z*ma[1][2]; v.z = a.x*ma[2][0]+a.y*ma[2][1]+a.z*ma[2][2]; return v; } double dot(point3d a, point3d b)//∂®“ ∏¡øµ„≥À { return a.x*b.x+a.y*b.y+a.z*b.z; } point3d cross(point3d a,point3d b)//∂®“ ∏¡ø≤Ê≥À { point3d v; v.x = a.y*b.z-a.z*b.y; v.y = a.z*b.x-a.x*b.z; v.z = a.x*b.y-a.y*b.x; return v; } double* kron_v(point3d a,point3d b)//∂®“ ∏¡ø’≈¡øª˝ { double t[3][3]; t[0][0]=a.x*b.x; t[0][1]=a.x*b.y; t[0][2]=a.x*b.z; t[1][0]=a.y*b.x; t[1][1]=a.y*b.y; t[1][2]=a.y*b.z; t[2][0]=a.z*b.x; t[2][1]=a.z*b.y; t[2][2]=a.z*b.z; return t[0]; } double L_point3d(point3d v)//«Û ∏¡øæ‡◊¯±Í‘≠µ„懿Π{ return sqrt(v.x*v.x+v.y*v.y+v.z*v.z); } double Dis_point3d(point3d a,point3d b)//«Û¡Ω∏ˆ ∏¡ø÷’∂À懿Π{ return sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2)+pow(a.z-b.z,2)); } point3d nor_point3d(point3d v)//º∆À„“ª∏ˆ ∏¡øµƒµ•Œª ∏¡ø { double Length; point3d nor_v; Length = sqrt(v.x*v.x+v.y*v.y+v.z*v.z); nor_v.x = v.x/Length; nor_v.y = v.y/Length; nor_v.z = v.z/Length; return nor_v; } //æÿ’Û∫Ø ˝ double *martix_martix(double *a,double *b)//æÿ’Ûœ‡≥Àa*b { double m[3][3],t[3][3],r[3][3]; int i,j; for(i=0;i<3;i++) { for(j=0;j<3;j++) { t[i][j] = *(a+i*3+j); r[i][j] = *(b+i*3+j); } } for(i=0;i<3;i++) { for(j=0;j<3;j++) { m[i][j] = t[i][0]*r[0][j]+t[i][1]*r[1][j]+t[i][2]*r[2][j]; } } return m[0]; } double *martix_T(double *a)//æÿ’Û◊™÷√ { double m[3][3],r[3][3]; int i,j; for(i=0;i<3;i++) { for(j=0;j<3;j++) { r[i][j] = *(a+i*3+j); } } for(i=0;i<3;i++) { for(j=0;j<3;j++) { m[i][j] = r[j][i]; } } return m[0]; } // ˝æ›Ω·ππ”Î≤Ÿ◊˜ //////////////////////////////////////////////////////////////////////// struct F//√Ê’≈¡øª˝ { double kron[3][3]; }; struct E//±fl’≈¡øª˝ { double kron[3][3]; }; struct tetra //∂®“ÂÀƒ√ÊÃÂΩ·ππà{ int No;//Àƒ√ÊÖÚ∫≈ int ver[4];//œ‡”¶Àƒ√ÊÃÂ∂•µ„–Ú∫≈ int ordered_ver[4][3];//≈≈–Ú∫ÛµƒÀƒ∏ˆ√ʵƒµ„À˜“˝∫≈ double *attribute;//Àƒ√Êàٖ‘÷∏’Î F F_kron[4];//Àƒ√ÊÃÂ√Ê’≈¡øª˝ E E_kron[6];//Àƒ√Êñfl’≈¡øª˝ double E_len[6];//Àƒ√Êñfl≥§∂» }; typedef list tetra_list; struct vertex //∂®“Â∂•µ„Ω·ππà{ int No;//∂•µ„–Ú∫≈ point3d vt;;//∂•µ„◊¯±Í }; struct edge { int No; int ver[2]; int nature; double length; double E[3][3]; }; typedef list edge_list; struct face { int No; int ver[3]; int nature; double F[3][3]; }; typedef list face_list; struct sphere_point//«Ú◊¯±Íµ„Ω·ππà{ double phi,thet,radius; }; point3d SCS2CCS(sphere_point p1)//«Ú◊¯±Í◊™÷±Ω«◊¯±Í { point3d v; v.x = p1.radius*sin((0.5-p1.thet/180.0)*pi)*cos((2.0+p1.phi/180.0)*pi); v.y = p1.radius*sin((0.5-p1.thet/180.0)*pi)*sin((2.0+p1.phi/180.0)*pi); v.z = p1.radius*cos((0.5-p1.thet/180.0)*pi); return v; } void find_left(int &L1,int &L2,int e,int e2) { for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { if(i!=j&&i!=e&&i!=e2&&j!=e&&j!=e2&&i0) { point3d temp; temp=point2;point2=point3;point3=temp; return 1; } else return 0; } void re_order2(point3d v1,point3d v2,point3d &ref1,point3d &ref2) { point3d v12=v2-v1; point3d v1ref1=ref1-v1; point3d v1ref2=ref2-v1; point3d nor_v121ref1=cross(v12,v1ref1); if(dot(nor_v121ref1,v1ref2)>0) { point3d temp; temp=ref1;ref1=ref2;ref2=temp; } } #endif