#ifndef _DATASTRUCT_H #define _DATASTRUCT_H #include "sysDefine.h" //直角坐标系下的一个点 struct cpoint { double x,y,z; cpoint(){x = y = z = MAX_DBL;} }; typedef vector cpointArray; //直角坐标点的一些数学运算 cpoint operator -(cpoint a, cpoint b) { cpoint m; m.x=a.x-b.x; m.y=a.y-b.y; m.z=a.z-b.z; return m; } cpoint operator +(cpoint a, cpoint b) //矢量加法 { cpoint m; m.x=a.x+b.x; m.y=a.y+b.y; m.z=a.z+b.z; return m; } cpoint operator *(double sign,cpoint b) //矢量乘法 { cpoint m; m.x=sign*b.x; m.y=sign*b.y; m.z=sign*b.z; return m; } //重载逻辑等操作符作用于矢量,判断两个直角点是否相等 bool operator ==(cpoint a, cpoint b) { if(fabs(a.x-b.x) spointArray; /*直角坐标与球坐标相互转换函数 注意这里使用的球坐标是地理坐标范围 即经度为-180~180 纬度为-90~90*/ cpoint s2c(spoint s) { cpoint c; c.x = s.rad*sin((0.5 - s.lat/180.0)*pi)*cos((2.0 + s.lon/180.0)*pi); c.y = s.rad*sin((0.5 - s.lat/180.0)*pi)*sin((2.0 + s.lon/180.0)*pi); c.z = s.rad*cos((0.5 - s.lat/180.0)*pi); return c; } spoint c2s(cpoint c) { spoint s; s.rad = sqrt(pow(c.x,2)+pow(c.y,2)+pow(c.z,2)); if (fabs(s.rad) vertexArray; typedef map idMap; //顶点索引值映射 用于通过索引值寻找相应顶点 typedef map strMap; //顶点位置映射 用于通过顶点位置寻找相应顶点 typedef map outIdMap; //输出msh文件时重新索引三角形顶点集 //三角形信息结构体,包含三角形的三个顶点索引,逆时针排序 struct triangle { int id; int vec[3];//三角形顶点 int phys; //三角形的物理属性组 triangle() //初始化顶点索引 { phys = 0; //默认的物理属性组为0 vec[0] = vec[1] = vec[2] = -1; } }; typedef vector triangleArray; //矢量与平面的交点 cpoint lineOnPlane(cpoint c,cpoint normal,cpoint p) { cpoint m; m.x = 0; m.y = 0; m.z = 0; double t; if (dot(normal,p) != 0) //平面与矢量平行 { t = dot(normal,c)/dot(normal,p); m.x += p.x*t; m.y += p.y*t; m.z += p.z*t; } return m; } //细分三角形面积比形式的三角形内插值函数 double triInterp_area(cpoint p,cpoint p1,cpoint p2,cpoint p3,double d1,double d2,double d3) { cpoint pp1 = p1 - p; cpoint pp2 = p2 - p; cpoint pp3 = p3 - p; //三角形的面积等于叉乘的1/2 这里只计算比值 所以不需要乘以1/2 double a1 = module(cross(pp2,pp3)); double a2 = module(cross(pp3,pp1)); double a3 = module(cross(pp1,pp2)); return (d1*a1+d2*a2+d3*a3)/(a1+a2+a3);; } #endif