1

したがって、Vec2float* であるメンバー変数「center」を含む Node クラスがあります。この理由は、drawSolidCircle 関数を使用したいためで、中心を表すために Vec2float 変数が必要です。私が持っている質問の 1 つは、Vec2float はベクトルですか、それとも空間内のポイントですか? 多くのメンバー関数はある種のベクトル クラスのように聞こえますが、set() 関数は 2 つの引数しかとらないため、空間内の点のように見えます。円を描くには、点が必要です。ベクトルではなく、半径です。また、私が抱えている別の問題は、誰かが私に 2 つの double を与えた場合、どうすればそれらを Vec2float に適切に変換し、中心の x と y を設定できるかということです (x と y がある場合)。たとえば、以下の関数では、エントリの配列とその長さ 'n' が与えられます。エントリには、両方とも double である 2 つのメンバ変数 'x' と 'y' があります。ノードの配列を作成し、そのデータをコピーして円を描画したいと考えています。

cinder::Vec2<float>* center;//in my Node class

void function::build(Entry* c, int n) {
Node* nd = new Node[n];
for(int i = 0;i<n;i++) {
    nd[i].center = //what goes here if c[i].x and c[i].y are doubles?
}

参照: Vec2 クラス: http://libcinder.org/docs/v0.8.4/classcinder_1_1_vec2.html 形状を描画する関数のリスト、im drawSolidCircle を使用: http://libcinder.org/docs/v0.8.4/namespacecinder_1_1gl.html

助言がありますか?

4

2 に答える 2

2

生活を楽にするために、cinder 名前空間を使用できます。ファイルの先頭にある include の後に次の行を追加します。

using namespace ci;

これにより、たとえば次のように簡単に書くことができます。

Vec2f center(1.5f, 1.5f);
std::cout << center << std::endl;

実際、Cinder のようにVec2<float>typedef されています。Vec2f

また、double は暗黙的にキャストされるため、float にキャストする必要はありません。渡すだけです。

最後に、ポインターには本当に注意する必要があります。ほとんどの場合、オブジェクトの配列が必要な場合はstd::vector、 と を使用しますshared_ptr。これを行う方法を学んだ場所は次のとおりです。https://forum.libcinder.org/topic/efficiency-vector-of-pointers

ベクトルの背後にある理論全体については説明しません。ここに良いリファレンスがあります(処理言語を使用): http://natureofcode.com/book/chapter-1-vectors/原点 (0,0) から現在の位置への矢印としての位置ベクトル)。

また、ライブラリで提供されている多数のサンプルを確認することをお勧めします。

于 2012-11-13T22:34:40.317 に答える
0

よく私は何かを理解しました、それは今のところコンパイルされます、それが将来私のプログラムのために働くかどうかは議論の余地があります。しかし、これが私がしたことです:

float f1 = (float)(c[i].x);
float f2 = (float)(c[i].y);
cinder::Vec2<float>* p = new cinder::Vec2<float>(f1,f2);
nd[i].center = p;

doubleをfloatに個別にキャストし、Vec2コンストラクターを使用して変数pを作成し、centerをそれに等しく設定しました。私がコンパイルすると言ったように、それが機能するかどうかを確認します:D

于 2012-11-11T15:37:43.603 に答える