VEX 包括一个数组数据类型。 这在几个地方很有用:
笔记 目前 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 is an array of floats
float my_array[];
// v is a single vector, vector_array is an array of vectors
vector v, vector_array[];
// str_array is an array of strings
string str_array[];
您可以选择将大小放在方括号内,但 VEX 编译器当前会忽略它。 声明一个返回数组的函数:
// A function which returns an array of vectors
vector[] rgb_array()
{
...
};
声明一个返回数组的嵌套函数:
// A function which returns an array of vectors
cvex
foo()
{
// Use the optional 'function' keyword to avoid type ambiguity
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} };
}
笔记 文字数组是在编译时构造的,因此它们不能包含变量。 例如,这是一个错误: int arr[] = { my_var, other_var + 2 }; // Error 为避免此错误,请使用 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]; // Returns 0
int b = nums[-2]; // Returns 4
string strs[] = { };
string s = strs[20]; // Returns ""
您还可以使用方括号表示法分配值:
float nums[] = { };
nums[0] = 3.14;
(getcomp 和 setcomp 函数等效于使用方括号表示法。)
笔记 方括号运算符也适用于向量。 您也可以将它与矩阵一起使用,也可以使用一对括号: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 x[];
// Cf and P are vectors
x = set(P); // Assigns the components of P to the corresponding
// members of the array x
Cf = set(x); // Assigns the first 3 members of x as the
// components of the vector Cf
如果数组的长度不足以填充向量/矩阵,则根据需要重复最后一个成员。
float x[] = {1, 2} // Not long enough to fill a vector
Cf = set(x); // Cf == {1, 2, 2}
您还可以在vector2/vector/vector4的数组和矩阵类型之间进行分配
vector2 v2[];
vector v[];
vector4 v4[];
matrix2 m2 = 1;
matrix3 m3 = 1;
matrix m4 = 1;
v = set(m3); // Each row of the 3x3 matrix is put into a vector
m3 = set(v); // Copy the vectors into the row vectors of the matrix
v4 = set(m4); // Extract the rows of the matrix into the vector4 array
m4 = set(v4); // Create a matrix using the vector4's in the array as row vectors
总结
左= | 右 | 注 |
---|---|---|
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[] | vector | 从组件创建一个包含 3 个浮点数的数组 |
float[] | vector4 | 从组件创建一个包含 4个浮点数的数组 |
float[] | matrix2 | 从 matrix2 创建一个包含 4 个浮点数的数组 |
vector2[] | matrix2 | 从matrix2创建一个由 2 个向量组成的数组 |
float[] | matrix3 | 从 matrix3 创建一个包含 9 个浮点数的数组 |
vector[] | matrix3 | 从 matrix3 创建一个由 3 个向量组成的数组 |
float[] | matrix4 | 创建一个包含 16 个浮点数的数组 |
vector4[] | matrix4 | 创建一个包含 4 个 vector4s 的数组。 |
以下函数可让您查询和操作数组。
resize:设置数组的长度。 如果数组被放大,中间值将是 0 或 ""。
len:返回数组的长度。
pop:从数组中删除最后一项(将数组的大小减 1)并返回它。
removevalue:删除数组中值的第一个实例。 如果项目被删除,则返回 1,否则返回 0。
removeindex:删除给定索引处的项目并返回它。
push:将一个项目添加到数组的末尾(将数组的大小增加 1)。
getcomp:获取数组组件的值,同array[num]。
setcomp:设置数组组件的值,与array[num] = value 相同。
array:有效地从其参数创建一个数组。
serialize:将向量或矩阵数组展平为浮点数组。
unserialize:反转序列化的效果:将浮点数的平面数组组装成向量或矩阵的数组。
neighbours:neighbourcount/neighbour 组合的基于数组的替换。 返回给定点的邻居的点号数组。
此外,以下函数适用于数组:
ramp pragma 允许您为一组参数指定一个渐变用户界面。
#pragma ramp <ramp_parm> <basis_parm> <keys_parm> <values_parm>
有关详细信息,请参阅 VCC 编译指示。