先找到体的参考方向(这个参考方向对于相同体重合之后是相同的),这个时候我们的思路是三个不共线的点确定一个坐标系,然后和绝对方向求转换矩阵。然后获取体的所有边的几何中心,把这些点通过转换矩阵转换之后存起来,再和另外一个体转换之后的点数据作对比,在误差范围内配对点的数量等于体获取点的数量就是相同体(有的体没有边,只有面,那就通过大小和面重合来判断就行了,PK函数有判断面重合,我的PK专栏有写),具体实现代码如下:
//需要用到的结构体
struct BODYDATA
{
tag_t body_tag;//体的tag
tag_t ps_tag;//转PK的tag
PK_EDGE_t* edge;//体的所有边
PK_FACE_t* face;//体的所有面
PK_EDGE_t first_edge;//体的第一条边
PK_FACE_t first_face;//体的第一个面
double transorigin[3];//最小包络框的中心,即转换原点
double dirx[3];//体的转换方向
double diry[3];//体的转换方向
double MinBlockLen[3];//最小包络框的长宽高
int edge_num;//边的数量
int face_num;//面的数量
int topol_num;//子类型的数量
int num_reation;
int ver_num;//顶点的数量
BODYDATA()//初始化结构体数据
{
for(int i=0;i<3;i++)
{
MinBlockLen[i]=0;
}
dirx[0]=1;
dirx[1]=0;
dirx[2]=0;
diry[0]=0;
diry[1]=1;
diry[2]=0;
body_tag=NULL;
edge=NULL;
face=NULL;
edge_num=0;
face_num=0;
ver_num=0;
num_reation=0;
topol_num=0;
}
}
void GetBodyData(BODYDATA& bodydata)
{
PK_VERTEX_t vertiex;
PK_BODY_ask_faces(bodydata.ps_tag,&bodydata.face_num,&bodydata.face);//PK获取体的所有面
PK_BODY_ask_edges(bodydata.ps_tag,&bodydata.edge_num,&bodydata.edge);//PK获取体的所有边
PK_BODY_ask_vertices(bodydata.ps_tag,&bodydata.ver_num,&vertiex);//pk或取体的所有顶点
PK_BODY_ask_first_edge(bodydata.ps_tag,&bodydata.first_edge);//PK获取体的第一条边
PK_BODY_ask_first_face(bodydata.ps_tag,&bodydata.first_face);//PK获取体的第一个面
PK_BODY_ask_topology_o_t options;
PK_BODY_ask_topology_o_m(options);
PK_TOPOL_t* topols;
PK_CLASS_t* class_type;
int numrelation=0;
int* parents;
int* children;
PK_TOPOL_sense_t* senses;
PK_BODY_ask_topology(bodydata.ps_tag,&options,&bodydata.topol_num,&topols,&class_type,&bodydata.num_reateion,&parents,&children,&senses);
}
点云我写完了,代码有点多没时间敲,先放图片,将就看看,有时间我再放上去
有需要的话可以关注一下私信我