On this page

概要

VEXは配列のデータタイプを含んでいます。これはいくつかの場所で役に立ちます:

  • ランプパラメータをサポートしています。

  • import()関数によってサーフェスノードからキャプチャーデータを読むことができます。

  • 配列が役立つところならどこでも一般的なプログラミングができます。

Note

現在のところ、VEXは多次元配列をサポートしていません。

ここでは、配列を使った非常に面白いサンプルを載せています:

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コンパイラはそれを無視します。

配列を返す関数を宣言する:

// ベクトルの配列を返す関数。
vector[] rgb_array()
{
...
};    

配列を返す入れ子関数を宣言する:

// ベクトルの配列を返す関数。
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;

(getcompsetcompの関数は、大括弧([)を使用するのと同じです。)

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[] E.g. vector2 v = {1,2}
vector float[] 例:vector v = {1,2,3}
vector4 float[] 例:vector4 v = {1,2,3,4};
matrix2 float[] E.g. matrix2 m = {1,2,3,4};
matrix2 vector2[] E.g. 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を参照してください。

配列の取り扱い

以下の関数は、配列の照会と操作をすることができます。

resize

配列の長さを設定します。配列を拡張する場合、中間値が0または""になります。

len

配列の長さを返します。

pop

配列から最後の項目を削除(配列のサイズを1個ずつ減らす)して、それを返します。

removevalue

配列内の値の最初のインスタンスを削除します。 そのアイテムが削除されたら1、そうでないなら0を返します。

push

配列の最後に項目を追加します(配列のサイズを1個ずつ増やす)。

getcomp

配列のコンポーネントの値を取得します。これはarray[num]と同じです。

setcomp

配列のコンポーネントの値を設定します。これはarray[num] = valueと同じです。

array

引数から効率的に配列を作成します。

serialize

ベクトルまたはマトリックスの配列をfloatの配列に平坦化します。

unserialize

serializeの効果の逆です: floatの平坦な配列を集めて、ベクトルまたはマトリックスにします。

neighbours

neighbourcount/neighbourの組み合わせ用の配列ベースの置換。指定したポイントの近くにあるポイント番号の配列を返します。

さらに、以下の関数は配列を扱います:

VCCプラグマ

rampプラグマはパラメータセット用のランプユーザインターフェースを指定することができます。

#pragma ramp <ramp_parm> <basis_parm> <keys_parm> <values_parm>

詳細は、VCC pragmasを参照してください。

制限

  • 現在のところ、VEXは多次元配列をサポートしていません。

  • 配列はシェーダ間で受け渡しできません(simportなどによって)。

  • 配列は画像平面に書き出すことができません。

VEX

言語

次のステップ

リファレンス