2

スキャンラインベースのポリゴン塗りつぶしアルゴリズムを実装しています。私は一般的なアルゴリズムを知っており、現在C++で実装しようとしています。

エッジテーブルをアクティブなエッジリストに実装する必要があります。

アクティブエッジリストをベクトルにして、動的に簡単に挿入および削除できるようにしました。

ただし、エッジテーブルはもう少し混乱します。

ベクトルの配列を使用してエッジテーブルを実装しようとしています。ベクトルには、作成した構造体が含まれます。

これが構造体です。

struct Bucket
{
    // Fields of a bucket list
    int ymax, x, dx, dy, sum;
};

渡された頂点の配列を反復処理するforループがあり、バケットを作成して、エッジのyminインデックスでエッジテーブルにバケットを挿入します。

私の問題は、エッジテーブルをループして個々のバケットにアクセスするのに苦労していることです。

バケットのベクトルの配列の宣言は次のとおりです。

// This array is the edge table which has a max index of 300
    // The window for the program is never more than 300 by 300
    vector<Bucket> et[300];

これが、アイテムを印刷しようとしてエッジテーブルを反復処理するforループです。インデックスにイテレータと通常のintを使用しようとしましたが、各バケットの値を出力しようとするとどちらも機能しません。

// Debugging the edge table, prints out all buckets
    vector<Bucket>::iterator it;
    for(int j = 0; j < 300; j++)
    {
            for(it = et[j].begin(); it < et[j].end(); it++)
            {
//                printf(*it);
//                printf();
            }
            for(int q = 0; q < et[j].size(); q++)
            {
                printf("ymax = %d", q[0]);
            }
    }
4

1 に答える 1

0

遊んでマイケルの助けを借りて、値を印刷することができました。これにより、エッジテーブルを反復処理してポリゴンを入力する準備ができたときに、これらの値にアクセスすることもできます。

ベクトル内の構造体の値を出力する正しい方法は、次のforループを使用することでした。

vector<Bucket>::iterator it;
    for(int j = 0; j < 300; j++)
    {
        for(int q = 0; q < et[j].size(); q++)
        {
            printf("ymax = %d, x = %d, dx = %d, dy = %d, sum = %d,\n", et[j][q].ymax, et[j][q].x, et[j][q].dx, et[j][q].dy, et[j][q].sum);
        }
    }

これが、c++でも錆びている他の人に役立つことを願っています。

于 2012-09-25T19:51:39.507 に答える