|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
6 Z1 D3 T" x- K: R7 |
8 X; H; m4 L* j. x: Q7 [- e/ I. G+ U1 ~: z/ w" N" G1 _" E
【二次开发源码】一种基于点投影,获取投影原始点的方法
9 L7 x8 r+ s3 {8 }, m
- l9 }/ Z& Y' ~5 |9 s0 |一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角
+ }& d) Z9 A7 Z# |4 p5 d+ G! e+ W然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量
$ j% H0 \+ g( l3 m/ q& ]& _: N
, J) L+ F2 g& h/ d& Z- : ], k* G6 O6 ]4 f% L
- //这里仅仅考虑Z轴方向
, H9 x2 V! ~5 \* T) E1 ^ - void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3])
7 ]! ?6 J% i- D/ |) k - {8 }& _; U! U! [5 ]4 T
- double dotResult;7 |7 v% `1 J7 y) s- _
- double longDistance;
* i2 L+ L* f) h" K) Y4 b' o - double zDir[3] = { 0.0,0.0,1.0 };
6 U! j% G$ F: h7 u% r$ |" Y - //直线距离% W5 X3 r( G/ l" d
- double deltaProjectDistance = fabs(maxZValue - basePoint[2]);
! e7 i0 [. C. I: g2 A
" V0 `; [) Y3 O$ k# `! T. H- C- Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);& m5 G" P0 q5 E9 F4 q7 y
- 2 }% y0 s& j' {; q3 v
- if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回
4 }3 L4 E. |* Y - {
# A5 h( z3 G+ y' x+ K' @- {& P - UF_VEC3_copy(basePoint, newOriginalPoint);4 `6 }8 S" g0 n# T2 c
- return;8 U* G+ i# h4 b9 u% j
- }6 q9 y4 n1 w n7 B" Q( f& T% k
% L0 E, p7 ~+ {) q4 V6 V% l- //计算夹角,通过单位矢量
% d1 i$ p5 T; z( L M5 \ - //faceDir 可能反向 * Q1 Y% S* `2 x& X; X( t% a
- UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);
/ ~, m! O) T2 }/ o: D" _- y7 O0 p7 b - // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle) # D# e+ K7 w% t+ Y' D9 J3 H2 ]
- double cosAngle = fabs(dotResult);1 c6 d* ]% l4 P* {8 }
-
3 W3 `( R* X5 A3 g0 J" w; l% ]5 a. O - //斜边距离4 F' S) X) d( M8 J8 W4 ^
- if (EQ_is_zero(cosAngle, MINTOL))
5 i9 F- ]$ z$ m - {
- S5 N+ r% I8 v [, _# y' z; }( R2 _ - longDistance = deltaProjectDistance;9 n0 P9 L' O" `5 ~! ?
- }
$ Z. s1 D- ~0 ^ - else, x' R n) v! n: `2 Z
- {
% j! `" C" [+ d8 m, N - longDistance = deltaProjectDistance / cosAngle;
: c7 O9 }! C6 ^. `& h( E - }$ _3 E3 `2 y8 x7 h, z4 q
-
# F/ s: Z/ O/ p6 G/ W - //这里可能出现方向相反,我们需要进行一次判定. L( T+ a7 e) @) [# m9 q
- 3 P/ P. I m* |1 V# o* g
- UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);7 b ]$ ]3 a* B
- 3 v. V0 r* D0 i( v
- Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);2 E% R& l. S* ~3 `/ ~9 Y% H L
- " [2 p4 a; c" n/ k
- if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))
" B" y& A; t4 y9 ?7 l0 G, b, C9 p2 p - {
" c" @! V2 m( i% { - UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);
* I% ]0 n# `5 D/ Y: O - }
' K& d# P5 i/ P
5 D! z. w# _8 U d# G# y% H! ^% ?
; `+ h8 y+ {# N' `8 I% U- Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);) f3 W N- S* ~, m+ s
- }
复制代码
* v1 g) v/ D3 T3 e' p z8 s1 l& a! c3 d9 r7 q* k
|
|