|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
3 B7 K9 q2 F, G) Z% h$ T
+ Q; B; N+ t, G6 Q7 a' t3 g) L( ^+ p3 A" L3 J
【二次开发源码】一种基于点投影,获取投影原始点的方法" S! t' P6 D6 k0 i& |* T t
8 h b$ _4 @9 x8 b一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角9 s0 p3 s) V* q5 ]$ h4 j
然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量
5 N" `+ [: r, L" q6 D( M& ^( ~9 b. ]/ x6 T5 D, Z8 v1 P* R" X# M
% \9 v; W2 @" D4 `# H- //这里仅仅考虑Z轴方向
! f3 N3 s( x$ n3 L7 `3 r$ e - void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3])6 R" H; n& N% m0 _& |6 [3 V
- {3 A8 X- J- }9 H- t
- double dotResult;
! R8 h9 ~" |+ ~ - double longDistance;
+ n+ _- D1 H' P - double zDir[3] = { 0.0,0.0,1.0 };! ~% B7 H6 }8 n
- //直线距离
/ Q7 A; O% k1 U, ]# a1 \+ m - double deltaProjectDistance = fabs(maxZValue - basePoint[2]);
+ ^. l* N" G+ `+ x, b) Y! H, c - 3 y4 m1 u9 L8 S! y
- Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);7 ?# C: k* Q+ K! ?; P
- 1 D" u" G5 y G* x& F
- if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回
3 ]5 z$ Y" o$ T8 j: t4 Q8 K% V - {
' `0 V# p5 x0 v, b* X- U& j - UF_VEC3_copy(basePoint, newOriginalPoint);
) p0 q& @* _$ W" Q: } w - return;' o3 N( }8 P* ]9 z8 j" H: u: h
- }
* X6 a0 T! a$ v: ~% P5 j2 E
' i9 P; V/ O9 {/ C- M- n1 E- //计算夹角,通过单位矢量
9 s/ U4 H( |6 B- y - //faceDir 可能反向
7 i0 i }8 @1 Q/ A3 t- [- @) x - UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);# |) h+ a b+ [* E( U+ I4 O' u
- // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle) ! O. Z1 f8 f, P9 ~# Y2 T8 Y
- double cosAngle = fabs(dotResult);
& X7 t. A& J" D( H4 t) l7 F9 L6 g - 1 R" h4 x% a5 S, z7 U3 y. D
- //斜边距离8 t+ _0 k$ u% b$ ], I$ R
- if (EQ_is_zero(cosAngle, MINTOL))
0 f7 `. f. O1 f5 P) P/ @# f - {; K2 c4 x! c% C* x4 L7 s
- longDistance = deltaProjectDistance;
6 ^0 b7 D+ k3 u g4 v- `. n+ F; Y# f2 e - }* D! d6 |: g" \: @" ]6 p6 f, u+ T5 _
- else
' y v0 R) M4 E$ G2 \ - {
( ] n$ T T3 @ - longDistance = deltaProjectDistance / cosAngle;9 ^& i7 e4 @: {7 ~- j
- }
3 C9 o* f- j, ?' ^$ c+ N# E - + |" H& p! C8 @: ^) J
- //这里可能出现方向相反,我们需要进行一次判定
+ s& K2 F# k( X. e$ ~6 M3 E% W5 m - : B9 T2 g8 n; w" L' f4 x
- UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);
2 B: r4 R- J& e& d - $ G1 s' ? b% j6 I+ o* X
- Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);* I3 f; O) f: ?, n" X3 q
) v3 i) C C) y- O( U3 J7 }- if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))
. R6 @2 @3 v- y2 | - {
5 A% E1 z/ f3 U8 l) Z - UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);6 C6 Z' x# u1 A) _0 c8 \
- }0 J. N9 F6 ]( _5 M% s$ A4 W3 T3 _; \' X
- H5 f6 b% D p3 A. e/ P- & r8 K# A) Q. F# y! p
- Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);
) [0 P# X n+ c( B+ E/ E - }
复制代码 : U. t2 ~$ [$ I( L0 c
; c6 _; |* d, O$ w |
|