前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布

Arrays

作者头像
南郭先生
发布2022-04-25 13:51:18
3540
发布2022-04-25 13:51:18
举报
文章被收录于专栏:Google DartGoogle Dart

概述

VEX 包括一个数组数据类型。 这在几个地方很有用:

  • 支持斜坡ramp参数。
  • 使用 import() 函数从表面节点读取捕获数据。
  • 通用编程,只要数组有用。

笔记 目前 VEX 不支持多维数组。

这个例子展示了你可以用数组做的一些疯狂的事情:

代码语言:javascript
复制
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[]:

代码语言:javascript
复制
// 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 编译器当前会忽略它。 声明一个返回数组的函数:

代码语言:javascript
复制
// A function which returns an array of vectors
vector[] rgb_array()
{
...
};

声明一个返回数组的嵌套函数:

代码语言:javascript
复制
// A function which returns an array of vectors
cvex
foo()
{
    // Use the optional 'function' keyword to avoid type ambiguity
    function vector[] rgb_array()
    {
    ...
    };    
}

要指定文字数组,请使用花括号,数组成员用逗号分隔:

代码语言:javascript
复制
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);

如果在需要向量的地方指定标量,编译器会将标量值分配给向量的所有分量:

代码语言:javascript
复制
vector an_array[] = { 1, 2, 3};
// an_array[] == { {1, 1, 1}, {2, 2, 2}, {3, 3, 3} }

array() 函数根据其参数创建一个数组。

代码语言:javascript
复制
int my_array[] = array(1, 2, 3, 4, 5);

您可以使用 array() 生成任何类型的数组。 强制 array() 生成向量(例如):

代码语言:javascript
复制
vector (array (value1, value2, ...) );

访问和设置数组值

使用 arrayname[index] 根据在数组中的位置查找值。

代码语言:javascript
复制
vector bw[] = { 0, 1 };
// bw[] == { {0, 0, 0}, {1, 1, 1} }
Cf = bw[index];

在运行时检查数组边界。 越界读取将返回 0 或 ""。 这可能会在将来生成警告或可选的运行时错误。 超过数组末尾的写入将调整数组的大小以包含写入的索引。 新条目将设置为 0 或“”。

使用 Python 风格的索引。 这意味着负索引是指从数组末尾开始的位置。

代码语言:javascript
复制
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 ""

您还可以使用方括号表示法分配值:

代码语言:javascript
复制
float nums[] = { };
nums[0] = 3.14;

(getcomp 和 setcomp 函数等效于使用方括号表示法。)

笔记 方括号运算符也适用于向量。 您也可以将它与矩阵一起使用,也可以使用一对括号:float a = m3[0][1];

切片数组

方括号可用于使用 Python 切片表示法提取子数组。

代码语言:javascript
复制
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 函数等效于使用基于切片的方括号表示法。

在数组和向量/矩阵之间复制

赋值运算符支持在向量类型和浮点数组之间赋值:

代码语言:javascript
复制
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

如果数组的长度不足以填充向量/矩阵,则根据需要重复最后一个成员。

代码语言:javascript
复制
float x[] = {1, 2} // Not long enough to fill a vector
Cf = set(x);  // Cf == {1, 2, 2}

您还可以在vector2/vector/vector4的数组和矩阵类型之间进行分配

代码语言:javascript
复制
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 组合的基于数组的替换。 返回给定点的邻居的点号数组。

此外,以下函数适用于数组:

  • min
  • avg
  • spline
  • import()
  • addattribute()
  • metaimport

VCC 编译指示

ramp pragma 允许您为一组参数指定一个渐变用户界面。

代码语言:javascript
复制
#pragma ramp <ramp_parm> <basis_parm> <keys_parm> <values_parm>

有关详细信息,请参阅 VCC 编译指示。

限制

  • 目前 VEX 不支持多维数组。
  • 数组不能在着色器之间传递(通过 simport 等)。
  • 数组不能写入图像平面。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022/03/23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 声明数组类型
  • 访问和设置数组值
  • 切片数组
  • 在数组和向量/矩阵之间复制
  • 使用数组
  • VCC 编译指示
  • 限制
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档