|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
8 q2 ]( i( I0 V, N1 R6 E. z) m6 M& X) G6 p$ u2 y$ W0 Q+ ~! w+ t3 {
- x& I: f( A# @& V, N% p5 k* l【二次开发源码】一种基于点投影,获取投影原始点的方法- r# o: M; g( E4 j
. D1 z) Y- \! }! D0 a8 j一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角
3 O& C3 I6 Z0 o' K+ w" T0 ~. a% L2 z然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量
) p: u8 @7 r: z! y
* @ {" m! V. C3 E- 5 }- n; M" Z- f
- //这里仅仅考虑Z轴方向9 V+ s2 _! S6 @. k+ ]. S
- void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3])# |9 l& H" I: \# i0 t# ~
- {
) N) Q1 ^/ T0 R y4 P8 [; c% y - double dotResult;" a& R# }" v; q i* Y
- double longDistance;
/ b6 M8 I& Q- ` ? - double zDir[3] = { 0.0,0.0,1.0 };1 w, V( a* y: M8 e5 s0 l3 a( {: T+ D
- //直线距离
* u* z- m& Q- W8 V- G! i; e - double deltaProjectDistance = fabs(maxZValue - basePoint[2]);
( k! l [0 U+ _& _" K: D - * |2 I" Q6 X4 w# ^, e
- Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);, G1 \+ t7 ]' u2 m/ ]* B, G1 ], z
+ q* W' m F9 N- ?- if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回* h. n1 |6 t! D" S' i2 Z
- {1 H0 ?( a: {; x, _ z6 J: k3 `# \
- UF_VEC3_copy(basePoint, newOriginalPoint);" Y8 u y3 V4 @. E3 w
- return;
/ y% y0 Y9 {# K T6 v - }
" @$ |+ w5 c5 [3 y1 {( ^* C
* W- s+ k) x9 ?, {- o- //计算夹角,通过单位矢量; v. I& n9 O5 w) b( k, Z
- //faceDir 可能反向 9 \' i9 k! y) ?" m- O$ W9 F! c7 j
- UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);2 B7 P0 u; P# z0 o9 a3 E
- // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle) & n' a( K, q$ ]% N$ ?6 w3 Z
- double cosAngle = fabs(dotResult);* z1 H+ V7 P7 j+ v1 N9 V
- 2 J* M |0 G+ p% h
- //斜边距离
0 ]9 ~' f9 ? Q- i$ d& b - if (EQ_is_zero(cosAngle, MINTOL)). R1 v3 Y- X0 D( n9 M4 X
- {' }2 _4 d$ s8 v) q5 a2 S
- longDistance = deltaProjectDistance;
2 ^" y6 A6 e4 v& ^* B/ q7 P - }4 B9 A0 r5 e. V# p- {6 n- \, h$ l
- else
# ~7 e2 O: b) O - {
& R3 F/ ?/ c% D, w - longDistance = deltaProjectDistance / cosAngle;
$ ]. O0 x1 I5 p! ^ - }* M6 e; D4 b* F) m; f
- 4 J, G8 c3 B( h! e% X3 S
- //这里可能出现方向相反,我们需要进行一次判定9 s; l0 @6 Y, i; a$ v% d
- " ^% V9 | G- Q% B( ?
- UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);
5 f0 v, J1 g0 L& w4 y
) h* T9 g7 H- j9 ~( Z- Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);, p4 }- x5 F1 M
8 `4 V. q- K; I& Z" ]- if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))& p/ @, \9 G; Y' T | ?
- {
6 y5 W8 p2 d: N1 W) ^ - UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);
6 @' L7 ^: m0 {1 {9 v - }$ d3 b# q2 i E
7 g* v" @+ N7 G7 Z; g
" P; D* ]7 W6 r- ]# ^0 R- Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);8 {6 y5 | t1 b1 _- r: o$ `# o" S
- }
复制代码
' G, \" ^+ s6 e* B3 z2 R% x8 [8 U7 z4 M$ u" M) a0 n$ t
|
|