1

やや描画機構を作るためにmfcアプリケーションを作っています。ポリラインを使用すると、ユーザーは図形を描くことができ、Enter キーを押すと、線の現在のポイントが開始ポイントに結合されます [閉じた多角形を形成します]。私はあなたがアイデアを得ると思います。ここで、ポリゴンの各頂点を格納するために STL 配列を使用しています。簡単に言えば、図形の描画中にマウスの左ボタンがクリックされたすべてのポイントが配列に格納されます。

std::array<CPoint,11> v;   //vertices

次のメカニズムを使用して、この配列の要素、つまりポイントを出力しています。

  for(int j=0 ; j<v.size() ; j++ )
    {
        s.Format(L"%d %d\n",v[j].x, v[j].y);
        aDC.TextOutW(x+=20,y+=20,s );     //each time print the coordinates
        s=" ";                                    //at a different location
    }

実行中、ユーザーが画面上の点をクリックして図形を描画すると、それらの点が配列に格納されます。配列は 12 個の要素で宣言されていますが、形状に 12 個の頂点があることはめったにありません。残りの要素 (空の要素) は (0,0) のままですが、これらはループで出力されます。だから私が印刷するのは、3-4 座標とたくさんの (0,0) です。頂点が格納されている要素のみを印刷する方法はありますか (私の言いたいことが理解できることを願っています)。のようなものvertices[n]=/*some character that signifies the last element*/。私の質問は、このキャラクターは何ですか?文字列の '\0' のように。

4

2 に答える 2

2

構造内に「エンド マーカー」の適切な候補があるようには見えません。少なくとも理論的には、CPointのすべてのペアが有効なポイントを表します。{x,y}

固定配列の使用を主張する場合 (おそらく、パフォーマンス上の理由から)、別の変数にポリゴン頂点の数を格納することもできます (文字列の類推を続けると、"ポイントの C 文字列)。

配列の使用が必須でない場合はstd::vector<CPoint>、ポリゴンなどの可変サイズの構造を表すのにより適したコンテナである に切り替えることができます。

最後に、1 つのポイント (たとえば{std::numeric_limits<long>::max(), std::numeric_limits<long>::max()}) を不正として指定し、そのポイントのインスタンスを静的に作成して、シーケンスの終わりのマーカーとして使用することができます。この場合、配列を 1 つ拡張することを検討し、エンド マーカーを標識として使用します。

于 2012-12-19T18:11:22.397 に答える
0

ポイントを無効として使用する場合は、(0; 0)ポイントが にあることを確認できます(0; 0)

if (vertices[i].x != 0 && vertices[i].y != 0) {
    // valid
}
于 2012-12-19T18:19:26.310 に答える