管路轴测图程序开发之数学函数
管路轴测图程序中主要用到了两个数学函数,用向量来计算真是太方便啦!
-
- 将直角坐标系下的一个向量转换为由任意三个向量组成的坐标系下的值;
- 计算一个向量与三个坐标轴的向量哪个更垂直;
我将这两个函数做成静态成员函数,方便调用,头文件定义如下:
1
:
//
------------------------------------------------------------------------------
2 : // Copyright (c) 2012 eryar All Rights Reserved.
3 : //
4 : // File : IsoMath.h
5 : // Author : eryar@163.com
6 : // Date : 2012-3-2 21:53
7 : // Version : 1.0v
8 : //
9 : // Description :
10 : //
11 : // ==============================================================================
12 :
13 : #ifndef _ISOMATH_H_
14 : #define _ISOMATH_H_
15 :
16 : #include < CMATH >
17 :
18 : #include " IsoVector.h "
19 :
20 : const double EPSILON = 1e - 6 ;
21 :
22 : class CIsoMath
23 : {
24 : public :
25 : CIsoMath();
26 : virtual ~ CIsoMath();
27 :
28 : // Transform coordinate from orthogonal coordinates to arbitrary coordinates
29 : static void TransformCoordinate( const CIsoVector & a, const CIsoVector & xAxis, const CIsoVector & yAxis, const CIsoVector & zAxis, CIsoVector & b);
30 :
31 : // Compute a vVec vector which is the most vertical to uVec vector;
32 : static void ComputeAxis( const CIsoVector & uVec, const CIsoVector & xAxis, const CIsoVector & yAxis, const CIsoVector & zAxis, CIsoVector & vVec);
33 : };
34 :
35 : #endif // _ISOMATH_H_
2 : // Copyright (c) 2012 eryar All Rights Reserved.
3 : //
4 : // File : IsoMath.h
5 : // Author : eryar@163.com
6 : // Date : 2012-3-2 21:53
7 : // Version : 1.0v
8 : //
9 : // Description :
10 : //
11 : // ==============================================================================
12 :
13 : #ifndef _ISOMATH_H_
14 : #define _ISOMATH_H_
15 :
16 : #include < CMATH >
17 :
18 : #include " IsoVector.h "
19 :
20 : const double EPSILON = 1e - 6 ;
21 :
22 : class CIsoMath
23 : {
24 : public :
25 : CIsoMath();
26 : virtual ~ CIsoMath();
27 :
28 : // Transform coordinate from orthogonal coordinates to arbitrary coordinates
29 : static void TransformCoordinate( const CIsoVector & a, const CIsoVector & xAxis, const CIsoVector & yAxis, const CIsoVector & zAxis, CIsoVector & b);
30 :
31 : // Compute a vVec vector which is the most vertical to uVec vector;
32 : static void ComputeAxis( const CIsoVector & uVec, const CIsoVector & xAxis, const CIsoVector & yAxis, const CIsoVector & zAxis, CIsoVector & vVec);
33 : };
34 :
35 : #endif // _ISOMATH_H_
经过试验,效果很满意,对向量,线性代数的作用当刮目相看。摘图如下:
如图所示为两个法兰和一段直管的轴测图投影效果,其中,模型数据是我测试假设的。
TransformCoordinate函数的作用是将管路部件的模型坐标转换为由红色x, y, z标识的三个向量组成的坐标系中的坐标;
ComputeAxis函数的作用是用来计算在红色x, y, z表示的坐标系中,平面一个向量与哪个轴更垂直,即点乘的值最小。其目的是用来计算法兰的另一边的方向;
当改变视向时,投影后的图形也会相应改变,说明计算结果还是比较可靠的。如下图所示:
到此为止,程序结构已经确定下来。其它代码量为处理各管路部件的模型数据与其符号数据的转换。
通过编程,使我对向量、矩阵的概念有了理性的认识。通过与角度运算对比,向量真是又快精度又高。