2

現在、opengles android ゲーム用の OBJ インポーターを作成中です。私はJava言語に比較的慣れていないので、いくつかのことについて正確にはわかりません。

モデル内の頂点の数を保持する配列があります (他のいくつかの配列と一緒に):

float vertices[];

問題は、与えられた入力ストリームを使用してファイルを読み取る前に、モデルにいくつの頂点があるかわからないことです。

私はこれを好きになる必要があるので、それを埋めることができますか?:

vertices[95] = 5.004f; //vertices was defined like the example above

または事前に初期化する必要がありますか?

後者の場合、ファイル内の頂点の数を調べるにはどうすればよいでしょうか? inputstreamreader.read() を使用して読み取ると、ファイル全体を読み取るまで次の行に進みます。私が考えることができる唯一のことは、ファイル全体を読み取り、頂点の数を数えてから、新しく初期化された配列の塗りつぶしを再度読み取ることです。

必要に応じてデータを動的に割り当てる方法はありますか?

4

3 に答える 3

6

必要な動的サイズを提供する ArrayList を使用できます。

   List<Float> vertices = new ArrayList<Float>();

次のように値を追加できます。

   vertices.add(5.0F);

リストはニーズに合わせて拡大します。

注意すべき点: ArrayList は、プリミティブ型ではなく、オブジェクトを保持します。したがって、提供する float 値を Float オブジェクトとして格納します。ただし、これから元の float 値を取得するのは簡単です。

絶対に配列が必要な場合は、値のリスト全体を読み取った後、リストから配列を簡単に取得できます。

Java コレクションについては、ここから読み始めることができます。

于 2010-12-29T01:57:24.597 に答える
1

Java 配列では、事前に初期化する必要があります。あなたの場合、次のオプションがあります。

1)他の人が提案したように、 ArrayList(またはインターフェースの他の実装)を使用します。Listこのようなリストは動的に大きくなる可能性があるため、これが役立ちます。

2)ファイル形式を制御できる場合は、ファイルの先頭に頂点数に関する情報を追加して、配列を正しいサイズで事前に初期化できるようにします。

3) 制御できない場合は、ファイル サイズに基づいて頂点の数を推測してみてください (float は 4 バイトなのでFile.length()、たとえば 4 で割るとよいでしょう)。推測された数が小さすぎる場合は、より大きな配列 (たとえば、以前の配列サイズの 120%) を動的に作成し、以前の配列のすべてのデータを新しい配列にコピーして続行できます。これにはコストがかかる場合がありますが、配列サイズの推測が正確であれば問題ありません。

ファイル形式や、この頂点の配列がどのように使用されるか (たとえば、長期間保存するか、すぐに破棄するかなど) についてより多くの情報を提供していただければ、より多くのアイデアを提供できる可能性があります。

于 2010-12-29T02:09:11.007 に答える
0

いいえ、初期化されていない配列を埋めることはできません。データとインデックスを格納できる動的構造が必要な場合 (これはあなたのケースでは重要と思われます)、Map を使用します (Map のキーはインデックスになります):

Map<Integer, Float> vertices = new HashMap<Integer, Float>();
vertices.put(95, 5.004f);
于 2010-12-29T02:02:34.463 に答える