Houdini VEX(十一)自制Neighbours函数

2019-08-06  本文已影响0人  Joe_Game

一、neighbours函数:houdini自带的有,是用来查找邻居顶点的,如:我门输入的5
,则会返回一个数组,装着1、4、6



二、自制neighbours函数

int prims[] = pointprims(0,@ptnum);//以5号点为例,5 1 0号面都包含了5号点

int pts[];
int nb[];
int npt;
int ptprev = -1;
int ptnext = -1;

foreach(int prim; prims)           //遍历5 1 0面
{    
    pts = primpoints(0,prim);      //5 1 0面中以5号面为例,有5 6 7 4号点,这个数组是按连接顺序排的的
    npt = len(pts);                //5号面的总点数量 是4
    int myIndex = find(pts,@ptnum);//查找5号点自身在这个数组中哪个位置
    
    if( myIndex == 0 )             //在首位,比如5 6 7 4
    {        
        ptprev = pts[npt-1];       //前一个是 该数组最后一个 4
        ptnext = pts[1];           //后一个是 自己的下一个   6
    }
    else if( myIndex == npt-1 )    //在尾部,比如6 7 4 5
    {
        ptprev = pts[myIndex-1];   //前一个是 自己的前一个  4
        ptnext = pts[0];           //后一个是 该数组第一个  6
    }    
    else                           //在中间,比如6 5 4 7       
    {
        ptprev = pts[myIndex-1];   //前一个是 自己的前一个 6
        ptnext = pts[myIndex+1];   //后一个是 自己的下一个 4
    }
    if( find(nb, ptprev) < 0 )     //5号面得出邻居46,1号面得出16,0得出14,有重复
        append(nb,ptprev);         //比如算完5号面已知邻居46,存放在数组nb
    if( find(nb, ptnext) < 0 )     //下一步1号面得出邻居1号点,往nb数组附加
        append(nb,ptnext);         //如果找不到点1在nb里面的位置(即nb里面不存在点1),find()返回负值
}//则附加上去,再下一步1号面得出邻居6号点,发现6在nb里面的位置是1(即存在点6),find()返回非负值,则不附加
i[]@nb = nb;
int primnum = -1;
int vtx     = -1;
int nvtx    = 0;
int ptprev = -1;
int ptnext = -1;
int nb[];

foreach(int lvtxnum; lvtx)//对于3个线性序号中的每一个线性序号
{
    primnum = vertexprim(0,lvtxnum);     //求面序号
    vtx     = vertexprimindex(0,lvtxnum);//求顶点序号
    nvtx    = primvertexcount(0,primnum);//求这个面的顶点总数
    //特殊情况vtx=0(第一个顶点) 或vtx=nvtx-1 (最后一个顶点)
    if( vtx == 0 )                            //primpoint()通过面序号和顶点序号 来获取点序号
    {                                         //顶点序号为0
        ptprev = primpoint(0,primnum,nvtx-1); // 一个prim可能有n个顶点,前一个为n
        ptnext = primpoint(0,primnum,1);      // 后一个1
    }
    else if( vtx == nvtx-1 )                  //顶点为n
    {
        ptprev = primpoint(0,primnum,vtx-1);  // 前一个n-1
        ptnext = primpoint(0,primnum,0);      // 后一个0
    }
    else                                      //顶点为任何中间顶点i
    {
        ptprev = primpoint(0,primnum,vtx-1); // 前一个i-1
        ptnext = primpoint(0,primnum,vtx+1); // 后一个i+1
    }
    if( find(nb,ptprev) < 0 )
        append(nb,ptprev);
    if( find(nb,ptnext) < 0 )
        append(nb,ptnext); 
}
i[]@nb = nb;
//function 返回值类型 方法名(形参类型 形参名...)
function int[] nb(int ptnum)
{    
    int prims[] = pointprims(0,ptnum);
    
    int pts[];
    int nb[];
    int npt;
    int ptprev = -1;
    int ptnext = -1;
    
    foreach(int prim; prims)
    {    
        pts = primpoints(0,prim);    
        npt = len(pts);
        int myIndex = find(pts,ptnum);
        
        if( myIndex == 0 )
        {        
            ptprev = pts[npt-1];
            ptnext = pts[myIndex+1];
        }
        else if( myIndex == npt-1 )
        {
            ptprev = pts[myIndex-1];
            ptnext = pts[0];
        }    
        else
        {
            ptprev = pts[myIndex-1];
            ptnext = pts[myIndex+1];
        }
        if( find(nb, ptprev) < 0 )
            append(nb,ptprev);
        if( find(nb, ptnext) < 0 )
            append(nb,ptnext);
    }
    return nb;//对应方法的返回值类型
}
//调用上面写的nb方法
i[]@nb = nb(@ptnum);

//function 返回值类型 方法名(形参类型 形参名...)
function int[] nb(int ptnum)
{
    int lvtx[] = pointvertices(0,ptnum);
                                       
    int primnum = -1;
    int vtx     = -1;
    int nvtx    = 0;
    int ptprev = -1;
    int ptnext = -1;
    int nb[];
    
    foreach(int lvtxnum; lvtx)
    {
        primnum = vertexprim(0,lvtxnum);    
        vtx     = vertexprimindex(0,lvtxnum);
        nvtx    = primvertexcount(0,primnum);
        if( vtx == 0 )                            
        {                                        
            ptprev = primpoint(0,primnum,nvtx-1); 
            ptnext = primpoint(0,primnum,1);     
        }
        else if( vtx == nvtx-1 )               
        {
            ptprev = primpoint(0,primnum,vtx-1);  
            ptnext = primpoint(0,primnum,0);    
        }
        else                                      
        {
            ptprev = primpoint(0,primnum,vtx-1);
            ptnext = primpoint(0,primnum,vtx+1);
        }
        if( find(nb,ptprev) < 0 )
            append(nb,ptprev);
        if( find(nb,ptnext) < 0 )
            append(nb,ptnext); 
    }
    return nb;//对应方法的返回值类型
}

//调用上面写的nb方法
i[]@nb = nb(@ptnum);

上一篇 下一篇

猜你喜欢

热点阅读