ループしているエッジの頂点リスト(エッジ数x2の大きさの配列)から、頂点コネクションのリスト(頂点数の配列)を取得するtemplate関数を載せます。Maya APIでpolygonを作るときに面の頂点コネクションのリストが必要になるんですが、エッジの頂点リストだけしか求まっていないという状況に直面してしまって困ったので、エッジの頂点リストから頂点コネクションのリストを取得する関数を作りました。
Source Code
#include <stdio.h>
#include <stdlib.h>
template<typename T>
bool GetVtxConnectionsFromEdgeVertexindices(
const T *in_edge_vtx_ids
, T *o_vtx_connections
, int num_face_edge
)
{
/*
* Maximum number of edge.
* you can increase kMaxNumEdge if you want to handle more edges.
*/
const int kMaxNumEdge = 30;
if(num_face_edge > kMaxNumEdge){
fprintf(stderr, "Too many number of edges, must be less than %d\n", kMaxNumEdge);
return false;
}
int check_list[kMaxNumEdge];
memset(check_list, 0, sizeof(int)*kMaxNumEdge);
T current_vtx_id = in_edge_vtx_ids[1];
T end_vtx_id = in_edge_vtx_ids[0];
int connection_cnt=0;
o_vtx_connections[connection_cnt] = in_edge_vtx_ids[0];
++connection_cnt;
check_list[0] = 1;
/*
* Find vertex connections
* until connected vtx reaches to end of edge loop around face.
*/
while(current_vtx_id != end_vtx_id)
{
int i;
int vtx_id_0, vtx_id_1;
for(i=0; i<num_face_edge; ++i){
if(check_list[i]==1){
continue;
}
vtx_id_0 = in_edge_vtx_ids[i*2];
vtx_id_1 = in_edge_vtx_ids[i*2+1];
if(vtx_id_0==current_vtx_id){
o_vtx_connections[connection_cnt] = vtx_id_0;
++connection_cnt;
current_vtx_id = vtx_id_1;
check_list[i] = 1;
break;
}
if(vtx_id_1==current_vtx_id){
o_vtx_connections[connection_cnt] = vtx_id_1;
++connection_cnt;
current_vtx_id = vtx_id_0;
check_list[i] = 1;
break;
}
}
if(i==num_face_edge&& current_vtx_id != end_vtx_id){
fprintf(stderr, "Given edge vertex list does not have looped edge\n");
return false;
}
}
return true;
}
Example
void TestGetVtxConnectionsFromEdgeVertexindices()
{
const int num_edge = 5;
int edge_vtx_ids[] = {
0,1,
2,3,
2,1,
0,4,
3,4
};
int vtx_cons[num_edge];
GetVtxConnectionsFromEdgeVertexindices(
edge_vtx_ids,
vtx_cons,
num_edge
);
for(int i=0; i<num_edge; ++i){
printf("%d\n", vtx_cons[i]);
}
}