|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
8 M( p* u: _5 X. n8 b9 o' r1 |- i
' a: B3 @! I( i6 B4 l! M7 s U
A- Z. h/ S! `3 }【二次开发源码】一种基于点投影,获取投影原始点的方法$ P0 b6 B% G8 b+ r! N+ v
4 Z( x8 ? [$ H% i一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角
2 B4 k6 }4 a% G7 t8 I4 d3 z# S2 [然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量
. w* ~/ {! K2 r
+ I: v% d- ?) X* h
4 e6 s% Q. P9 V* F! B- //这里仅仅考虑Z轴方向
! J8 _/ u) s' u3 a& Z - void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3])7 I7 o4 v g; r
- {
6 r4 X; m" V4 T5 F8 ~( _ - double dotResult;( |! ?4 \+ i+ R; ], G: K* L$ A7 w9 M
- double longDistance;3 ?& l# R7 ^" k+ I, N
- double zDir[3] = { 0.0,0.0,1.0 };" i$ i1 f+ P2 P$ [1 x' W0 G6 g( \- v' E+ {
- //直线距离- R% W) ?) a+ l/ B
- double deltaProjectDistance = fabs(maxZValue - basePoint[2]);
3 V3 I# L0 d O
4 \0 A! m8 n& S! L$ _& d2 F- Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);
2 X8 M* B$ f7 u. J' b F
5 W; J6 t# N0 r) e: v( B; N& ?/ D- if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回
: N1 Z. _3 w' R" P, a - {
6 a9 z% T! D; D% a$ Y3 u - UF_VEC3_copy(basePoint, newOriginalPoint);6 ~; s/ g9 _' D5 j
- return;& E5 z4 v& J$ a
- }
9 _" m: i- v8 }! k3 x$ I, V
: O; o+ n& o4 |" s- U- //计算夹角,通过单位矢量
! T- x+ J9 D) _8 _ - //faceDir 可能反向
/ O/ y0 h, _2 X. v - UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);; P/ C8 Y# t% [( M" b5 s
- // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle)
4 y l* X1 Q, X" B/ k - double cosAngle = fabs(dotResult);- W9 }& Z' [( M5 _: i- B0 s7 [
- " I, l) n7 N/ ^
- //斜边距离
! w2 Q# V5 ]' T - if (EQ_is_zero(cosAngle, MINTOL))
" T7 h1 ~4 K* D0 o. X - {4 _: Z8 d1 l/ h: g
- longDistance = deltaProjectDistance;
: G- R n) S; h) y% ?# L, v6 d) a - }
, F+ {0 v3 m& t7 X/ O - else
]0 B0 _3 k1 d/ ~2 N - {- r+ H7 G" O) n; S) S5 x/ }, P
- longDistance = deltaProjectDistance / cosAngle;7 W D$ p2 v8 j- @* f4 x
- }$ k8 s: E% V: | H( u/ L, @
- + ?- a1 \4 ]3 `# k* y W) l0 S
- //这里可能出现方向相反,我们需要进行一次判定. s% O, s6 y/ B9 e& i
- # `% j3 @. V2 {4 C, v6 ?) [
- UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);1 f" q" x8 c1 }1 X$ [6 t
# h0 }0 b2 N9 N6 e- Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);& E$ Q& Y3 n# J) N% [9 j# u$ `
6 {- [: D/ J0 q* P, F' w d- if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))
% `# Z7 f( k6 D% K - {
+ d. b: ^+ M5 H; [; M5 [ - UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);
- K5 a2 v. f# q0 Z - }+ R4 L( h% L( k6 j5 N( i+ d9 n+ b2 A D
2 y& l; u2 q: c& M4 Y; P- 8 _) F1 B1 `4 y' @$ Z% Y
- Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);
4 Q3 i8 ^4 n6 h2 I( V! U- C5 P" y - }
复制代码 ! ^2 _' ?# g) B A7 V& b
0 a4 n% c% G8 J+ S- H8 V |
|