ロゴ メインコンテンツへ
RSSフィード
「ソフトウェア開発」に関連する記事一覧

C++ エッジの頂点リストから頂点コネクションリストを取得する関数

2012/07/16
(この記事の文字数: 215)
C++ 

ループしているエッジの頂点リスト(エッジ数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]);
    }
}

  このエントリーをはてなブックマークに追加  

<<「ソフトウェア開発」の記事一覧に戻る

コメント(0 件)



コンテンツロード: 0.0083 sec
Copyright(C)2006-2024 puarts All Rights Reserved