| Description | uses | Classes, Interfaces, Objects and Records | Functions and Procedures | Types | Constants | Variables |
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 :
Triangle is a TTriangle<point-type> type. Where <point-type> is such suffix that vector type TVector<point-type> exists. For example, we have TVector3Single type that represents a point in 3D space, so you can use TTriangle3Single to represent triangle in 3D space. There are also 2D triangles like TTriangle2Single and TTriangle2Double.
Triangle's three points must not be collinear, i.e. routines in this unit generally don't accept "degenerated" triangles that are not really triangles. So 3D triangle must unambiguously define some plane in the 3D space. The only function in this unit that is able to handle "degenerated" triangles is IsValidTriangle, which is exactly used to check whether the triangle is degenerated.
Since every valid triangle unambiguously determines some plane in the 3D space, it also determines it's normal vector. In this unit, when dealing with normal vectors, I use two names:
TriangleNormal means that this is the normalized (i.e. scaled to length 1.0) normal vector.
TriangleDir means that this is not necessarily normalized normal vector.
Plane in 3D space is a vector TVector4*. Such vector [A, B, C, D] defines a surface that consists of all points satisfying equation A * x + B * y + C * z + D = 0. At least one of A, B, C must be different than zero.
Vector [A, B, C] is called PlaneDir in many places. Or PlaneNormal when it's guaranteed (or required to be) normalized, i.e. scaled to have length 1.
Line in 3D space is represented by two 3D vectors: Line0 and LineVector. They determine a line consisting of all points that can be calculated as Line0 + R * LineVector where R is any real value.
LineVector must not be a zero vector.
Line in 2D space is sometimes represented as 2D vectors Line0 and LineVector (analogously like line in 3D).
And sometimes it's represented as a 3-items vector, like TVector3Single (for [A, B, C] line consists of all points satisfying A * x + B * y + C = 0). At least one of A, B must be different than zero.
A tunnel is an object that you get by moving a sphere along the line segment. In other words, this is like a cylinder, but ended with a hemispheres. The tunnel is represented in this unit as two points Tunnel1, Tunnel2 (this defines a line segment) and a TunnelRadius.
A ray is defined just like a line: two vectors Ray0 and RayVector, RayVector must be nonzero. Ray consists of all points Line0 + R * LineVector for R being any real value >= 0.
A simple plane in 3D is a plane parallel to one of the three basic planes. This is a plane defined by the equation X = Const or Y = Count or Z = Const. Such plane is represented as PlaneConstCoord integer value equal to 0, 1 or 2 and PlaneConstValue.
Note that you can always represent the same plane using a more general plane 3D equation, just take
Plane[0..2 / PlaneConstCoord] = 0, Plane[PlaneConstCoord] = -1, Plane[3] = PlaneConstValue.
On such "simple plane" we can perform many calculations much faster.
A line segment (often referred to as just segment) is represented by two points Pos1 and Pos2. For some routines the order of points Pos1 and Pos2 is significant (but this is always explicitly stated in the interface, so don't worry).
Sometimes line segment is also represented as Segment0 and SegmentVector, this consists of all points Segment0 + SegmentVector * t for t in [0..1]. SegmentVector must not be a zero vector.
Conversion between the two representations above is trivial, just take Pos1 = Segment0 and Pos2 = Segment0 + SegmentVector.
On 2005-03 functions that work with frustum were added. Frustum is represented as TFrustum type, which is just 6 plane equations.
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:
Well, floating-point inaccuracy is, as always, a problem. This unit always uses FloatsEqual and variables SingleEpsilonEquality, DoubleEpsilonEquality and ExtendedEpsilonEquality when comparison of floating-point values is needed. In some cases you may be able to adjust these variables to somewhat fine-tune the comparisons.
For collision-detecting routines, the general strategy in case of uncertainty (when we're not sure whether there is a collision or the objects are just very very close to each other) is to say that there is a collision.
This means that we may detect a collision when in fact the precise mathematical calculation says that there is no collision.
This approach should be suitable for most use cases.
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).
| Name | Description |
|---|---|
Class TDynArray_1 |
|
Class TDynVector3SingleArray |
|
Class TDynArray_2 |
|
Class TDynArray_5 |
|
Class TDynArray_3 |
|
Class EVectorMathInvalidOp |
|
Class EPlanesParallel |
|
Class ELinesParallel |
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): |