libMVRgdtf 40bc00a
A library for GDTF and MVR
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
MCMatrix.h
Go to the documentation of this file.
1//
2// Copyright Nemetschek Vectorworks, Inc.
3// Use of this file is governed by the Nemetschek Vectorworks SDK License Agreement
4// http://developer.vectorworks.net/index.php?title=Vectorworks_SDK_License
5//
6//
7// Declares a set of useful matrix classes & functions.
8//
9
10
11#ifndef _MCMATRIX_
12#define _MCMATRIX_
13
14#pragma once
15
16#include "MCCoordTypes.h"
17#include "BasicMath.X.h"
18
19namespace VectorworksMVR
20{
21
22 //**********************************************************************************
23 //****************************** Constants *******************************
24 //**********************************************************************************
25
26 typedef short MajorAxisSpec;
27
32
33
34 //**********************************************************************************
35 //************************** TransformXMatrix Routines ***************************
36 //**********************************************************************************
37
38 void GS_API MatrixToXMatrix(const TransformMatrix &source, TransformXMatrix &dest);
40 void GS_API XMatrixToMatrix(const TransformXMatrix &source, TransformMatrix &dest);
43
44
45 // NEW MATRIX TRANSFORMS 3/3/97
46 void GS_API XPointTransformN(const WorldPt3 &a, const TransformXMatrix &mat, WorldPt3 &b);
47
49 // I made this inline to make render pipeline sweeping faster -DLD 6/4/99
50 {
51 return WorldPt3(a.x * mat.mat[0][0] + a.y * mat.mat[1][0] + a.z * mat.mat[2][0] + mat.mat[3][0],
52 a.x * mat.mat[0][1] + a.y * mat.mat[1][1] + a.z * mat.mat[2][1] + mat.mat[3][1],
53 a.x * mat.mat[0][2] + a.y * mat.mat[1][2] + a.z * mat.mat[2][2] + mat.mat[3][2]);
54 }
55
58 void GS_API VectorXTransformN(const Vector a, const TransformXMatrix &mat, Vector &b);
59 void GS_API InverseVectorXTransformN(const Vector a, const TransformXMatrix &mat, Vector &b);
60 void GS_API XMatrixMultiply(const TransformXMatrix &mat1, const TransformXMatrix &mat2, TransformXMatrix &dest);
65 void GS_API InvertXMatrix(const TransformXMatrix &source, TransformXMatrix &dest);
66 void GS_API AssignVectorsToXMatrix(const Vector &aVec, const Vector &bVec, const Vector &cVec, TransformXMatrix &mat);
67
68
69 //**********************************************************************************
70 //************************** TransformMatrix Routines ****************************
71 //**********************************************************************************
72
73 // NEW MATRIX TRANSFORMS 3/3/97
74 void GS_API PointTransformN(const WorldPt3 &a, const TransformMatrix &mat, WorldPt3 &b);
76 void GS_API InversePointTransformN(const WorldPt3 &a, const TransformMatrix &mat, WorldPt3 &b);
77 void GS_API InversePointTransformN(const WorldPt3 &a, const TransformMatrix &mat, WorldPt3 &b);
78 void GS_API VectorTransformN(const Vector& a, const TransformMatrix& mat, Vector& b);
79 void GS_API VectorTransformN(const WorldPt3 &a, const TransformMatrix &mat, WorldPt3 &b);
80 void GS_API InverseVectorTransformN(const WorldPt3 &a, const TransformMatrix &mat, WorldPt3 &b);
81 void GS_API InverseVectorTransformN(const Vector &a, const TransformMatrix &mat, Vector &b);
82 void GS_API CubeTransformN(const WorldCube& in, const TransformMatrix& mat, WorldCube& out);
83
84 inline WorldPt3 operator*(const WorldPt3& inPt, const TransformMatrix& inMat)
85 // XPointTransformN for when there are many transforms to do and the code looks cluttered.
86 // John Williams, 3/24/99
87 {
88 WorldPt3 outPt;
89 PointTransformN(inPt, inMat, outPt);
90 return outPt;
91 }
92
93 // NEW 2D TRANSFORMS
94 void InversePoint2DTransform(const WorldPt &a, const TransformMatrix &mat, WorldPt &b);
95
96 inline void Point2DTransform(const WorldPt &a, const TransformMatrix &mat, WorldPt &b)
97 {
98#if 0
99 ASSERT4BYTEALIGNMENT(&a, "Point2DTransform point a");
100 ASSERT4BYTEALIGNMENT(&b, "Point2DTransform point b");
101 ASSERT4BYTEALIGNMENT(&mat, "Point2DTransform matrix");
102#endif
103
104 WorldPt p = a;
105
106 b.x = p.x * mat.v1.a00 +
107 p.y * mat.v1.a10 +
108 mat.v1.xOff;
109 b.y = p.x * mat.v1.a01 +
110 p.y * mat.v1.a11 +
111 mat.v1.yOff;
112}
113
114 void InverseVector2DTransform(const WorldPt &a, const TransformMatrix &mat, WorldPt &b);
115
117 inline void Vector2DTransform(const Vector2 &a, const TransformMatrix &mat, Vector2 &b)
118 {
119#if 0
120 ASSERT4BYTEALIGNMENT(&a, "Vector2DTransform point a");
121 ASSERT4BYTEALIGNMENT(&b, "Vector2DTransform point b");
122 ASSERT4BYTEALIGNMENT(&mat, "Vector2DTransform matrix");
123#endif
124
125 Vector2 p = a;
126
127 b.x = p.x * mat.v1.a00 +
128 p.y * mat.v1.a10;
129
130 b.y = p.x * mat.v1.a01 +
131 p.y * mat.v1.a11;
132}
133
134 void PointTransformTo2D(const WorldPt3 &a, const TransformMatrix &mat, WorldPt &b);
135
136
139
141
143 void GS_API InvertMatrix(const TransformMatrix &source, TransformMatrix &dest);
145 void GS_API SetAxisRotationMatrix(MajorAxisSpec axis, double_param degrees, const WorldPt3& center, TransformMatrix &mat);
146 void GS_API SetVectorRotationMatrix(const Vector &theVec, double_param degrees, TransformMatrix &mat);
147 void GS_API Set2DAxisFlipMatrix(const MajorAxisSpec axis, const WorldPt& origin, TransformMatrix& tm);
148 Boolean GS_API MakeVectorsOrthonormal(Vector &aVec, Vector &bVec, Vector &cVec, Boolean first);
149 void GS_API GetVectorsFromMatrix(const TransformMatrix &mat, Vector &aVec, Vector &bVec, Vector &cVec);
150 void GS_API AssignVectorsToMatrix(const Vector &aVec, const Vector &bVec, const Vector &cVec, TransformMatrix &mat);
151 void GS_API CreateMatrixFromAxis(const Axis &axis, TransformMatrix &mat);
152 void GS_API CreateAxisFromMatrix(const TransformMatrix &mat, Axis &axis);
153 void GS_API SetMatrixKI(const WorldPt3 &kDir, const WorldPt3 &iDir, TransformMatrix &mat);
154void GS_API SetMatrixKJ(const WorldPt3 &kDir, const WorldPt3 &jDir, TransformMatrix &mat);
155void GS_API SetMatrixIJ(const WorldPt3 &kDir, const WorldPt3 &iDir, TransformMatrix &mat);
158 MajorAxisSpec firstAxis,
159 MajorAxisSpec secondAxis,
160 MajorAxisSpec thirdAxis,
161 double_param firstAngleDegrees,
162 double_param secondAngleDegrees,
163 double_param thirdAngleDegrees,
164 const WorldPt3 &center,
165 Boolean fromzero);
166 void GS_API GetAnglesFromMatrix(const TransformMatrix &inMat, Degrees &outAboutXAxis, Degrees &outAboutYAxis, Degrees &outAboutZAxis);
167
168 // This function calculates a transformation matrix (non afine)
169 // that transforms the first triangle (inPt1, inPt2, inPt3) into (transfPt1, transfPt2, transfPt3) triangle
171 const WorldPt3& inPt1, const WorldPt3& inPt2, const WorldPt3& inPt3,
172 const WorldPt3& transfPt1, const WorldPt3& transfPt2, const WorldPt3& transfPt3);
173
174void GS_API RotateMatrix2D(double_param degrees, const WorldPt& center, TransformMatrix &mat);
175
176bool RayPlaneIntersection(const WorldPt3& ptOnPlane, const WorldPt3& planeNormal, const Ray& ray, WorldPt3* pOutIntersection=NULL, double* pOutDistance=NULL);
177bool RayPlaneIntersection(const TransformMatrix& plane, const Ray& ray, WorldPt3* pOutIntersection=NULL, double* pOutDistance=NULL);
178bool RayPlaneIntersection(const Axis& plane, const Ray& ray, WorldPt3* pOutIntersection=NULL, double* pOutDistance=NULL);
179bool IsPointNearLine(const WorldPt & inPoint, const WorldPt & inP0, const WorldPt & inP1, double inNearDist, Sint32 inLineType);
180bool RayCubeIntersection(const WorldCube& inwc, const Ray& inRay,
181 WorldPt3* outpwpt3Int1=NULL, WorldPt3* outpwpt3Int2=NULL,
182 double* outpA1=NULL, double* outpA2=NULL) ;
183bool LineIntersectsCube( const WorldCube& inWC, const WorldPt3& L1, const WorldPt3& L2, WorldPt3 &Hit1, WorldPt3 &Hit2 );
184
185#if BUG
186void BugVerifyTransformMatrix(const TransformMatrix& matrix);
187#endif
188
190 {
191#if BUG
192 BugVerifyTransformMatrix(matrix);
193#endif
194 }
195
196 //**********************************************************************************
197 //****************************** Inline transforms *******************************
198 //**********************************************************************************
199
200 // NEW MATRIX TRANSFORMS 3/3/97
201
203 {
204 WorldPt3 result;
205 PointTransformN(a, mat, result);
206 return result;
207 }
208
210 {
211 WorldPt3 result;
212 NonLinearPointTransformN(a, mat, result);
213 return result;
214 }
215
217 {
218 WorldPt3 result;
219 InversePointTransformN(a, mat, result);
220 return result;
221 }
222
223 inline Vector VectorTransformN(const Vector &a, const TransformMatrix &mat)
224 {
225 Vector result;
226 VectorTransformN(a, mat, result);
227 return result;
228 }
229
231 {
232 Vector result;
233 InverseVectorTransformN(a, mat, result);
234 return result;
235 }
236
237
238 //**********************************************************************************
239 //***************************** CoordSystem Classes ******************************
240 //**********************************************************************************
241
242
244 {
245 protected:
248
249 public:
252 GS_API TOneWayCoordSystem(const Axis& csAxis);
253
254 TOneWayCoordSystem(const TOneWayCoordSystem& cs) { memcpy(this, &cs, sizeof(TOneWayCoordSystem)); }
255 TOneWayCoordSystem& operator=(const TOneWayCoordSystem& cs) { memcpy(this, &cs, sizeof(TOneWayCoordSystem)); return *this; }
256
257 const TransformMatrix& GetMat() const { return this->fCSMat; }
258 const Axis& GetAxis() const { return this->fCSAxis; }
259};
260
261
263 {
264 protected:
266
267 void GS_API Setup(void);
268
269 public:
270 GS_API TCoordSystem(void);
271 GS_API TCoordSystem(const TOneWayCoordSystem& csSystem);
272 GS_API TCoordSystem(const TransformMatrix& csMatrix);
273 GS_API TCoordSystem(const Axis& csAxis);
274
275 TCoordSystem(const TCoordSystem& cs) { memcpy(this, &cs, sizeof(TCoordSystem)); }
276 TCoordSystem& operator=(const TCoordSystem& cs) { memcpy(this, &cs, sizeof(TCoordSystem)); return *this; }
277
278 const TransformMatrix& GetInverseMat() const { return *((const TransformMatrix *) &this->fInverseCSMat); }
279 bool IsOrthonormal() const { return fInverseCSMat.IsOrthogonal(); }
280 };
281
282}
283#endif
int32_t Sint32
Definition GSTypes.h:36
unsigned char Boolean
Definition GSTypes.h:111
#define ASSERT4BYTEALIGNMENT(p, s)
Definition MCFloat.h:99
#define GS_API
Definition StdAfx.h:46
double a10
Definition MCCoordTypes.h:1649
struct VectorworksMVR::_TransformMatrix::@1::@3 v1
double a00
Definition MCCoordTypes.h:1648
_WorldCoord xOff
Definition MCCoordTypes.h:1651
_WorldCoord yOff
Definition MCCoordTypes.h:1651
double a01
Definition MCCoordTypes.h:1648
double a11
Definition MCCoordTypes.h:1649
_WorldCoord y
Definition MCCoordTypes.h:194
_WorldCoord x
Definition MCCoordTypes.h:194
Definition MCCoordTypes.h:1806
Definition MCMatrix.h:263
bool IsOrthonormal() const
Definition MCMatrix.h:279
TCoordSystem & operator=(const TCoordSystem &cs)
Definition MCMatrix.h:276
void GS_API Setup(void)
Definition MCMatrix.cpp:2061
const TransformMatrix & GetInverseMat() const
Definition MCMatrix.h:278
GS_API TCoordSystem(void)
Definition MCMatrix.cpp:2067
TCoordSystem(const TCoordSystem &cs)
Definition MCMatrix.h:275
TransformMatrix fInverseCSMat
Definition MCMatrix.h:265
Definition MCMatrix.h:244
Axis fCSAxis
Definition MCMatrix.h:246
TransformMatrix fCSMat
Definition MCMatrix.h:247
const TransformMatrix & GetMat() const
Definition MCMatrix.h:257
GS_API TOneWayCoordSystem(void)
Definition MCMatrix.cpp:2042
const Axis & GetAxis() const
Definition MCMatrix.h:258
TOneWayCoordSystem & operator=(const TOneWayCoordSystem &cs)
Definition MCMatrix.h:255
TOneWayCoordSystem(const TOneWayCoordSystem &cs)
Definition MCMatrix.h:254
Definition MCCoordTypes.h:1674
bool GS_API IsOrthogonal() const
Definition MCCoordTypes.h:1272
Definition MCCoordTypes.h:221
Definition CieColor.h:9
void GS_API SetAxisRotationXMatrix(MajorAxisSpec axis, double_param degrees, TransformXMatrix &mat)
Definition MCMatrix.cpp:276
short MajorAxisSpec
Definition MCMatrix.h:26
void GS_API InvertMatrix(const TransformMatrix &source, TransformMatrix &dest)
Definition MCMatrix.cpp:998
void GS_API InversePointTransformN(const WorldPt3 &a, const TransformMatrix &mat, WorldPt3 &b)
Definition MCMatrix.cpp:815
void GS_API XMatrixMultiply(const TransformXMatrix &mat1, const TransformXMatrix &mat2, TransformXMatrix &dest)
Definition MCMatrix.cpp:214
void GS_API SetMatrixKI(const WorldPt3 &kDir, const WorldPt3 &iDir, TransformMatrix &mat)
Definition MCMatrix.cpp:1349
void GS_API GetVectorsFromMatrix(const TransformMatrix &mat, Vector &aVec, Vector &bVec, Vector &cVec)
Definition MCMatrix.cpp:1276
BUG_ONLY(void AssertNum2Short(double x))
void VerifyTransformMatrix(const TransformMatrix &BUG_ONLY(matrix))
Definition MCMatrix.h:189
bool IsPointNearLine(const WorldPt &inPoint, const WorldPt &inP0, const WorldPt &inP1, double inNearDist, Sint32 inLineType)
Definition MCMatrix.cpp:1716
void GS_API SetVectorRotationXMatrix(const Vector &axis, double_param degrees, TransformXMatrix &mat)
Definition MCMatrix.cpp:323
void GS_API AssignVectorsToXMatrix(const Vector &aVec, const Vector &bVec, const Vector &cVec, TransformXMatrix &mat)
Definition MCMatrix.cpp:568
const MajorAxisSpec kXAxis
Definition MCMatrix.h:29
void GS_API SetVectorRotationMatrix(const Vector &theVec, double_param degrees, TransformMatrix &mat)
Definition MCMatrix.cpp:1156
bool RayPlaneIntersection(const WorldPt3 &ptOnPlane, const WorldPt3 &planeNormal, const Ray &ray, WorldPt3 *pOutIntersection=NULL, double *pOutDistance=NULL)
Definition MCMatrix.cpp:1687
const GS_API TransformMatrix & IdentityMatrix()
Definition MCMatrix.cpp:735
TransformMatrix GS_API MatrixMultiply(const TransformMatrix &mat1, const TransformMatrix &mat2)
Definition MCMatrix.cpp:910
void GS_API InverseVectorXTransformN(const Vector a, const TransformXMatrix &mat, Vector &b)
Definition MCMatrix.cpp:659
Boolean GS_API MakeVectorsOrthonormal(Vector &aVec, Vector &bVec, Vector &cVec, Boolean first)
Definition MCMatrix.cpp:1244
void InversePoint2DTransform(const WorldPt &a, const TransformMatrix &mat, WorldPt &b)
Definition MCMatrix.cpp:860
void GS_API RotateMatrix2D(double_param degrees, const WorldPt &center, TransformMatrix &mat)
Definition MCMatrix.cpp:1455
Boolean GS_API XMatrix2Matrix(const TransformXMatrix &source, TransformMatrix &dest)
double WorldCoord
Definition MCCoordTypes.h:62
void GS_API GetAnglesFromMatrix(const TransformMatrix &inMat, Degrees &outAboutXAxis, Degrees &outAboutYAxis, Degrees &outAboutZAxis)
Definition MCMatrix.cpp:1061
const double_gs double_param
Definition MCFloat.h:41
bool LineIntersectsCube(const WorldCube &inWC, const WorldPt3 &L1, const WorldPt3 &L2, WorldPt3 &Hit1, WorldPt3 &Hit2)
Definition MCMatrix.cpp:1951
void GS_API AssignVectorsToMatrix(const Vector &aVec, const Vector &bVec, const Vector &cVec, TransformMatrix &mat)
Definition MCMatrix.cpp:1300
void GS_API MatrixMakeOrthogonal(TransformMatrix &mat)
Definition MCMatrix.cpp:971
void GS_API XPointTransformN(const WorldPt3 &a, const TransformXMatrix &mat, WorldPt3 &b)
Definition MCMatrix.cpp:595
void GS_API VectorTransformN(const Vector &a, const TransformMatrix &mat, Vector &b)
Definition MCMatrix.cpp:831
WorldPt operator*(const double scalar, const WorldPt thePt)
Definition MCCoordTypes.h:302
void GS_API CreateMatrixFromAxis(const Axis &axis, TransformMatrix &mat)
Definition MCMatrix.cpp:1322
bool RayCubeIntersection(const WorldCube &inwc, const Ray &inRay, WorldPt3 *outpwpt3Int1=NULL, WorldPt3 *outpwpt3Int2=NULL, double *outpA1=NULL, double *outpA2=NULL)
Definition MCMatrix.cpp:1755
void GS_API InverseXPointTransformN(const WorldPt3 &a, const TransformXMatrix &mat, WorldPt3 &b)
void GS_API InvertXMatrix(const TransformXMatrix &source, TransformXMatrix &dest)
Definition MCMatrix.cpp:455
void Vector2DTransform(const Vector2 &a, const TransformMatrix &mat, Vector2 &b)
Definition MCMatrix.h:117
void GS_API PointTransformN(const WorldPt3 &a, const TransformMatrix &mat, WorldPt3 &b)
Definition MCMatrix.cpp:799
void InverseVector2DTransform(const WorldPt &a, const TransformMatrix &mat, WorldPt &b)
Definition MCMatrix.cpp:876
void GS_API VectorXTransformN(const Vector a, const TransformXMatrix &mat, Vector &b)
Definition MCMatrix.cpp:646
void Point2DTransform(const WorldPt &a, const TransformMatrix &mat, WorldPt &b)
Definition MCMatrix.h:96
const MajorAxisSpec kZAxis
Definition MCMatrix.h:31
const MajorAxisSpec kYAxis
Definition MCMatrix.h:30
void PointTransformTo2D(const WorldPt3 &a, const TransformMatrix &mat, WorldPt &b)
Definition MCMatrix.cpp:891
void GS_API XMatrixToMatrix(const TransformXMatrix &source, TransformMatrix &dest)
Definition MCMatrix.cpp:120
void GS_API MakeXMatrixOrthogonal(TransformXMatrix &mat)
void GS_API SetMatrixKJ(const WorldPt3 &kDir, const WorldPt3 &jDir, TransformMatrix &mat)
Definition MCMatrix.cpp:1368
bool GS_API CalcTransformFromOneTriToAnother(TransformMatrix &outMatrix, const WorldPt3 &inPt1, const WorldPt3 &inPt2, const WorldPt3 &inPt3, const WorldPt3 &transfPt1, const WorldPt3 &transfPt2, const WorldPt3 &transfPt3)
Definition MCMatrix.cpp:1468
void GS_API InverseVectorTransformN(const WorldPt3 &a, const TransformMatrix &mat, WorldPt3 &b)
Definition MCMatrix.cpp:844
void GS_API SetAxisRotationMatrix(MajorAxisSpec axis, double_param degrees, TransformMatrix &mat)
Definition MCMatrix.cpp:1012
void GS_API MatrixToXMatrix(const TransformMatrix &source, TransformXMatrix &dest)
Definition MCMatrix.cpp:68
void GS_API NonLinearPointTransformN(const WorldPt3 &a, const TransformMatrix &mat, WorldPt3 &b)
Definition MCMatrix.cpp:782
void GS_API Set2DAxisFlipMatrix(const MajorAxisSpec axis, const WorldPt &origin, TransformMatrix &tm)
Definition MCMatrix.cpp:1196
void GS_API CubeTransformN(const WorldCube &in, const TransformMatrix &mat, WorldCube &out)
Definition MCMatrix.cpp:672
const MajorAxisSpec kNoAxis
Definition MCMatrix.h:28
void GS_API CreateAxisFromMatrix(const TransformMatrix &mat, Axis &axis)
Definition MCMatrix.cpp:1338
void GS_API SetMultiAxisSpinMatrix(TransformMatrix &mat, MajorAxisSpec firstAxis, MajorAxisSpec secondAxis, MajorAxisSpec thirdAxis, double_param firstAngleDegrees, double_param secondAngleDegrees, double_param thirdAngleDegrees, const WorldPt3 &center, Boolean fromzero)
Definition MCMatrix.cpp:1416
void GS_API SetMatrixIJ(const WorldPt3 &kDir, const WorldPt3 &iDir, TransformMatrix &mat)
Definition MCMatrix.cpp:1388
double Degrees
Definition MCCoordTypes.h:1992
void GS_API TranslateMatrix(TransformMatrix &f, WorldCoord x, WorldCoord y, WorldCoord z)
Definition MCMatrix.cpp:1406
Definition MCCoordTypes.h:1823
Definition MCCoordTypes.h:1733
double mat[4][4]
Definition MCCoordTypes.h:1734
_WorldCoord z
Definition MCCoordTypes.h:1012
_WorldCoord y
Definition MCCoordTypes.h:1012
_WorldCoord x
Definition MCCoordTypes.h:1012
Definition MCCoordTypes.h:1053