281 lines
5.5 KiB
C++
281 lines
5.5 KiB
C++
#ifndef _DATA_FUNC_H
|
||
#define _DATA_FUNC_H
|
||
#include <iostream>
|
||
#include <fstream>
|
||
#include <sstream>
|
||
#include <string.h>
|
||
#include <cmath>
|
||
#include <iomanip>
|
||
#include <ctime>
|
||
#include <list>
|
||
#include <omp.h>
|
||
#include <map>
|
||
#include <stdlib.h>
|
||
#include <stdio.h>
|
||
#include <unistd.h>
|
||
#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> 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> edge_list;
|
||
|
||
struct face
|
||
{
|
||
int No;
|
||
int ver[3];
|
||
int nature;
|
||
double F[3][3];
|
||
};
|
||
typedef list<face> 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&&i<j)
|
||
{
|
||
L1=i;
|
||
L2=j;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
int re_order(point3d refer,point3d point1,point3d &point2,point3d &point3)
|
||
{
|
||
point3d v12=point2-point1;
|
||
point3d v23=point3-point2;
|
||
point3d v_ref=refer-point1;
|
||
|
||
point3d v_nor = cross(v12,v23);
|
||
|
||
if(dot(v_ref,v_nor)>0)
|
||
{
|
||
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 |