Unit VectorMath

DescriptionusesClasses, Interfaces, Objects and RecordsFunctions and ProceduresTypesConstantsVariables

Description

A lot of operations on vectors and matrices. This includes operations on geometric objects (2D and 3D) that can be represented as some vectors, matrices and scalar values. Various collision-checking routines for these geometric objects. Also functions to operate on RGB colors (these are vectors too, after all).

Representation of geometric objects in this unit :

In descriptions of geometric objects above, I often stated some requirements, e.g. the triangle must not be "degenerated" to a line segment, RayVector must not be a zero vector, etc. You should note that these requirements are generally not checked by routines in this unit (for the sake of speed) and passing wrong values to many of the routines may lead to serious bugs — maybe the function will raise some arithmetic exception, maybe it will return some nonsensible result. In other words: when calling these functions, always make sure that values you pass satisfy the requirements.

(However, wrong input values should never lead to some serious bugs like access violations or range check errors — in cases when it would be possible, we safeguard against this. That's because sometimes you simply cannot guarantee for 100% that input values are correct, because of floating-point precision problems – see below.)

As for floating-point precision:

A design question about this unit: Right now I must declare two variables to define a sphere (like SphereCenter: vector; SphereRadius: scalar;) Why not wrap all the geometric objects (spheres, lines, rays, tunnels etc.) inside some records ? For example, define a sphere as

  TSphere = record Center: vector; Radius: scalar; end;

The answer: this is not so good idea, because it would create a lot of such types into unit, and I would have to implement simple functions that construct and convert between these types. Consider e.g. when I have a tunnel (given as Tunnel1, Tunnel2 points and TunnelRadius vector) and I want to "extract" the properties of the sphere at the 1st end of this tunnel. Right now, it's simple: just consider Tunnel1 as a sphere center, and TunnelRadius is obviously a sphere radius. Computer doesn't have to actually do anything, you just have to think in a different way about Tunnel1 and TunnelRadius. But if I would have tunnel wrapped in a type like TTunnel and a sphere wrapped in a type like TSphere, then I would have to actually implement this trivial conversion. And then doing such trivial conversion at run-time would take some time, because you have to copy 6 floating-point values. This would be a very serious waste of time at run-time. Well, on the other hand, routines could take less parameters (e.g. only 1 parameter TTunnel, instead of three vector parameters), but (overall) we would still loose a lot of time.

In many places where I have to return collision with a line segment, a line or a ray there are alternative versions that return just a scalar "T" instead of a calculated point. The actual collision point can be calculated then like Ray0 + T * RayVector. Of course for rays you can be sure that T is >= 0, for line segments you can be sure that 0 <= T <= 1. The "T" is often useful, because it allows you to easily calculate collision point, and also the distance to the collision (you can e.g. compare T1 and T2 to compare which collision is closer, and when your RayVector is normalized then the T gives you the exact distance). Thanks to this you can often entirely avoid calculating the actual collision point (Ray0 + T * RayVector).

This unit compiles with FPC and Delphi. But it will miss most things when compiled with Delphi. Because it compiles with Delphi, Images unit (that depends on some simplest things from this unit) can be compiled with Delphi too.

This unit, when compiled with FPC, will contain some stuff useful for integration with FPC's Matrix unit. The idea is to integrate in the future this unit with FPC's Matrix unit much more. For now, there are some "glueing" functions here like Vector_Get_Normalized that allow you to comfortably perform operations on Matrix unit object types. Most important is also the overload of ":=" operator that allows you to switch between VectorMath arrays and Matrix objects without any syntax obfuscation. Although note that this overload is a little dangerous, since now code like

  V3 := VectorProduct(V1, V2);

compiles and works both when all three V1, V2 and V3 are TVector3Single arrays or TVector3_Single objects. However, for the case when they are all TVector3_Single objects, this is highly un-optimal, and

  V3 := V1 >< V2;

is much faster, since it avoids the implicit convertions (unnecessary memory copying around).

uses

Overview

Classes, Interfaces, Objects and Records

Name Description
Class TDynArray_1  
Class TDynVector3SingleArray  
Class TDynArray_2  
Class TDynArray_5  
Class TDynArray_3  
Class EVectorMathInvalidOp  
Class EPlanesParallel  
Class ELinesParallel  

Functions and Procedures

function FloatsEqual(const f1, f2: Single): boolean; overload;
function FloatsEqual(const f1, f2: Double): boolean; overload;
function FloatsEqual(const f1, f2, EqEpsilon: Single): boolean; overload;
function FloatsEqual(const f1, f2, EqEpsilon: Double): boolean; overload;
function IsZero(const f1: Single): boolean; overload;
function IsZero(const f1: Double): boolean; overload;
function IsZero(const f1, EqEpsilon: Single ): boolean; overload;
function IsZero(const f1, EqEpsilon: Double ): boolean; overload;
function Vector2Cardinal(const x, y: Cardinal): TVector2Cardinal;
function Vector2Integer(const x, y: Integer): TVector2Integer;
function Vector2Single(const x, y: Single): TVector2Single;
function Vector3Single(const x, y: Single; const z: Single = 0.0): TVector3Single; overload;
function Vector3Single(const v3: TVector3Double): TVector3Single; overload;
function Vector3Single(const v3: TVector3Byte): TVector3Single; overload;
function Vector3Single(const v2: TVector2Single; const z: Single = 0.0): TVector3Single; overload;
function Vector3Longint(const p0, p1, p2: Longint): TVector3Longint;
function Vector3Double(const x, y: Double; const z: Double = 0.0): TVector3Double; overload;
function Vector3Double(const v: TVector3Single): TVector3Double; overload;
function Vector4Single(const x, y: Single; const z: Single = 0; const w: Single = 1): TVector4Single; overload;
function Vector4Single(const v3: TVector3Single; const w: Single = 1): TVector4Single; overload;
function Vector4Single(const ub: TVector4Byte): TVector4Single; overload;
function Vector4Single(const v: TVector4Double): TVector4Single; overload;
function Vector4Double(const v: TVector4Single): TVector4Double; overload;
function Vector3Byte(x, y, z: Byte): TVector3Byte; overload;
function Vector3Byte(const v: TVector3Single): TVector3Byte; overload;
function Vector3Byte(const v: TVector3Double): TVector3Byte; overload;
function Vector4Byte(x, y, z, w: Byte): TVector4Byte; overload;
function Vector4Byte(const f4: TVector4Single): TVector4Byte; overload;
function Vector4Byte(const f3: TVector3Byte; w: Byte): TVector4Byte; overload;
function Vector3SinglePoint(const v: TVector4Single): TVector3Single;
function Vector3SingleCut(const v: TVector4Single): TVector3Single;
function Normal3Single(const x, y: Single; const z: Single = 0.0): TVector3Single; overload;
function Triangle3Single(const T: TTriangle3Double): TTriangle3Single; overload;
function Triangle3Single(const p0, p1, p2: TVector3Single): TTriangle3Single; overload;
function Triangle3Double(const T: TTriangle3Single): TTriangle3Double; overload;
function Triangle3Double(const p0, p1, p2: TVector3Double): TTriangle3Double; overload;
function Vector3SingleFromStr(const s: string): TVector3Single;
function Vector3DoubleFromStr(const s: string): TVector3Double;
function Vector3ExtendedFromStr(const s: string): TVector3Extended;
function Vector4SingleFromStr(const s: string): TVector4Single;
function Matrix4Double(const M: TMatrix4Single): TMatrix4Double;
operator := (const V: TVector2_Single): TVector2Single;
operator := (const V: TVector3_Single): TVector3Single;
operator := (const V: TVector4_Single): TVector4Single;
operator := (const V: TVector2Single): TVector2_Single;
operator := (const V: TVector3Single): TVector3_Single;
operator := (const V: TVector4Single): TVector4_Single;
procedure SwapValues(var V1, V2: TVector2Single); overload;
procedure SwapValues(var V1, V2: TVector2Double); overload;
procedure SwapValues(var V1, V2: TVector3Single); overload;
procedure SwapValues(var V1, V2: TVector3Double); overload;
procedure SwapValues(var V1, V2: TVector4Single); overload;
procedure SwapValues(var V1, V2: TVector4Double); overload;
function VectorAverage(const V: TVector3Single): Single; overload;
function VectorAverage(const V: TVector3Double): Double; overload;
function VLerp(const a: Single; V1, V2: TVector2Integer): TVector2Single; overload;
function VLerp(const a: Single; V1, V2: TVector2Single): TVector2Single; overload;
function VLerp(const a: Single; V1, V2: TVector3Single): TVector3Single; overload;
function VLerp(const a: Single; V1, V2: TVector4Single): TVector4Single; overload;
function Vector_Init_Lerp(const A: Single; V1, V2: TVector3_Single): TVector3_Single; overload;
function Vector_Init_Lerp(const A: Single; V1, V2: TVector4_Single): TVector4_Single; overload;
function Vector_Init_Lerp(const A: Double; V1, V2: TVector3_Double): TVector3_Double; overload;
function Vector_Init_Lerp(const A: Double; V1, V2: TVector4_Double): TVector4_Double; overload;
function Mix2Vectors(const v1, v2: TVector3Single; const v2part: Single = 0.5): TVector3Single; overload;
function Mix2Vectors(const v1, v2: TVector2Single; const v2part: Single = 0.5): TVector2Single; overload;
procedure Mix2VectorsTo1st(var v1: TVector3Single; const v2: TVector3Single; const v2part: Single); overload;
procedure Mix2VectorsTo1st(var v1: TVector2Single; const v2: TVector2Single; const v2part: Single); overload;
procedure NormalizeTo1st3Singlev(vv: PVector3Single);
procedure NormalizeTo1st3Bytev(vv: PVector3Byte);
procedure NormalizeTo1st(var v: TVector3Single); overload;
procedure NormalizeTo1st(var v: TVector3Double); overload;
function Normalized(const v: TVector3Single): TVector3Single; overload;
function Normalized(const v: TVector3Double): TVector3Double; overload;
function Vector_Get_Normalized(const V: TVector3_Single): TVector3_Single; overload;
function Vector_Get_Normalized(const V: TVector3_Double): TVector3_Double; overload;
procedure Vector_Normalize(var V: TVector3_Single); overload;
procedure Vector_Normalize(var V: TVector3_Double); overload;
procedure NormalizePlaneTo1st(var v: TVector4Single); overload;
procedure NormalizePlaneTo1st(var v: TVector4Double); overload;
function IsZeroVector(const v: TVector3Single): boolean; overload;
function IsZeroVector(const v: TVector3Double): boolean; overload;
function IsZeroVector(const v: TVector4Single): boolean; overload;
function IsZeroVector(const v: TVector4Double): boolean; overload;
function IsZeroVector(const v: TVector4Cardinal): boolean; overload;
function VectorSubtract(const v1, v2: TVector2Single): TVector2Single; overload;
function VectorSubtract(const v1, v2: TVector2Double): TVector2Double; overload;
function VectorSubtract(const v1, v2: TVector3Single): TVector3Single; overload;
function VectorSubtract(const v1, v2: TVector3Double): TVector3Double; overload;
procedure VectorSubtractTo1st(var v1: TVector2Single; const v2: TVector2Single); overload;
procedure VectorSubtractTo1st(var v1: TVector2Double; const v2: TVector2Double); overload;
procedure VectorSubtractTo1st(var v1: TVector3Single; const v2: TVector3Single); overload;
procedure VectorSubtractTo1st(var v1: TVector3Double; const v2: TVector3Double); overload;
function VectorAdd(const v1, v2: TVector2Single): TVector2Single; overload;
function VectorAdd(const v1, v2: TVector2Double): TVector2Double; overload;
function VectorAdd(const v1, v2: TVector3Single): TVector3Single; overload;
function VectorAdd(const v1, v2: TVector3Double): TVector3Double; overload;
procedure VectorAddTo1st(var v1: TVector2Single; const v2: TVector2Single); overload;
procedure VectorAddTo1st(var v1: TVector2Double; const v2: TVector2Double); overload;
procedure VectorAddTo1st(var v1: TVector3Single; const v2: TVector3Single); overload;
procedure VectorAddTo1st(var v1: TVector3Double; const v2: TVector3Double); overload;
function VectorScale(const v1: TVector2Single; const Scalar: Single): TVector2Single; overload;
function VectorScale(const v1: TVector2Double; const Scalar: Double): TVector2Double; overload;
function VectorScale(const v1: TVector3Single; const Scalar: Single): TVector3Single; overload;
function VectorScale(const v1: TVector3Double; const Scalar: Double): TVector3Double; overload;
function VectorScale(const v1: TVector4Single; const Scalar: Single): TVector4Single; overload;
function VectorScale(const v1: TVector4Double; const Scalar: Double): TVector4Double; overload;
procedure VectorScaleTo1st(var v1: TVector2Single; const Scalar: Single); overload;
procedure VectorScaleTo1st(var v1: TVector2Double; const Scalar: Double); overload;
procedure VectorScaleTo1st(var v1: TVector3Single; const Scalar: Single); overload;
procedure VectorScaleTo1st(var v1: TVector3Double; const Scalar: Double); overload;
procedure VectorScaleTo1st(var v1: TVector4Single; const Scalar: Single); overload;
procedure VectorScaleTo1st(var v1: TVector4Double; const Scalar: Double); overload;
function VectorNegate(const v: TVector2Single): TVector2Single; overload;
function VectorNegate(const v: TVector2Double): TVector2Double; overload;
function VectorNegate(const v: TVector3Single): TVector3Single; overload;
function VectorNegate(const v: TVector3Double): TVector3Double; overload;
procedure VectorNegateTo1st(var v: TVector2Single); overload;
procedure VectorNegateTo1st(var v: TVector2Double); overload;
procedure VectorNegateTo1st(var v: TVector3Single); overload;
procedure VectorNegateTo1st(var v: TVector3Double); overload;
procedure VectorNegateTo1st(var v: TVector4Single); overload;
procedure VectorNegateTo1st(var v: TVector4Double); overload;
function VectorAdjustToLength(const v: TVector3Single; VecLen: Single): TVector3Single; overload;
function VectorAdjustToLength(const v: TVector3Double; VecLen: Double): TVector3Double; overload;
procedure VectorAdjustToLengthTo1st(var v: TVector3Single; VecLen: Single); overload;
procedure VectorAdjustToLengthTo1st(var v: TVector3Double; VecLen: Double); overload;
function VectorLen(const v: TVector3Single): Single; overload;
function VectorLen(const v: TVector3Double): Double; overload;
function VectorLen(const v: TVector2Single): Single; overload;
function VectorLen(const v: TVector2Double): Double; overload;
function VectorLen(const v: TVector3Byte): Single; overload;
function VectorLenSqr(const v: TVector3Single): Single; overload;
function VectorLenSqr(const v: TVector3Double): Double; overload;
function VectorLenSqr(const v: TVector2Single): Single; overload;
function VectorLenSqr(const v: TVector2Double): Double; overload;
function VectorLenSqr(const v: TVector3Byte): Integer; overload;
function VectorProduct(const v1, v2: TVector3Double): TVector3Double; overload;
function VectorProduct(const v1, v2: TVector3Single): TVector3Single; overload;
function VectorDotProduct(const v1, v2: TVector3Single): Single; overload;
function VectorDotProduct(const v1, v2: TVector3Double): Double; overload;
function VectorDotProduct(const v1, v2: TVector4Single): Single; overload;
function VectorDotProduct(const v1, v2: TVector4Double): Double; overload;
function VectorMultEachPos(const v1, v2: TVector3Single): TVector3Single; overload;
function VectorMultEachPos(const v1, v2: TVector3Double): TVector3Double; overload;
procedure VectorMultEachPosTo1st(var v1: TVector3Single; const v2: TVector3Single); overload;
procedure VectorMultEachPosTo1st(var v1: TVector3Double; const v2: TVector3Double); overload;
function VectorExpEachPos(const v: TVector3Single; const Exp: Single): TVector3Single; overload;
function VectorExpEachPos(const v: TVector3Double; const Exp: Double): TVector3Double; overload;
procedure VectorExpEachPosTo1st(var v: TVector3Single; const Exp: Single); overload;
procedure VectorExpEachPosTo1st(var v: TVector3Double; const Exp: Double); overload;
function CosAngleBetweenVectors(const v1, v2: TVector3Single): Single; overload;
function CosAngleBetweenVectors(const v1, v2: TVector3Double): Double; overload;
function CosAngleBetweenNormals(const v1, v2: TVector3Single): Single; overload;
function CosAngleBetweenNormals(const v1, v2: TVector3Double): Double; overload;
function AngleRadBetweenVectors(const v1, v2: TVector3Single): Single; overload;
function AngleRadBetweenVectors(const v1, v2: TVector3Double): Double; overload;
function AngleRadBetweenNormals(const v1, v2: TVector3Single): Single; overload;
function AngleRadBetweenNormals(const v1, v2: TVector3Double): Double; overload;
function RotatePointAroundAxisDeg(angleDeg: Single; const pt: TVector3Single; const axisVec: TVector3Single): TVector3Single; overload;
function RotatePointAroundAxisDeg(angleDeg: Double; const pt: TVector3Double; const axisVec: TVector3Double): TVector3Double; overload;
function RotatePointAroundAxisRad(angleRad: Single; const pt: TVector3Single; const axisVec: TVector3Single): TVector3Single; overload;
function RotatePointAroundAxisRad(angleRad: Double; const pt: TVector3Double; const axisVec: TVector3Double): TVector3Double; overload;
function MaxVectorCoord(const v: TVector3Single): integer; overload;
function MaxVectorCoord(const v: TVector3Double): integer; overload;
function MaxVectorCoord(const v: TVector4Single): integer; overload;
function MaxVectorCoord(const v: TVector4Double): integer; overload;
function MaxAbsVectorCoord(const v: TVector3Single): integer; overload;
function MaxAbsVectorCoord(const v: TVector3Double): integer; overload;
function PlaneDirInDirection(const Plane: TVector4Single; const Direction: TVector3Single): TVector3Single; overload;
function PlaneDirInDirection(const PlaneDir, Direction: TVector3Single): TVector3Single; overload;
function PlaneDirInDirection(const Plane: TVector4Double; const Direction: TVector3Double): TVector3Double; overload;
function PlaneDirInDirection(const PlaneDir, Direction: TVector3Double): TVector3Double; overload;
function PlaneDirNotInDirection(const Plane: TVector4Single; const Direction: TVector3Single): TVector3Single; overload;
function PlaneDirNotInDirection(const PlaneDir, Direction: TVector3Single): TVector3Single; overload;
function PlaneDirNotInDirection(const Plane: TVector4Double; const Direction: TVector3Double): TVector3Double; overload;
function PlaneDirNotInDirection(const PlaneDir, Direction: TVector3Double): TVector3Double; overload;
procedure TwoPlanesIntersectionLine(const Plane0, Plane1: TVector4Single; out Line0, LineVector: TVector3Single); overload;
procedure TwoPlanesIntersectionLine(const Plane0, Plane1: TVector4Double; out Line0, LineVector: TVector3Double); overload;
function Lines2DIntersection(const Line0, Line1: TVector3Single): TVector2Single;
function Lines2DIntersection(const Line0, Line1: TVector3Double): TVector2Double;
function ThreePlanesIntersectionPoint( const Plane0, Plane1, Plane2: TVector4Single): TVector3Single; overload;
function ThreePlanesIntersectionPoint( const Plane0, Plane1, Plane2: TVector4Double): TVector3Double; overload;
function PlaneMove(const Plane: TVector4Single; const Move: TVector3Single): TVector4Single; overload;
function PlaneMove(const Plane: TVector4Double; const Move: TVector3Double): TVector4Double; overload;
procedure PlaneMoveTo1st(var Plane: TVector4Single; const Move: TVector3Single); overload;
procedure PlaneMoveTo1st(var Plane: TVector4Double; const Move: TVector3Double); overload;
function PlaneAntiMove(const Plane: TVector4Single; const Move: TVector3Single): TVector4Single; overload;
function PlaneAntiMove(const Plane: TVector4Double; const Move: TVector3Double): TVector4Double; overload;
function VectorsSamePlaneDirections(const v1, v2: TVector3Single; const Plane: TVector4Single): boolean; overload;
function VectorsSamePlaneDirections(const v1, v2: TVector3Double; const Plane: TVector4Double): boolean; overload;
function VectorsSamePlaneDirections(const v1, v2: TVector3Single; const PlaneDir: TVector3Single): boolean; overload;
function VectorsSamePlaneDirections(const v1, v2: TVector3Double; const PlaneDir: TVector3Double): boolean; overload;
function PointsSamePlaneSides(const p1, p2: TVector3Single; const Plane: TVector4Single): boolean; overload;
function PointsSamePlaneSides(const p1, p2: TVector3Double; const Plane: TVector4Double): boolean; overload;
function PointsDistance(const v1, v2: TVector3Single): Single; overload;
function PointsDistance(const v1, v2: TVector3Double): Double; overload;
function PointsDistanceSqr(const v1, v2: TVector3Single): Single; overload;
function PointsDistanceSqr(const v1, v2: TVector3Double): Double; overload;
function PointsDistanceSqr(const v1, v2: TVector2Single): Single; overload;
function PointsDistanceSqr(const v1, v2: TVector2Double): Double; overload;
function PointsDistanceXYSqr(const v1, v2: TVector3Single): Single; overload;
function PointsDistanceXYSqr(const v1, v2: TVector3Double): Double; overload;
function VectorsEqual(const v1, v2: TVector2Single; const EqualityEpsilon: Single): boolean; overload;
function VectorsEqual(const v1, v2: TVector2Double; const EqualityEpsilon: Double): boolean; overload;
function VectorsEqual(const v1, v2: TVector3Single): boolean; overload;
function VectorsEqual(const v1, v2: TVector3Double): boolean; overload;
function VectorsEqual(const v1, v2: TVector3Single; const EqualityEpsilon: Single): boolean; overload;
function VectorsEqual(const v1, v2: TVector3Double; const EqualityEpsilon: Double): boolean; overload;
function VectorsEqual(const v1, v2: TVector4Single): boolean; overload;
function VectorsEqual(const v1, v2: TVector4Double): boolean; overload;
function VectorsEqual(const v1, v2: TVector4Single; const EqualityEpsilon: Single): boolean; overload;
function VectorsEqual(const v1, v2: TVector4Double; const EqualityEpsilon: Double): boolean; overload;
function VectorsPerfectlyEqual(const v1, v2: TVector2Single): boolean; overload; inline;
function VectorsPerfectlyEqual(const v1, v2: TVector2Double): boolean; overload; inline;
function VectorsPerfectlyEqual(const v1, v2: TVector3Single): boolean; overload; inline;
function VectorsPerfectlyEqual(const v1, v2: TVector3Double): boolean; overload; inline;
function VectorsPerfectlyEqual(const v1, v2: TVector4Single): boolean; overload; inline;
function VectorsPerfectlyEqual(const v1, v2: TVector4Double): boolean; overload; inline;
function MatricesEqual(const M1, M2: TMatrix4Single; const EqualityEpsilon: Single): boolean; overload;
function MatricesEqual(const M1, M2: TMatrix4Double; const EqualityEpsilon: Double): boolean; overload;
function MatricesPerfectlyEqual(const M1, M2: TMatrix4Single): boolean; overload;
function MatricesPerfectlyEqual(const M1, M2: TMatrix4Double): boolean; overload;
function VectorsPerp(const v1, v2: TVector3Single): boolean; overload;
function VectorsPerp(const v1, v2: TVector3Double): boolean; overload;
function VectorsParallel(const v1, v2: TVector3Single): boolean; overload;
function VectorsParallel(const v1, v2: TVector3Double): boolean; overload;
procedure MakeVectorsAngleDegOnTheirPlane(var v1: TVector3Single; const v2: TVector3Single; AngleDeg: Single); overload;
procedure MakeVectorsAngleDegOnTheirPlane(var v1: TVector3Double; const v2: TVector3Double; AngleDeg: Double); overload;
procedure MakeVectorsAngleRadOnTheirPlane(var v1: TVector3Single; const v2: TVector3Single; AngleRad: Single); overload;
procedure MakeVectorsAngleRadOnTheirPlane(var v1: TVector3Double; const v2: TVector3Double; AngleRad: Double); overload;
procedure MakeVectorsOrthoOnTheirPlane(var v1: TVector3Single; const v2: TVector3Single); overload;
procedure MakeVectorsOrthoOnTheirPlane(var v1: TVector3Double; const v2: TVector3Double); overload;
function AnyPerpVector(const v: TVector3Single): TVector3Single; overload;
function AnyPerpVector(const v: TVector3Double): TVector3Double; overload;
function IsLineParallelToPlane(const lineVector: TVector3Single; const plane: TVector4Single): boolean; overload;
function IsLineParallelToPlane(const lineVector: TVector3Double; const plane: TVector4Double): boolean; overload;
function IsLineParallelToSimplePlane(const lineVector: TVector3Single; const PlaneConstCoord: integer): boolean; overload;
function IsLineParallelToSimplePlane(const lineVector: TVector3Double; const PlaneConstCoord: integer): boolean; overload;
function AreParallelVectorsSameDirection( const Vector1, Vector2: TVector3Single): boolean; overload;
function AreParallelVectorsSameDirection( const Vector1, Vector2: TVector3Double): boolean; overload;
function PointOnPlaneClosestToPoint(const plane: TVector4Single; const point: TVector3Single): TVector3Single; overload;
function PointOnPlaneClosestToPoint(const plane: TVector4Double; const point: TVector3Double): TVector3Double; overload;
function PointToPlaneDistanceSqr(const Point: TVector3Single; const Plane: TVector4Single): Single; overload;
function PointToPlaneDistanceSqr(const Point: TVector3Double; const Plane: TVector4Double): Double; overload;
function PointToNormalizedPlaneDistance(const Point: TVector3Single; const Plane: TVector4Single): Single; overload;
function PointToNormalizedPlaneDistance(const Point: TVector3Double; const Plane: TVector4Double): Double; overload;
function PointToPlaneDistance(const Point: TVector3Single; const Plane: TVector4Single): Single; overload;
function PointToPlaneDistance(const Point: TVector3Double; const Plane: TVector4Double): Double; overload;
function PointToSimplePlaneDistance(const point: TVector3Single; const PlaneConstCoord: integer; const PlaneConstValue: Single): Single; overload;
function PointToSimplePlaneDistance(const point: TVector3Double; const PlaneConstCoord: integer; const PlaneConstValue: Double): Double; overload;
function PointOnLineClosestToPoint(const line0, lineVector, point: TVector3Single): TVector3Single; overload;
function PointOnLineClosestToPoint(const line0, lineVector, point: TVector3Double): TVector3Double; overload;
function PointToLineDistanceSqr(const point, line0, lineVector: TVector3Single): Single; overload;
function PointToLineDistanceSqr(const point, line0, lineVector: TVector3Double): Double; overload;
function TryPlaneLineIntersection(out intersection: TVector3Single; const plane: TVector4Single; const line0, lineVector: TVector3Single): boolean; overload;
function TryPlaneLineIntersection(out intersection: TVector3Double; const plane: TVector4Double; const line0, lineVector: TVector3Double): boolean; overload;
function TryPlaneLineIntersection(out t: Single; const plane: TVector4Single; const line0, lineVector: TVector3Single): boolean; overload;
function TryPlaneLineIntersection(out t: Double; const plane: TVector4Double; const line0, lineVector: TVector3Double): boolean; overload;
function TrySimplePlaneRayIntersection(out Intersection: TVector3Single; const PlaneConstCoord: integer; const PlaneConstValue: Single; const Ray0, RayVector: TVector3Single): boolean; overload;
function TrySimplePlaneRayIntersection(out Intersection: TVector3Double; const PlaneConstCoord: integer; const PlaneConstValue: Double; const Ray0, RayVector: TVector3Double): boolean; overload;
function TrySimplePlaneRayIntersection(out Intersection: TVector3Single; out T: Single; const PlaneConstCoord: integer; const PlaneConstValue: Single; const Ray0, RayVector: TVector3Single): boolean; overload;
function TrySimplePlaneRayIntersection(out Intersection: TVector3Double; out T: Double; const PlaneConstCoord: integer; const PlaneConstValue: Double; const Ray0, RayVector: TVector3Double): boolean; overload;
function TrySimplePlaneRayIntersection(out T: Single; const PlaneConstCoord: integer; const PlaneConstValue: Single; const Ray0, RayVector: TVector3Single): boolean; overload;
function TrySimplePlaneRayIntersection(out T: Double; const PlaneConstCoord: integer; const PlaneConstValue: Double; const Ray0, RayVector: TVector3Double): boolean; overload;
function TrySimplePlaneSegmentDirIntersection(var Intersection: TVector3Single; const PlaneConstCoord: integer; const PlaneConstValue: Single; const Segment0, SegmentVector: TVector3Single): boolean; overload;
function TrySimplePlaneSegmentDirIntersection(var Intersection: TVector3Double; const PlaneConstCoord: integer; const PlaneConstValue: Double; const Segment0, SegmentVector: TVector3Double): boolean; overload;
function TrySimplePlaneSegmentDirIntersection(var Intersection: TVector3Single; var T: Single; const PlaneConstCoord: integer; const PlaneConstValue: Single; const Segment0, SegmentVector: TVector3Single): boolean; overload;
function TrySimplePlaneSegmentDirIntersection(var Intersection: TVector3Double; var T: Double; const PlaneConstCoord: integer; const PlaneConstValue: Double; const Segment0, SegmentVector: TVector3Double): boolean; overload;
function TrySimplePlaneSegmentDirIntersection(var T: Single; const PlaneConstCoord: integer; const PlaneConstValue: Single; const Segment0, SegmentVector: TVector3Single): boolean; overload;
function TrySimplePlaneSegmentDirIntersection(var T: Double; const PlaneConstCoord: integer; const PlaneConstValue: Double; const Segment0, SegmentVector: TVector3Double): boolean; overload;
function TrySimplePlaneSegmentIntersection( out Intersection: TVector3Single; const PlaneConstCoord: integer; const PlaneConstValue: Single; const Pos1, Pos2: TVector3Single): boolean; overload;
function TrySimplePlaneSegmentIntersection( out Intersection: TVector3Double; const PlaneConstCoord: integer; const PlaneConstValue: Double; const Pos1, Pos2: TVector3Double): boolean; overload;
function TrySimplePlaneSegmentIntersection( out Intersection: TVector3Single; out T: Single; const PlaneConstCoord: integer; const PlaneConstValue: Single; const Pos1, Pos2: TVector3Single): boolean; overload;
function TrySimplePlaneSegmentIntersection( out Intersection: TVector3Double; out T: Double; const PlaneConstCoord: integer; const PlaneConstValue: Double; const Pos1, Pos2: TVector3Double): boolean; overload;
function TrySimplePlaneSegmentIntersection( out T: Single; const PlaneConstCoord: integer; const PlaneConstValue: Single; const Pos1, Pos2: TVector3Single): boolean; overload;
function TrySimplePlaneSegmentIntersection( out T: Double; const PlaneConstCoord: integer; const PlaneConstValue: Double; const Pos1, Pos2: TVector3Double): boolean; overload;
function TryPlaneRayIntersection(out Intersection: TVector3Single; const Plane: TVector4Single; const Ray0, RayVector: TVector3Single): boolean; overload;
function TryPlaneRayIntersection(out Intersection: TVector3Double; const Plane: TVector4Double; const Ray0, RayVector: TVector3Double): boolean; overload;
function TryPlaneRayIntersection(out Intersection: TVector3Single; out T: Single; const Plane: TVector4Single; const Ray0, RayVector: TVector3Single): boolean; overload;
function TryPlaneRayIntersection(out Intersection: TVector3Double; out T: Double; const Plane: TVector4Double; const Ray0, RayVector: TVector3Double): boolean; overload;
function TryPlaneSegmentDirIntersection(out Intersection: TVector3Single; const Plane: TVector4Single; const Segment0, SegmentVector: TVector3Single): boolean; overload;
function TryPlaneSegmentDirIntersection(out Intersection: TVector3Double; const Plane: TVector4Double; const Segment0, SegmentVector: TVector3Double): boolean; overload;
function TryPlaneSegmentDirIntersection(out Intersection: TVector3Single; out T: Single; const Plane: TVector4Single; const Segment0, SegmentVector: TVector3Single): boolean; overload;
function TryPlaneSegmentDirIntersection(out Intersection: TVector3Double; out T: Double; const Plane: TVector4Double; const Segment0, SegmentVector: TVector3Double): boolean; overload;
function IsPointOnSegmentLineWithinSegment(const intersection, pos1, pos2: TVector3Single): boolean; overload;
function IsPointOnSegmentLineWithinSegment(const intersection, pos1, pos2: TVector3Double): boolean; overload;
function LineOfTwoDifferentPoints2d(const p1, p2: TVector2Single): TVector3Single; overload;
function LineOfTwoDifferentPoints2d(const p1, p2: TVector2Double): TVector3Double; overload;
function PointToSegmentDistanceSqr(const point, pos1, pos2: TVector3Single): Single; overload;
function PointToSegmentDistanceSqr(const point, pos1, pos2: TVector3Double): Double; overload;
function IsTunnelSphereCollision(const Tunnel1, Tunnel2: TVector3Single; const TunnelRadius: Single; const SphereCenter: TVector3Single; const SphereRadius: Single): boolean; overload;
function IsTunnelSphereCollision(const Tunnel1, Tunnel2: TVector3Double; const TunnelRadius: Double; const SphereCenter: TVector3Double; const SphereRadius: Double): boolean; overload;
function IsSpheresCollision(const Sphere1Center: TVector3Single; const Sphere1Radius: Single; const Sphere2Center: TVector3Single; const Sphere2Radius: Single): boolean; overload;
function IsSpheresCollision(const Sphere1Center: TVector3Double; const Sphere1Radius: Double; const Sphere2Center: TVector3Double; const Sphere2Radius: Double): boolean; overload;
function IsSegmentSphereCollision(const pos1, pos2, SphereCenter: TVector3Single; const SphereRadius: Single): boolean; overload;
function IsSegmentSphereCollision(const pos1, pos2, SphereCenter: TVector3Double; const SphereRadius: Double): boolean; overload;
function IsValidTriangle(const Tri: TTriangle3Single): boolean; overload;
function IsValidTriangle(const Tri: TTriangle3Double): boolean; overload;
function TriangleDir(const Tri: TTriangle3Single): TVector3Single; overload;
function TriangleDir(const Tri: TTriangle3Double): TVector3Double; overload;
function TriangleDir(const p0, p1, p2: TVector3Single): TVector3Single; overload;
function TriangleDir(const p0, p1, p2: TVector3Double): TVector3Double; overload;
function TriangleNormal(const Tri: TTriangle3Single): TVector3Single; overload;
function TriangleNormal(const Tri: TTriangle3Double): TVector3Double; overload;
function TriangleNormal(const p0, p1, p2: TVector3Single): TVector3Single; overload;
function TriangleNormal(const p0, p1, p2: TVector3Double): TVector3Double; overload;
function IndexedTriangleNormal(const Indexes: TVector3Cardinal; VerticesArray: PVector3Single; VerticesStride: integer): TVector3Single;
function TriangleArea(const Tri: TTriangle3Single): Single; overload;
function TriangleArea(const Tri: TTriangle3Double): Double; overload;
function TriangleAreaSqr(const Tri: TTriangle3Single): Single; overload;
function TriangleAreaSqr(const Tri: TTriangle3Double): Double; overload;
function TrianglePlane(const Tri: TTriangle3Single): TVector4Single; overload;
function TrianglePlane(const Tri: TTriangle3Double): TVector4Double; overload;
function TrianglePlane(const p0, p1, p2: TVector3Single): TVector4Single; overload;
function TrianglePlane(const p0, p1, p2: TVector3Double): TVector4Double; overload;
function TriangleNormPlane(const Tri: TTriangle3Single): TVector4Single; overload;
function TriangleNormPlane(const Tri: TTriangle3Double): TVector4Double; overload;
function IsPointWithinTriangle2d(const P: TVector2Single; const Tri: TTriangle2Single): boolean; overload;
function IsPointWithinTriangle2d(const P: TVector2Double; const Tri: TTriangle2Double): boolean; overload;
function IsPointOnTrianglePlaneWithinTriangle(const P: TVector3Single; const Tri: TTriangle3Single; const TriDir: TVector3Single): boolean; overload;
function IsPointOnTrianglePlaneWithinTriangle(const P: TVector3Double; const Tri: TTriangle3Double; const TriDir: TVector3Double): boolean; overload;
function IsTriangleSegmentCollision(const Tri: TTriangle3Single; const TriPlane: TVector4Single; const pos1, pos2: TVector3Single): boolean; overload;
function IsTriangleSegmentCollision(const Tri: TTriangle3Double; const TriPlane: TVector4Double; const pos1, pos2: TVector3Double): boolean; overload;
function IsTriangleSegmentCollision(const Tri: TTriangle3Single; const pos1, pos2: TVector3Single): boolean; overload;
function IsTriangleSegmentCollision(const Tri: TTriangle3Double; const pos1, pos2: TVector3Double): boolean; overload;
function IsTriangleSphereCollision(const Tri: TTriangle3Single; const TriPlane: TVector4Single; const SphereCenter: TVector3Single; SphereRadius: Single): boolean; overload;
function IsTriangleSphereCollision(const Tri: TTriangle3Double; const TriPlane: TVector4Double; const SphereCenter: TVector3Double; SphereRadius: Double): boolean; overload;
function IsTriangleSphereCollision(const Tri: TTriangle3Single; const SphereCenter: TVector3Single; SphereRadius: Single): boolean; overload;
function IsTriangleSphereCollision(const Tri: TTriangle3Double; const SphereCenter: TVector3Double; SphereRadius: Double): boolean; overload;
function TryTriangleSegmentCollision(var Intersection: TVector3Single; const Tri: TTriangle3Single; const TriPlane: TVector4Single; const Pos1, Pos2: TVector3Single): boolean; overload;
function TryTriangleSegmentCollision(var Intersection: TVector3Double; const Tri: TTriangle3Double; const TriPlane: TVector4Double; const Pos1, Pos2: TVector3Double): boolean; overload;
function TryTriangleSegmentDirCollision(var Intersection: TVector3Single; const Tri: TTriangle3Single; const TriPlane: TVector4Single; const Segment0, SegmentVector: TVector3Single): boolean; overload;
function TryTriangleSegmentDirCollision(var Intersection: TVector3Double; const Tri: TTriangle3Double; const TriPlane: TVector4Double; const Segment0, SegmentVector: TVector3Double): boolean; overload;
function TryTriangleSegmentDirCollision(var Intersection: TVector3Single; var T: Single; const Tri: TTriangle3Single; const TriPlane: TVector4Single; const Segment0, SegmentVector: TVector3Single): boolean; overload;
function TryTriangleSegmentDirCollision(var Intersection: TVector3Double; var T: Double; const Tri: TTriangle3Double; const TriPlane: TVector4Double; const Segment0, SegmentVector: TVector3Double): boolean; overload;
function TryTriangleRayCollision(var Intersection: TVector3Single; const Tri: TTriangle3Single; const TriPlane: TVector4Single; const Ray0, RayVector: TVector3Single): boolean; overload;
function TryTriangleRayCollision(var Intersection: TVector3Double; const Tri: TTriangle3Double; const TriPlane: TVector4Double; const Ray0, RayVector: TVector3Double): boolean; overload;
function TryTriangleRayCollision(var Intersection: TVector3Single; var T: Single; const Tri: TTriangle3Single; const TriPlane: TVector4Single; const Ray0, RayVector: TVector3Single): boolean; overload;
function TryTriangleRayCollision(var Intersection: TVector3Double; var T: Double; const Tri: TTriangle3Double; const TriPlane: TVector4Double; const Ray0, RayVector: TVector3Double): boolean; overload;
function IndexedPolygonNormal(Indices: PArray_Longint; IndicesCount: integer; Verts: PArray_Vector3Single; const ResultForIncorrectPoly: TVector3Single): TVector3Single;
function IsPolygon2dCCW(Verts: PArray_Vector2Single; const VertsCount: Integer): Single; overload;
function IsPolygon2dCCW(const Verts: array of TVector2Single): Single; overload;
function Polygon2dArea(Verts: PArray_Vector2Single; const VertsCount: Integer): Single; overload;
function Polygon2dArea(const Verts: array of TVector2Single): Single; overload;
function SampleTrianglePoint(const Tri: TTriangle3Single): TVector3Single;
function FloatToNiceStr(f: Single): string; overload;
function FloatToNiceStr(f: Double): string; overload;
function VectorToNiceStr(const v: array of Byte): string; overload;
function VectorToNiceStr(const v: array of Single): string; overload;
function VectorToNiceStr(const v: array of Double): string; overload;
function MatrixToNiceStr(const v: TMatrix4Single; const LineIndent: string): string; overload;
function MatrixToNiceStr(const v: TMatrix4Double; const LineIndent: string): string; overload;
function TriangleToNiceStr(const t: TTriangle2Single): string; overload;
function TriangleToNiceStr(const t: TTriangle2Double): string; overload;
function TriangleToNiceStr(const t: TTriangle3Single): string; overload;
function TriangleToNiceStr(const t: TTriangle3Double): string; overload;
function FloatToRawStr(f: Single): string; overload;
function FloatToRawStr(f: Double): string; overload;
function VectorToRawStr(const v: array of Single): string; overload;
function VectorToRawStr(const v: array of Double): string; overload;
function TriangleToRawStr(const t: TTriangle3Single): string; overload;
function TriangleToRawStr(const t: TTriangle3Double): string; overload;
function MatrixAdd(const m1, m2: TMatrix3Single): TMatrix3Single;
procedure MatrixAddTo1st(var m1: TMatrix3Single; const m2: TMatrix3Single);
function MatrixSubtract(const m1, m2: TMatrix3Single): TMatrix3Single;
procedure MatrixSubtractTo1st(var m1: TMatrix3Single; const m2: TMatrix3Single);
function MatrixMultScalar(const m: TMatrix3Single; const s: Single): TMatrix3Single;
function MultMatrixPoint(const m: TMatrix4Single; const pt: TVector3Single): TVector3Single;
function MultMatrixVector(const m: TMatrix4Single; const v: TVector4Single): TVector4Single; overload;
function MultMatrixVector(const m: TMatrix3Single; const v: TVector3Single): TVector3Single; overload;
function MultMatrixPointNoTranslation(const m: TMatrix4Single; const v: TVector3Single): TVector3Single;
function MultMatrices(const m1, m2: TMatrix4Single): TMatrix4Single;
function VectorMultTransposedSameVector(const v: TVector3Single): TMatrix3Single;
function TranslationMatrix(const X, Y, Z: Single): TMatrix4Single; overload;
function TranslationMatrix(const X, Y, Z: Double): TMatrix4Single; overload;
function TranslationMatrix(const Transl: TVector3Single): TMatrix4Single; overload;
function TranslationMatrix(const Transl: TVector3Double): TMatrix4Single; overload;
procedure TranslationMatrices(const X, Y, Z: Single; out Matrix, InvertedMatrix: TMatrix4Single); overload;
procedure TranslationMatrices(const X, Y, Z: Double; out Matrix, InvertedMatrix: TMatrix4Single); overload;
procedure TranslationMatrices(const Transl: TVector3Single; out Matrix, InvertedMatrix: TMatrix4Single); overload;
procedure TranslationMatrices(const Transl: TVector3Double; out Matrix, InvertedMatrix: TMatrix4Single); overload;
function ScalingMatrix(const ScaleFactor: TVector3Single): TMatrix4Single;
procedure ScalingMatrices(const ScaleFactor: TVector3Single; InvertedMatrixIdentityIfNotExists: boolean; out Matrix, InvertedMatrix: TMatrix4Single);
function RotationMatrixRad(const AngleRad: Single; const Axis: TVector3Single): TMatrix4Single;
function RotationMatrixDeg(const AngleDeg: Single; const Axis: TVector3Single): TMatrix4Single;
function RotationMatrixRad(const AngleRad: Single; const AxisX, AxisY, AxisZ: Single): TMatrix4Single;
function RotationMatrixDeg(const AngleDeg: Single; const AxisX, AxisY, AxisZ: Single): TMatrix4Single;
procedure RotationMatricesRad(const AngleRad: Single; const Axis: TVector3Single; out Matrix, InvertedMatrix: TMatrix4Single);
function OrthoProjMatrix(const left, right, bottom, top, zNear, zFar: Single): TMatrix4Single;
function Ortho2dProjMatrix(const left, right, bottom, top: Single): TMatrix4Single;
function FrustumProjMatrix(const left, right, bottom, top, zNear, zFar: Single): TMatrix4Single;
function PerspectiveProjMatrixDeg(const fovyDeg, aspect, zNear, zFar: Single): TMatrix4Single;
function PerspectiveProjMatrixRad(const fovyRad, aspect, zNear, zFar: Single): TMatrix4Single;
function MatrixDet4x4(const mat: TMatrix4Single): Single;
function MatrixDet3x3(const a1, a2, a3, b1, b2, b3, c1, c2, c3: Single): Single;
function MatrixDet2x2(const a, b, c, d: Single): Single;
function TransformToCoordsMatrix(const NewOrigin, NewX, NewY, NewZ: TVector3Single):