Record TGenericVector3

Unit

Declaration

type TGenericVector3 = record

Description

Vector of 3 floating-point values.

This is generic type (although not using "proper" Pascal generics for implementation reasons). In has two actual uses:

  1. TVector3, a vector of 3 Single values (floats with single precision),

  2. TVector3Double, a vector of 3 Double values (floats with double precision).

The actual type of TGenericScalar is Single or Double for (respectively) TVector3 or TVector3Double.

Overview

Internal Types

TIndex = 0..2;

Fields

var Data: array [TIndex] of TGenericScalar;

Methods

class operator + (const A, B: TGenericVector3): TGenericVector3; inline;
class operator - (const A, B: TGenericVector3): TGenericVector3; inline;
class operator - (const V: TGenericVector3): TGenericVector3; inline;
class operator * (const V: TGenericVector3; const Scalar: TGenericScalar): TGenericVector3; inline;
class operator * (const Scalar: TGenericScalar; const V: TGenericVector3): TGenericVector3; inline;
class operator * (const V1, V2: TGenericVector3): TGenericVector3; inline;
class operator / (const V: TGenericVector3; const Scalar: TGenericScalar): TGenericVector3; inline;
procedure Init(const X, Y, Z: TGenericScalar); inline;
function ToString: string;
function ToRawString: string;
function Normalize: TGenericVector3; inline;
procedure NormalizeMe; inline;
function Length: TGenericScalar; inline;
function LengthSqr: TGenericScalar; inline;
function AdjustToLength(const NewLength: TGenericScalar): TGenericVector3; inline;
class function CrossProduct(const V1, V2: TGenericVector3): TGenericVector3; static; inline;
class function DotProduct(const V1, V2: TGenericVector3): TGenericScalar; static; inline;
function Abs: TGenericVector3; inline;
function Min: TGenericScalar;
function Max: TGenericScalar;
function Average: TGenericScalar; inline;
function IsZero: boolean; overload; inline;
function IsZero(const Epsilon: TGenericScalar): boolean; overload; inline;
function IsPerfectlyZero: boolean; inline;
class function Equals(const V1, V2: TGenericVector3): boolean; overload; inline; static;
class function Equals(const V1, V2: TGenericVector3; const Epsilon: TGenericScalar): boolean; overload; inline; static;
class function PerfectlyEquals(const V1, V2: TGenericVector3): boolean; static; inline;
function XY: TGenericVector2; inline;
class function Lerp(const A: TGenericScalar; const V1, V2: TGenericVector3): TGenericVector3; static; inline;
class function Zero: TGenericVector3; static; inline;

Properties

property Items [constIndex:TIndex]: TGenericScalar read GetItems write SetItems;
property X: TGenericScalar index 0 read GetItemsInt write SetItemsInt;
property Y: TGenericScalar index 1 read GetItemsInt write SetItemsInt;
property Z: TGenericScalar index 2 read GetItemsInt write SetItemsInt;
class property One [constIndex:TIndex]: TGenericVector3 read GetOne;

Description

Internal Types

TIndex = 0..2;
 

Fields

var Data: array [TIndex] of TGenericScalar;
 

Methods

class operator + (const A, B: TGenericVector3): TGenericVector3; inline;
 
class operator - (const A, B: TGenericVector3): TGenericVector3; inline;
 
class operator - (const V: TGenericVector3): TGenericVector3; inline;
 
class operator * (const V: TGenericVector3; const Scalar: TGenericScalar): TGenericVector3; inline;
 
class operator * (const Scalar: TGenericScalar; const V: TGenericVector3): TGenericVector3; inline;
 
class operator * (const V1, V2: TGenericVector3): TGenericVector3; inline;

Vector * vector makes a component-wise multiplication. This is consistent with GLSL and other vector APIs.

class operator / (const V: TGenericVector3; const Scalar: TGenericScalar): TGenericVector3; inline;
 
procedure Init(const X, Y, Z: TGenericScalar); inline;
 
function ToString: string;
 
function ToRawString: string;

Convert to string using the most precise (not always easily readable by humans) float format. This may use the exponential (scientific) notation to represent the floating-point value, if needed.

This is suitable for storing the value in a file, with a best precision possible.

function Normalize: TGenericVector3; inline;
 
procedure NormalizeMe; inline;
 
function Length: TGenericScalar; inline;
 
function LengthSqr: TGenericScalar; inline;

Vector length squared. This is slightly faster than Length as it avoids calculating a square root along the way. (But, please remember to not optimize your code without a need. Optimize only parts that are proven bottlenecks, otherwise don't make the code less readable for the sake of speed.)

function AdjustToLength(const NewLength: TGenericScalar): TGenericVector3; inline;

Calculate a new vector scaled so that it has length equal to NewLength. NewLength may be negative, in which case we'll negate the vector and then adjust it's length to Abs(NewLength).

class function CrossProduct(const V1, V2: TGenericVector3): TGenericVector3; static; inline;

Vector cross product. See http://en.wikipedia.org/wiki/Cross_product .

Result is a vector orthogonal to both given vectors. Generally there are two such vectors, this method returns the one following right-hand rule. More precisely, V1, V2 and Product(V1, V2) are in the same relation as basic X, Y, Z axes. Reverse the order of arguments to get negated result.

If you use this to calculate a normal vector of a triangle (P0, P1, P2): note that VectorProduct(P1 - P0, P1 - P2) points out from CCW triangle side in right-handed coordinate system.

When V1 and V2 are parallel (that is, when V1 = V2 multiplied by some scalar), and this includes the case when one of them is zero, then result is a zero vector.

class function DotProduct(const V1, V2: TGenericVector3): TGenericScalar; static; inline;

Dot product of two vectors. See https://en.wikipedia.org/wiki/Dot_product .

function Abs: TGenericVector3; inline;

Absolute value on all components.

function Min: TGenericScalar;

Smallest component.

function Max: TGenericScalar;

Largest component.

function Average: TGenericScalar; inline;

Average from all components.

function IsZero: boolean; overload; inline;

Are all components equal to zero (within some epsilon margin).

function IsZero(const Epsilon: TGenericScalar): boolean; overload; inline;

Are all components equal to zero (within Epsilon margin).

function IsPerfectlyZero: boolean; inline;
 
class function Equals(const V1, V2: TGenericVector3): boolean; overload; inline; static;

Compare two vectors, with epsilon to tolerate slightly different floats.

class function Equals(const V1, V2: TGenericVector3; const Epsilon: TGenericScalar): boolean; overload; inline; static;
 
class function PerfectlyEquals(const V1, V2: TGenericVector3): boolean; static; inline;

Compare two vectors using exact comparison (like the "=" operator to compare floats).

function XY: TGenericVector2; inline;
 
class function Lerp(const A: TGenericScalar; const V1, V2: TGenericVector3): TGenericVector3; static; inline;

Linear interpolation between two vector values. Returns (1-A) * V1 + A * V2.

So:

  • A = 0 gives V1,

  • A = 1 gives V2,

  • values between are interpolated,

  • values outside are extrapolated.

class function Zero: TGenericVector3; static; inline;
 

Properties

property Items [constIndex:TIndex]: TGenericScalar read GetItems write SetItems;
 
property X: TGenericScalar index 0 read GetItemsInt write SetItemsInt;
 
property Y: TGenericScalar index 1 read GetItemsInt write SetItemsInt;
 
property Z: TGenericScalar index 2 read GetItemsInt write SetItemsInt;
 
class property One [constIndex:TIndex]: TGenericVector3 read GetOne;
 

Generated by PasDoc 0.15.0.