QQ登录

只需一步,快速开始

快捷登录

登录 或者 注册 请先

UG爱好者

查看: 5050|回复: 7
打印 上一主题 下一主题

[分享] 感染面 - 源代码 (梅雷)

[复制链接]

少尉

Rank: 5Rank: 5

51

主题

75

帖子

2258

积分
跳转到指定楼层
楼主
发表于 2016-10-28 03:18:35 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 15757753770 于 2016-10-28 03:25 编辑

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

视频演示如下:

原理:  如下代码

static int M001_预选对象时执行操作鼠标移动时操作( tag_t object, int type[3], 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[2000];
    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[count-1];
          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 当时相邻面[2000];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;
           当时相邻面[iii]=object_tag;
      }
   当时相邻面数量=临时相邻面数量;临时相邻面数量=0;
   for ( ii=0;ii<当时相邻面数量;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_t  face_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[j]=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);
}



下载完整源代码 完整源代码.rar (14.52 KB, 下载次数: 286)

有奖推广贴子: 

回复

使用道具 举报

少将

Rank: 8Rank: 8

53

主题

3233

帖子

2万

积分

灌水王活跃会员

沙发
发表于 2016-10-28 07:51:27 | 只看该作者
谢谢分享,来顶一下
回复 支持 反对

使用道具 举报

六级士官

Rank: 4

7

主题

175

帖子

1121

积分
板凳
发表于 2016-11-9 21:30:53 | 只看该作者
看看怎么样
回复 支持 反对

使用道具 举报

上等兵

Rank: 1

0

主题

17

帖子

128

积分
地板
发表于 2016-12-18 21:47:07 | 只看该作者
这个怎么装啊
回复 支持 反对

使用道具 举报

六级士官

Rank: 4

2

主题

112

帖子

1501

积分
5#
发表于 2018-1-16 10:46:42 | 只看该作者

谢谢分享,来顶一下
回复 支持 反对

使用道具 举报

上等兵

Rank: 1

0

主题

29

帖子

199

积分
6#
发表于 2018-10-17 15:53:55 | 只看该作者
谢谢分享,来顶一下
回复 支持 反对

使用道具 举报

三级士官

Rank: 3Rank: 3

2

主题

116

帖子

514

积分
8#
发表于 2024-3-6 19:08:51 | 只看该作者
谢谢分享,来顶一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

 
 
QQ:1359218528
工作时间:
9:00-17:00
 
微信公众号
手机APP
机械社区
微信小程序

手机版|UG爱好者论坛 ( 京ICP备10217105号-2 )    论坛管理员QQ:1359218528

本站信息均由会员发表,不代表本网站立场,如侵犯了您的权利请联系管理员,邮箱:1359218528@qq.com  

Powered by UG爱好者 X3.2  © 2001-2014 Comsenz Inc. GMT+8, 2024-11-22 12:58

返回顶部