少尉
UID2367596
U币1
G币2058
技术0
主题51
精华1
阅读权限75
注册时间2015-6-28
最后登录2021-3-13
在线时间69 小时
居住地浙江省 温州市 乐清市 乐成镇
QQ
手机15757753770
出生地辽宁省 大连市
少尉
|
本帖最后由 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)
|
|