NX二次开发点通过云配准获取相同体

发布时间:2024年01月11日

先找到体的参考方向(这个参考方向对于相同体重合之后是相同的),这个时候我们的思路是三个不共线的点确定一个坐标系,然后和绝对方向求转换矩阵。然后获取体的所有边的几何中心,把这些点通过转换矩阵转换之后存起来,再和另外一个体转换之后的点数据作对比,在误差范围内配对点的数量等于体获取点的数量就是相同体(有的体没有边,只有面,那就通过大小和面重合来判断就行了,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);
}

?点云我写完了,代码有点多没时间敲,先放图片,将就看看,有时间我再放上去

?

有需要的话可以关注一下私信我

文章来源:https://blog.csdn.net/qq_39541524/article/details/135421687
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。