On this page |
概要 ¶
VEXは配列のデータタイプを含んでいます。これはいくつかの場所で役に立ちます:
-
ランプパラメータをサポートしています。
-
import()関数によってサーフェスノードからキャプチャーデータを読むことができます。
-
配列が役立つところならどこでも一般的なプログラミングができます。
Note
現在のところ、VEXは多次元配列をサポートしていません。
Note
スニペット/Wrangle/他の関数の中で定義された、配列を返す関数の頭にはfunction
キーワードを付けてください。
ここでは、配列を使った非常に面白いサンプルを載せています:
surface crazy( string maps[] = { "Mandril.rat", "default.pic" }; export float alength = 0; ) { vector texclr, av[]; texclr = texture(maps[s+t > 1], s, t); av = array( {1,0,0}, vector(nrandom()), t, texclr, {.5,0,0}); if (fit(noise(s*8), 0, 1, .3, .7) > t) av = array(1, {0,1,0}, 0); Cf = spline("linear", s, av); alength = len(av); }
配列タイプの宣言 ¶
配列変数を宣言するための一般的な形式は、member_type var_name[]
です:
// my_arrayはfloatの配列。 float my_array[]; // vは単一ベクトル、vector_arrayはベクトルの配列。 vector v, vector_array[]; // str_arrayは文字列の配列です。 string str_array[];
任意で大括弧([
)内にサイズを指定することができますが、現在のところVEXコンパイラはそれを無視します。
配列を返す関数を宣言する:
// ベクトルの配列を返す関数。 // Wrangleやスニペットの中では動作しません。この場合、頭にfunctionキーワードを付けてください。 vector[] rgb_array() { ... };
関数をネストした場合、この関数のタイプは曖昧になります。
Note
Wrangleやスニペットは常に暗黙的にネストされます。
配列を返す入れ子関数を宣言する:
// ベクトルの配列を返す関数。 cvex foo() { // オプションの'function'キーワードを使用して、タイプの曖昧さを回避します。 function vector[] rgb_array() { ... }; }
文字通りの配列を指定するには、中括弧({
)を使ってカンマ区切りで配列メンバーを指定します:
vector an_array[] = { {1, 2, 3}, {2, 3, 4}, {4, 5, 6} }; vector[] rgb_array() { return { {1, 0, 0}, {0, 1, 0}, {0, 0, 1} }; }
Note
リテラル配列は コンパイル時 に構築されるので、配列内に 変数を含めることはできません 。
例えば、以下のコードはエラーになります:
int arr[] = { my_var, other_var + 2 }; // エラー
このエラーを回避するには、ランタイム時にいくつもの引数から配列を構築するarray()
関数を使用してください:
int arr[] = array( my_var, other_var + 2 );
ベクトルが必要な場所でスカラーを指定する場合、コンパイラはスカラー値をベクトルのすべてのコンポーネントに割り当てます:
vector an_array[] = { 1, 2, 3}; // an_array[] == { {1, 1, 1}, {2, 2, 2}, {3, 3, 3} }
array()
関数は引数から配列を作成します。
int my_array[] = array(1, 2, 3, 4, 5);
array()
を使って任意のタイプの配列を生成することができます。
array()
から強制的にベクトルを生成するようにします(例):
vector (array (value1, value2, ...) );
配列の値へのアクセスと設定 ¶
arrayname[index]
を使って配列のインデックスの値を調べます。
vector bw[] = { 0, 1 }; // bw[] == { {0, 0, 0}, {1, 1, 1} } Cf = bw[index];
配列の範囲はランタイム時にチェックされます。範囲外のインデックスを読み込むと0
または""
を返します。
これは、将来、警告やオプションでランタイムエラーを生成する予定です。
配列の範囲を超えた書き込みは、そのインデックスを含むように配列のサイズを変更します。
新しいエントリーは0
または""
に設定されます。
Python形式のインデックス表記を使用します。つまり、マイナスのインデックスは、配列の最後から数えた位置を参照します。
int nums[] = { 0, 1, 2, 3, 4, 5 }; int n = nums[10]; // 0を返します。 int b = nums[-2]; // 4を返します。 string strs[] = { }; string s = strs[20]; // ""を返します。
大括弧([
)を使って値を割り当てることもできます:
float nums[] = { }; nums[0] = 3.14;
(getcompとsetcompの関数は、大括弧([
)を使用するのと同じです。)
Note
大括弧([
)オペレータはベクトルでも機能します。それをマトリックスと合わせて使用したり、大括弧([
)の組を使用することもできます。
つまり、float a = m3[0][1];
配列のスライス ¶
大括弧([
)を使えば、Pythonスライス表記によるサブ配列の抽出をすることができます。
int nums[] = { 0, 1, 2, 3, 4, 5 }; int start[] = nums[0:2]; // { 0, 1 } int end[] = nums[-2:]; // { 4, 5 } int rev[] = nums[::-1]; // { 5, 4, 3, 2, 1, 0 } int odd[] = nums[1::2]; // { 1, 3, 5 }
slice関数は、スライスベースの大括弧([
)表記の使用と等価です。
配列とベクトル/マトリックス間のコピー ¶
割り当てのオペレータは、ベクトルタイプとfloatの配列間の値の割り当てをサポートしています:
float x[]; // CfとPはベクトルです。 x = set(P); // Pのコンポーネントをそれに相当する配列xの // メンバーに割り当てます。 Cf = set(x); // xの最初の3つのメンバーをベクトルCfのコンポーネント // として割り当てます。
配列がベクトル/マトリックスを埋めるのに十分な長さでない場合は、最後のメンバーが必要に応じて繰り返されます。
float x[] = {1, 2}; // ベクトルを埋めるのに十分な長さではありません。 Cf = set(x); // Cf == {1, 2, 0}
マトリックスタイプとvector2
/vector
/vector4
の配列間の割り当ても可能です。:
vector2 v2[]; vector v[]; vector4 v4[]; matrix2 m2 = 1; matrix3 m3 = 1; matrix m4 = 1; v = set(m3); // 3x3のマトリックスの各行がベクトルに格納されます。 m3 = set(v); // ベクトルをマトリックスの行ベクトルにコピーします。 v4 = set(m4); // マトリックスの行をvector4の配列に抽出します。 m4 = set(v4); // 配列内にvector4を行ベクトルとして使ったマトリックスを作成します。
要約:
左側 | 右側 | メモ |
---|---|---|
vector2
|
float[]
|
例:vector2 v = {1,2}
|
vector
|
float[]
|
例:vector v = {1,2,3}
|
vector4
|
float[]
|
例:vector4 v = {1,2,3,4};
|
matrix2
|
float[]
|
例:matrix2 m = {1,2,3,4};
|
matrix2
|
vector2[]
|
例:matrix2 m = { {1,2}, {4,5} };
|
matrix3
|
float[]
|
例:matrix3 m = {1,2,3,4,5,6,7,8,9};
|
matrix3
|
vector[]
|
例:matrix3 m = { {1,2,3}, {4,5,6}, {7,8,9}};
|
matrix
|
float[]
|
例:matrix m = {1,2,3,4,5,6,7,8,9.., 16};
|
matrix
|
vector4[]
|
例:matrix m = { {1,2,3,4}, {5,6,7,8}, ... {13,14,15,16}};
|
float[]
|
vector2
|
コンポーネントから2つのfloatの配列を作成します。 |
float[]
|
vector
|
コンポーネントから3つのfloatの配列を作成します。 |
float[]
|
vector4
|
コンポーネントから4つのfloatの配列を作成します。 |
float[]
|
matrix2
|
matrix2から4つのfloatの配列を作成します。 |
vector2[]
|
matrix2
|
matrix2から2つのvector2の配列を作成します。 |
float[]
|
matrix3
|
matrix3から9つのfloatの配列を作成します。 |
vector[]
|
matrix3
|
matrix3から3つのベクトルの配列を作成します。 |
float[]
|
matrix4
|
16個のfloatの配列を作成します。 |
vector4[]
|
matrix4
|
4つのvector4 の配列を作成します。
|
配列のループ ¶
foreachを参照してください。
配列の取り扱い ¶
以下の関数は、配列の照会と操作をすることができます。
配列の長さを設定します。配列を拡張する場合、中間値が0
または""
になります。
配列の長さを返します。
配列から最後の項目を削除(配列のサイズを1個ずつ減らす)して、それを返します。
配列内の値の最初のインスタンスを削除します。
そのアイテムが削除されたら1
、そうでないなら0
を返します。
指定したインデックスのアイテムを削除し、そのアイテムを返します。
配列の最後に項目を追加します(配列のサイズを1個ずつ増やす)。
配列のコンポーネントの値を取得します。これはarray[num]
と同じです。
配列のコンポーネントの値を設定します。これはarray[num] = value
と同じです。
引数から効率的に配列を作成します。
ベクトルまたはマトリックスの配列をfloatの配列に平坦化します。
serializeの効果の逆です: floatの平坦な配列を集めて、ベクトルまたはマトリックスにします。
neighbourcount/neighbourの組み合わせ用の配列ベースの置換。指定したポイントの近くにあるポイント番号の配列を返します。
さらに、以下の関数は配列を扱います:
VCCプラグマ ¶
ramp
プラグマはパラメータセット用のランプユーザインターフェースを指定することができます。
#pragma ramp <ramp_parm> <basis_parm> <keys_parm> <values_parm>
詳細は、VCC pragmasを参照してください。
制限 ¶
-
現在のところ、VEXは多次元配列をサポートしていません。
-
配列はシェーダ間で受け渡しできません(simportなどによって)。
-
配列は画像平面に書き出すことができません。