Arrays

Overview

VEX는 배열 데이터 타입을 포함하고 있다. 이는 몇몇 영역에서 유용하다 :

  • ramp 파라미터를 지원한다.
  • /vex/functions/import 함수를 사용해 surface 노드에서 캡쳐 데이터를 읽는다.
  • 일반적인 프로그래밍에서, 배열은 언제나 유용하다.

**  Note **

현재 VEX는 다차원 배열을 지원하고 있지 않다.

이 예제는 배열을 가지고 할 수 있는 몇가지 미친 짓이다 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
surface
crazy(
      string maps[] = { “Mandril.rat”“default.pic” };
      export float alength = 0;
      )
{
    vector texclr, av[];
    texclr = texture(maps[s+> 1], s, t);
    av = array( {1,0,0}, vector(nrandom()), t, texclr, {.5,0,0});
    if (fit(noise(s*8), 01, .3, .7> t)
        av = array(1, {0,1,0}, 0);
    Cf = spline(“linear”, s, av);
    alength = len(av);
}
cs

Declaring array types

배열 번수를 선언하기 위한 일반적인 형식은 member_type   var_name[] 이다 :

1
2
3
4
5
6
7
8
// 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[];
cs

 

대괄호 안에 선택적으로 size를 넣을 수 있지만, 현재 VEX 컴파일러는 이를 무시한다.

배열을 리턴하는 함수를 선언하기 위해서는 :

1
2
3
4
5
// A function which returns an array of vectors
vector[] rgb_array()
{
};
cs

 

배열을 리턴하는 중첩 함수(nested function)를 선언하기 위해서는 :

1
2
3
4
5
6
7
8
9
10
// A function which returns an array of vectors
cvex
foo()
{
    // Use the optional ‘function’ keyword to avoid type ambiguity
    function vector[] rgb_array()
    {
    …
    };
}
cs

 

상수 배열(literal array)을 지정하기 위해서, 꺽쇠 괄호를 사용한다. 배열 멤버들은 콤마로 구분한다 :

1
2
3
4
5
6
vector an_array[] = { {123}, {234}, {456} };
vector[] rgb_array()
{
    return { {100}, {010}, {001} };
}
cs

 

만약 vector가 있는 곳에 scalar를 지정한다면, 컴파일러는 scalar 값을 vector의 모든 요소들에 적용할 것이다 :

1
2
vector an_array[] = { 123};
// an_array[] == { {1, 1, 1}, {2, 2, 2}, {3, 3, 3} }
cs

 

array() 함수는 자체 인수에서부터 배열을 생성한다.

1
int my_array[] = array(12345);
cs

 

array()를 사용해 모든 타입의 배열을 생성할 수 있다. array() 가 vector를 생성하도록 강제하려면 :

1
vector (array (value1, value2, …) );
cs

Accessing and setting array values

arrayname[index] 로 배열의 위치를 통해 값을 찾는다.

1
2
3
vector bw[] = { 0};
// bw[] == { {0, 0, 0}, {1, 1, 1} }
Cf = bw[index];
cs

 

배열 한계는 실행 시간에 확인된다. 한계 값을 벗어서 읽게 되면 0 또는 ” “를 리턴한다. 이는 나중에 런타임 오류를 발생시킬 수도 있다. 배열의 끝을 지나 쓰는 것은 쓰여진 index를 포함하는 배열의 크기를 변경하게 된다. 새로운 엔트리는 0 또는 ” “으로 설정될 것이다.

Python 스타일 인덱싱ㅇ이 사용된다. 이는 음수 인덱스들이 배열의 끝에서부터의 위치를 제공한다는 의미이다.

1
2
3
4
5
6
int nums[] = { 01234};
int n = nums[10];  // Returns 0
int b = nums[2];  // Returns 4
string strs[] = { };
string s = strs[20];  // Returns “”
cs

 

대괄호 표기를 사용해 값을 적용할 수도 있다 :

1
2
float nums[] = { };
nums[0= 3.14;
cs

 

(getcomp와 setcomp 함수들도 마찬가지로 대괄호 표기를 사용한다.)

** Note **

대괄호 연산자는 vector에도 작동한다. 괄호의 페어를 사용해 매트릭스에도 함께 사용할 수 있다 : float a = m3[0][1];

Slicing Arrays

대괄호는 Python 슬라이싱 표기법을 사용해 부분 배열을 추출하는데 사용된다.

1
2
3
4
5
int nums[] = { 01234};
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 }
cs

 

slice 함수는 slice 기반 대괄호 표기를 사용하는 것과 같다.

Copying between arrays and vectors/matrices

적용 연산자는 vector 타입과 float의 배열간에 값을 적용할 수 있게 지원한다 :

1
2
3
4
5
6
7
8
float x[];
// Cf and P are vectors
= 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
cs

 

만약 배열이 vector/matrix를 채우기에 충분히 길지 않다면, 마지막 멤버는 필요한 만큼 반복된다.

1
2
float x[] = {12// Not long enough to fill a vector
Cf = set(x);  // Cf == {1, 2, 2}
cs

 

matrix 타입들과 vector2/vector/vector4의 배열간에도 적용할 수 있다 :

1
2
3
4
5
6
7
8
9
10
11
vector2     v2[];
vector      v[];
vector4     v4[];
matrix2     m2 = 1;
matrix3     m3 = 1;
matrix      m4 = 1;
= set(m3);   // Each row of the 3×3 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 vector
cs

 

요약하면 :

Left side = Right side Notes
vector2 float[] E.g. vector2 v = {1,2}
vector float[] E.g. vector v = {1,2,3}
vector4 float[] E.g. 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[] E.g. matrix3 m = {1,2,3,4,5,6,7,8,9};
matrix3 vector[] E.g. matrix3 m = { {1,2,3}, {4,5,6}, {7,8,9}};
matrix float[] E.g. matrix m = {1,2,3,4,5,6,7,8,9.., 16};
matrix vector4[] E.g. matrix m = { {1,2,3,4}, {5,6,7,8}, ... {13,14,15,16}};
float[] vector2 Create an array of 2 floats from the components
float[] vector Create an array of 3 floats from the components
float[] vector4 Create an array of 4 floats from the components
float[] matrix2 Create an array of 4 floats from the matrix2
vector2[] matrix2 Create an array of 2 vector2s from the matrix2
float[] matrix3 Create an array of 9 floats from the matrix3
vector[] matrix3 Create an array of 3 vectors from the matrix3
float[] matrix4 Create an array of 16 floats
vector4[] matrix4 Create an array of 4 vector4s.

 

Looping over an array

foreach를 본다.

 

Working with arrays

다음 함수들은 배열을 조회(query)하고 변경할수 있게 한다 :

resize

배열의 길이를 설정한다. 배열이 충분히 크면, 중간 값이 0 또는 ” ” 가 된다.

len

배열의 길이를 리턴한다.

pop

배열에서 마지막 항목을 제거한고 이를 리턴한다. (배열의 크기를 한단계 줄인다)

push

배열의 끝에 항목을 하나 추가한다. (배열의 크기를 한단계 증가시킨다)

getcomp

배열 요소의 값 하나를 얻는다. array[num]과 같다.

setcomp

배열 요소의 값 하나를 설정한다. array[num] = value와 같다.

array

배열의 인수들에서부터 효과적으로 배열을 생성한다.

serialize

vector 또는 matrix의 배열을 float의 배열로 낮춘다.

unserialize

serialize의 효과를 반전시킨다 : float의 배열을 vector 또는 matrix의 배열로 집합시킨다.

neighbours

neighbourcountneighbour 콤보에 대한 배열 기반 교체이다. 주어진 포인트의 이웃의 포인트 멘버의 배열을 리턴한다.

추가로, 다음 함수들은 배열과 함께 사용된다 :

  • min
  • avg
  • spline
  • /vex/functions/import
  • /vex/functions/addattribute
  • metaimport

 

 

VCC pragmas

ramp 프라그마는 파라미터의 세트에 대한  ramp 사용자 인터페이스를 지정하게 한다.

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

 

 

Limitations

  • 현재 VEX는 다차원 배열을 지원하지 않는다.
  • 배열들은 쉐이더간에 전달 되지 않는다 (예, simport로 )
  • 배열들은 이미지 플랜에 작성될 수 없다.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s