|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | ||||||||
Objectcommon:Vector
class
Vector class.
The Vector class allows you to easily define a four-dimensional vector. These have a variety of uses in fractal generation, including use as a container for a 3D vector.
For performance reasons, none of the Vector methods return a vector. The last vector argument is the return value. For example,
Vector V1 = new Vector(....)
V1.Cross(V2,V3)
is equivalent to
V3 = V1 x V2
Also for performance reasons, you may access the vector elements directly, as m_x, m_y, m_z, and m_w.
Ron Barnett
class Vector {
; Vector class.
;
; <p>
; The Vector class allows you to easily define a four-dimensional vector.
; These have a variety of uses in fractal generation, including use as a
; container for a 3D vector.
; <p>
; For performance reasons, none of the Vector methods return a vector.
; The last vector argument is the return value. For example,
; <p>
; Vector V1 = new Vector(....)<br>
; V1.Cross(V2,V3)
; <p>
; is equivalent to
; <p>
; V3 = V1 x V2
; <p>
; Also for performance reasons, you may access the vector elements
; directly, as m_x, m_y, m_z, and m_w.
; <p>
; Ron Barnett
public:
; Constructor
;
; @param x x term of vector
; @param y y term of vector
; @param z z term of vector
; @param w w term of vector (use 1.0 if you are storing a 3D vector)
func Vector(float x, float y, float z, float w)
Init(x,y,z,w)
endfunc
; Re-initialize a Vector.
; <p>
; If you need to completely change the value of a Vector, you can use this function rather than deleting the old Vector and creating a new one. (Re-use is faster.)
;
; @param x x term of vector
; @param y y term of vector
; @param z z term of vector
; @param w w term of vector (use 1.0 if you are storing a 3D vector)
func Init(float x, float y, float z, float w)
m_x = x
m_y = y
m_z = z
m_w = w
endfunc
; Copy a Vector to another Vector.
; <p>
; If you simply assign the value of one Vector to another, you actually create a reference in both variables to the same Vector object, and changes in one variable's vector will appear in the other. See the UF help file topic on "reference" ("Objects") for details. To make a true copy from one Vector to another Vector, use this function.
;
; @param T target vector that will receive a copy of the Vector's data
func Copy(Vector T)
T.m_x = m_x
T.m_y = m_y
T.m_z = m_z
T.m_w = m_w
endfunc
; Get a Vector element by index.
; <p>
; Sometimes you need to access a Vector's elements by index number (0-3) rather than by name. If you do, you may use this function. Note that this is slower than accessing the member variables directly.
;
; @param n element number (0-3) to retrieve
; @return the value of the element
float func Get(int n)
if (n == 0)
return m_x
elseif (n == 1)
return m_y
elseif (n == 2)
return m_z
elseif (n == 3)
return m_w
else
return 0
endif
endfunc
; Set a Vector element by index.
; <p>
; Sometimes you need to set a Vector's elements by index number (0-3) rather than by name. If you do, you may use this function. Note that this is slower than accessing the member variables directly.
;
; @param n element number (0-3) to set
; @param v the new value for the element
func Set(int n, float v)
if (n == 0)
m_x = v
elseif (n == 1)
m_y = v
elseif (n == 2)
m_z = v
elseif (n == 3)
m_w = v
endif
endfunc
; Normalize a Vector.
; <p>
; Normalization gives a unit vector. The x, y, z and w values are
; direction cosines.
;
; @param V target vector that will receive the normalized vector
func Normalize(Vector V)
float vd = 1/sqrt(m_x^2+m_y^2+m_z^2+m_w^2)
V.m_x = m_x*vd
V.m_y = m_y*vd
V.m_z = m_z*vd
V.m_w = m_w*vd
endfunc
; Determine a Vector's size.
;
; @return the size (or length) of the vector
float func Size()
return sqrt(m_x^2+m_y^2+m_z^2+m_w^2)
endfunc
; Add two Vectors.
;
; @param V1 the second vector to add
; @param V2 the target vector for the added vectors to be stored in
func Add(Vector V1, Vector V2)
V2.m_x = m_x+V1.m_x
V2.m_y = m_y+V1.m_y
V2.m_z = m_z+V1.m_z
V2.m_w = m_w+V1.m_w
endfunc
; Subtract two Vectors.
;
; @param V1 the second vector to subtract
; @param V2 the target vector for the differenced vectors to be stored in
func Sub(Vector V1, Vector V2)
V2.m_x = m_x-V1.m_x
V2.m_y = m_y-V1.m_y
V2.m_z = m_z-V1.m_z
V2.m_w = m_w-V1.m_w
endfunc
; Multiply a vector by a constant.
;
; @param c the constant to multiply by
; @param V the target vector for the multiplied values to be stored in
func MConst(float c, Vector V)
V.m_x = m_x*c
V.m_y = m_y*c
V.m_z = m_z*c
V.m_w = m_w*c
endfunc
; Shift Vector elements.
; <p>
; This function shifts the vector elements so that x becomes y, y becomes z, z becomes w, and w becomes x. You may shift by any number of positions, although any multiple of four will return the elements to their starting positions. Negative values will be interpreted as shifts in reverse.
;
; @param shift number of places to shift (negative values shift in reverse)
; @param V the target vector to store the shifted vector in
func Shift(int shift, Vector V)
float x = m_x
float y = m_y
float z = m_z
float w = m_w
shift = shift % 4
if shift < 0
shift = shift + 4
endif
if shift == 1
V.m_x = w
V.m_y = x
V.m_z = y
V.m_w = z
elseif shift == 2
V.m_x = z
V.m_y = w
V.m_z = x
V.m_w = y
elseif shift == 3
V.m_x = y
V.m_y = z
V.m_z = w
V.m_w = x
else
V.m_x = x
V.m_y = y
V.m_z = z
V.m_w = w
endif
endfunc
; Vector Dot Product
; <p>
; This gives the cosine of the angle between the vectors.
;
; @param V the second vector in the dot product
; @return the dot product
float func Dot(Vector V)
return V.m_x*m_x+V.m_y*m_y+V.m_z*m_z+V.m_w*m_w
endfunc
; Vector Cross Product (3D)
; <p>
; This gives the vector cross product, which given two 3D vectors will produce a third vector which is at right angles to the plane containing the two vectors. Note that changing the order of the two vectors will generally result in the cross product pointing in the opposite direction:
; <p>
; V x V1 = - V1 x V
; <p>
; This version of the cross product assumes the Vector objects hold a 3D vector, and returns a 3D vector.
;
; @param V1 the second vector in the cross product
; @param V2 the target vector to store the cross product vector in
func Cross(Vector V1, Vector V2)
float x = m_y*V1.m_z-m_z*V1.m_y
float y = m_z*V1.m_x-m_x*V1.m_z
float z = m_x*V1.m_y-m_y*V1.m_x
V2.m_x = x
V2.m_y = y
V2.m_z = z
V2.m_w = 1
endfunc
; Vector Cross Product (4D)
; <p>
; This gives the vector cross product, which given three 4D vectors will produce a fourth vector which is at right angles to the hyperplane containing the three vectors. Note that changing the order of the three vectors will generally result in a different orientation of the result.
;
; @param V1 the second vector in the cross product
; @param V2 the third vector in the cross product
; @param V3 the target vector to store the cross product vector in
func Cross4D(Vector V1, Vector V2, Vector V3)
float a = (V1.m_x * V2.m_y) - (V1.m_y * V2.m_x);
float b = (V1.m_x * V2.m_z) - (V1.m_z * V2.m_x);
float c = (V1.m_x * V2.m_w) - (V1.m_w * V2.m_x);
float d = (V1.m_y * V2.m_z) - (V1.m_z * V2.m_y);
float e = (V1.m_y * V2.m_w) - (V1.m_w * V2.m_y);
float f = (V1.m_z * V2.m_w) - (V1.m_w * V2.m_z);
float x = (m_y * f) - (m_z * e) + (m_w * d);
float y = - (m_x * f) + (m_z * c) - (m_w * b);
float z = (m_x * e) - (m_y * c) + (m_w * a);
float w = - (m_x * d) + (m_y * b) - (m_z * a);
V3.m_x = x
V3.m_y = y
V3.m_z = z
V3.m_w = w
endfunc
; Rotate Vector in the YZ plane.
;
; @param theta angle to rotate, in radians
; @param V target vector to store resulting rotated vector in
func RotYZ(float theta, Vector V)
theta = theta*#pi/180
float y = m_y*cos(theta) - m_z*sin(theta)
float z = m_y*sin(theta) + m_z*cos(theta)
V.m_y = y
V.m_z = z
V.m_x = m_x
V.m_w = m_w
endfunc
; Rotate Vector in the ZX plane.
;
; @param theta angle to rotate, in radians
; @param V target vector to store resulting rotated vector in
func RotZX(float theta, Vector V)
theta = theta*#pi/180
float z = m_z*cos(theta) - m_x*sin(theta)
float x = m_z*sin(theta) + m_x*cos(theta)
V.m_z = z
V.m_x = x
V.m_y = m_y
V.m_w = m_w
endfunc
; Rotate Vector in the XY plane.
;
; @param theta angle to rotate, in radians
; @param V target vector to store resulting rotated vector in
func RotXY(float theta, Vector V)
theta = theta*#pi/180
float x = m_x*cos(theta) - m_y*sin(theta)
float y = m_x*sin(theta) + m_y*cos(theta)
V.m_x = x
V.m_y = y
V.m_z = m_z
V.m_w = m_w
endfunc
; Rotate Vector in the XW plane.
;
; @param theta angle to rotate, in radians
; @param V target vector to store resulting rotated vector in
func RotXW(float theta, Vector V)
theta = theta*#pi/180
float x = m_x*cos(theta) - m_w*sin(theta)
float w = m_x*sin(theta) + m_w*cos(theta)
V.m_x = x
V.m_w = w
V.m_z = m_z
V.m_y = m_y
endfunc
; Rotate Vector in the YW plane.
;
; @param theta angle to rotate, in radians
; @param V target vector to store resulting rotated vector in
func RotYW(float theta, Vector V)
theta = theta*#pi/180
float w = m_w*cos(theta) - m_y*sin(theta)
float y = m_w*sin(theta) + m_y*cos(theta)
V.m_y = y
V.m_w = w
V.m_x = m_x
V.m_z = m_z
endfunc
; Rotate Vector in the ZW plane.
;
; @param theta angle to rotate, in radians
; @param V target vector to store resulting rotated vector in
func RotZW(float theta, Vector V)
theta = theta*#pi/180
float w = m_w*cos(theta) - m_z*sin(theta)
float z = m_w*sin(theta) + m_z*cos(theta)
V.m_w = w
V.m_z = z
V.m_x = m_x
V.m_y = m_y
endfunc
float m_x
float m_y
float m_z
float m_w
default:
}
| Constructor Summary | |
|---|---|
Vector()
|
|
Vector(float x,
float y,
float z,
float w)
Constructor |
|
| Method Summary | |
|---|---|
void |
Add(Vector V1,
Vector V2)
Add two Vectors. |
void |
Copy(Vector T)
Copy a Vector to another Vector. |
void |
Cross(Vector V1,
Vector V2)
Vector Cross Product (3D) |
void |
Cross4D(Vector V1,
Vector V2,
Vector V3)
Vector Cross Product (4D) |
float |
Dot(Vector V)
Vector Dot Product |
float |
Get(int n)
Get a Vector element by index. |
void |
Init(float x,
float y,
float z,
float w)
Re-initialize a Vector. |
void |
MConst(float c,
Vector V)
Multiply a vector by a constant. |
void |
Normalize(Vector V)
Normalize a Vector. |
void |
RotXW(float theta,
Vector V)
Rotate Vector in the XW plane. |
void |
RotXY(float theta,
Vector V)
Rotate Vector in the XY plane. |
void |
RotYW(float theta,
Vector V)
Rotate Vector in the YW plane. |
void |
RotYZ(float theta,
Vector V)
Rotate Vector in the YZ plane. |
void |
RotZW(float theta,
Vector V)
Rotate Vector in the ZW plane. |
void |
RotZX(float theta,
Vector V)
Rotate Vector in the ZX plane. |
void |
Set(int n,
float v)
Set a Vector element by index. |
void |
Shift(int shift,
Vector V)
Shift Vector elements. |
float |
Size()
Determine a Vector's size. |
void |
Sub(Vector V1,
Vector V2)
Subtract two Vectors. |
| Methods inherited from class Object |
|---|
|
| Constructor Detail |
|---|
public Vector(float x,
float y,
float z,
float w)
x - x term of vectory - y term of vectorz - z term of vectorw - w term of vector (use 1.0 if you are storing a 3D vector)public Vector()
| Method Detail |
|---|
public void Init(float x,
float y,
float z,
float w)
If you need to completely change the value of a Vector, you can use this function rather than deleting the old Vector and creating a new one. (Re-use is faster.)
x - x term of vectory - y term of vectorz - z term of vectorw - w term of vector (use 1.0 if you are storing a 3D vector)public void Copy(Vector T)
If you simply assign the value of one Vector to another, you actually create a reference in both variables to the same Vector object, and changes in one variable's vector will appear in the other. See the UF help file topic on "reference" ("Objects") for details. To make a true copy from one Vector to another Vector, use this function.
T - target vector that will receive a copy of the Vector's datapublic float Get(int n)
Sometimes you need to access a Vector's elements by index number (0-3) rather than by name. If you do, you may use this function. Note that this is slower than accessing the member variables directly.
n - element number (0-3) to retrieve
public void Set(int n,
float v)
Sometimes you need to set a Vector's elements by index number (0-3) rather than by name. If you do, you may use this function. Note that this is slower than accessing the member variables directly.
n - element number (0-3) to setv - the new value for the elementpublic void Normalize(Vector V)
Normalization gives a unit vector. The x, y, z and w values are direction cosines.
V - target vector that will receive the normalized vectorpublic float Size()
public void Add(Vector V1,
Vector V2)
V1 - the second vector to addV2 - the target vector for the added vectors to be stored in
public void Sub(Vector V1,
Vector V2)
V1 - the second vector to subtractV2 - the target vector for the differenced vectors to be stored in
public void MConst(float c,
Vector V)
c - the constant to multiply byV - the target vector for the multiplied values to be stored in
public void Shift(int shift,
Vector V)
This function shifts the vector elements so that x becomes y, y becomes z, z becomes w, and w becomes x. You may shift by any number of positions, although any multiple of four will return the elements to their starting positions. Negative values will be interpreted as shifts in reverse.
shift - number of places to shift (negative values shift in reverse)V - the target vector to store the shifted vector inpublic float Dot(Vector V)
This gives the cosine of the angle between the vectors.
V - the second vector in the dot product
public void Cross(Vector V1,
Vector V2)
This gives the vector cross product, which given two 3D vectors will produce a third vector which is at right angles to the plane containing the two vectors. Note that changing the order of the two vectors will generally result in the cross product pointing in the opposite direction:
V x V1 = - V1 x V
This version of the cross product assumes the Vector objects hold a 3D vector, and returns a 3D vector.
V1 - the second vector in the cross productV2 - the target vector to store the cross product vector in
public void Cross4D(Vector V1,
Vector V2,
Vector V3)
This gives the vector cross product, which given three 4D vectors will produce a fourth vector which is at right angles to the hyperplane containing the three vectors. Note that changing the order of the three vectors will generally result in a different orientation of the result.
V1 - the second vector in the cross productV2 - the third vector in the cross productV3 - the target vector to store the cross product vector in
public void RotYZ(float theta,
Vector V)
theta - angle to rotate, in radiansV - target vector to store resulting rotated vector in
public void RotZX(float theta,
Vector V)
theta - angle to rotate, in radiansV - target vector to store resulting rotated vector in
public void RotXY(float theta,
Vector V)
theta - angle to rotate, in radiansV - target vector to store resulting rotated vector in
public void RotXW(float theta,
Vector V)
theta - angle to rotate, in radiansV - target vector to store resulting rotated vector in
public void RotYW(float theta,
Vector V)
theta - angle to rotate, in radiansV - target vector to store resulting rotated vector in
public void RotZW(float theta,
Vector V)
theta - angle to rotate, in radiansV - target vector to store resulting rotated vector in
|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | ||||||||