15757753770 发表于 2016-10-28 03:18:35

感染面 - 源代码 (梅雷)

本帖最后由 15757753770 于 2016-10-28 03:25 编辑

本人野路子门派, 函数全是公开的。程序最求 思路和算法,
感染算法 (梅雷)
面涂色,拆电极 都可能会用到的,
最近研究自动拆电极,发现区域曲面,的复杂度,比正常区域的复杂度要高很多感染算法 有半年时间 没更新了
个人精力有限, 感染算法 需要大量测试, ,,目前b曲面效果并不理想 , 一般的区域效果还可以

视频演示如下:

原理:如下代码

static int M001_预选对象时执行操作鼠标移动时操作( tag_t object, int type, void *user_data, UF_UI_selection_p_t select)
{

return (UF_UI_SEL_ACCEPT);
}
//初始化
static int M001_init_proc(UF_UI_selection_p_t select,void *user_data)
{
    if((UF_UI_set_sel_procs(select, M001_预选对象时执行操作鼠标移动时操作,NULL,user_data)) == 0)
    {
      return (UF_UI_SEL_SUCCESS);
    }
    else
    {
      return (UF_UI_SEL_FAILURE);
    }
}
static int M001_选择对象时执行操作(int num_selected,tag_p_t selected_objects,int num_deselected,
                                  tag_p_t deselected_objects,void *user_data,UF_UI_selection_p_t selection)
{
      int err,facen=0;
      tag_t faces;
    tag_p_t objs = NULL;
    int count = 0;
    UF_UI_ask_sel_object_list(M001_sel_data.value.selection,&count,&objs);
    if (count<1)
      {
                M001_选择面数量=0;
                return (UF_UI_CB_CONTINUE_DIALOG);
      }
      if (count<M001_选择面数量)
      {
            M001_选择面数量=count;
                return (UF_UI_CB_CONTINUE_DIALOG);
      }

      tag_t object_tag=objs;
          int i,j,a,b,c,n,ii,iii,面总数量=0;
          uf_list_p_t 临时边_list,临时面_list,面_list;
          UF_MODL_create_list(&M001_区域面_list);
          UF_MODL_create_list(&M001_重复面_list);
      UF_MODL_create_list(&M001_重复边_list);
          tag_t 当时相邻面;int 当时相邻面数量=0,临时相邻面数量=0;
          tag_t 当前计算面=NULL_TAG;
          tag_t 体=NULL_TAG;
          UF_MODL_ask_face_body(object_tag,&体);
          UF_MODL_create_list(&面_list);
          UF_MODL_ask_body_faces(体,&面_list);
          UF_MODL_ask_list_count(面_list,&面总数量);
   for ( iii=0;iii<M001_相邻面搜索次数;iii++)
   {
      if (iii==0)
      {
         临时相邻面数量=1;
         当时相邻面=object_tag;
      }
   当时相邻面数量=临时相邻面数量;临时相邻面数量=0;
   for ( ii=0;ii<当时相邻面数量;ii++)
   {
      当前计算面=当时相邻面;
          UF_MODL_create_list(&临时边_list);
          M001_面获得边缘(当前计算面,&临时边_list);
          b=0;UF_MODL_ask_list_count(临时边_list,&b);
          UF_MODL_create_list(&临时面_list);
          for ( i=0;i<b;i++)
          {
          tag_t edge_tag=NULL_TAG;
          UF_MODL_ask_list_item(临时边_list,i,&edge_tag);
            a=0;UF_MODL_ask_list_count(M001_重复边_list,&a);
                  UF_MODL_put_list_item(M001_重复边_list,edge_tag);
                  c=0;UF_MODL_ask_list_count(M001_重复边_list,&c);
                  uf_list_p_tface_list;UF_MODL_create_list(&face_list);
                  if (c>a)
                  {
                      UF_MODL_ask_edge_faces (edge_tag, &face_list);
                      n=0;UF_MODL_ask_list_count(face_list,&n);
                      for ( j=0;j<n;j++)
                      {
                                 tag_t face_tag=NULL_TAG;
               UF_MODL_ask_list_item(face_list,j,&face_tag);
               a=0;UF_MODL_ask_list_count(M001_重复面_list,&a);
               UF_MODL_put_list_item(M001_重复面_list,face_tag);
               c=0;UF_MODL_ask_list_count(M001_重复面_list,&c);
                           if (c>a)
                                 {
                                       err=M001_判断两个相邻面是否属于同一个凹槽(当前计算面,face_tag,edge_tag);//返回1表示两个相邻面属于同一个凹槽
                                       if (err==1)
                                       {
                                                 UF_MODL_put_list_item(M001_区域面_list,face_tag);
                                                 临时相邻面数量++;
                                                 当时相邻面[临时相邻面数量-1]=face_tag;
                                       }
                                    if (err==2)//感染外R - R区域拒止
                                    {
                                                 UF_MODL_put_list_item(M001_区域面_list,face_tag);
                                    }
                                 }
                                 if (c==面总数量 || c>面总数量)goto LL;
                        }
                  }
          }
   }
   }
LL:;


         facen=0;UF_MODL_ask_list_count(M001_区域面_list,&facen);
      for ( j=0;j<facen;j++)
      {
            tag_t face_tag=NULL_TAG;
      UF_MODL_ask_list_item(M001_区域面_list,j,&face_tag);
            faces=face_tag;
      }

//对象加入到对象选择列表
UF_UI_add_to_sel_list (M001_sel_data.value.selection, facen, faces, true);
M001_选择面数量=facen+1;
if (M001_点数量>0)
UF_OBJ_delete_array_of_objects(M001_点数量,M001_点tag,NULL);
M001_点数量=0;

return (UF_UI_CB_CONTINUE_DIALOG);
}



下载完整源代码

lizhaoyong* 发表于 2016-10-28 07:51:27

谢谢分享,来顶一下

lutao423 发表于 2016-11-9 21:30:53

看看怎么样

Ricardos_M_Lu 发表于 2016-12-18 21:47:07

这个怎么装啊

慢慢来吧 发表于 2018-1-16 10:46:42


谢谢分享,来顶一下

TULIP* 发表于 2018-10-17 15:53:55

谢谢分享,来顶一下

周日有孙工 发表于 2019-1-19 23:54:44

谢谢分享

qqq19303 发表于 2024-3-6 19:08:51

谢谢分享,来顶一下
页: [1]
查看完整版本: 感染面 - 源代码 (梅雷)