一、neighbours函数:houdini自带的有,是用来查找邻居顶点的,如:我门输入的5
,则会返回一个数组,装着1、4、6
二、自制neighbours函数
- 写法1:
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;
- len(参数1)函数:查看总点数
- find(参数1,参数2)函数:从参数一中找参数二,如果找不到会返回负值
- append(参数1,参数2)函数:将参数2添加到参数1中
- 写法2:
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;
- 将写法1写成方法(函数):
//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);
- 写法2写成方法:
//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);
网友评论