|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
9 i B, b! j1 v5 C0 l
4 z) M( [2 T( B; P: t0 O
5 I6 [4 q0 H1 W' o( U【二次开发源码】一种基于点投影,获取投影原始点的方法6 A7 |; W2 B8 e, B; v
7 R0 g) {" f3 E0 T/ W
一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角
2 ~+ T% Y4 d y9 V5 c& [然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量
6 ?2 b. i- ?) K3 ~- ^1 _
) _* D, P2 |# v1 e1 d
4 m8 ?0 p2 K. w9 O# p- //这里仅仅考虑Z轴方向1 N8 P- _0 w* W% _- c) \
- void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3]): J# ?, m( X5 l2 i# w: [; K
- {
0 m* L, I" D3 t- V) u- o - double dotResult;
& v1 t- F0 I2 V; t1 o- X - double longDistance;
; y$ i+ G! I9 u- J1 g/ P - double zDir[3] = { 0.0,0.0,1.0 };
; e* @5 f6 @1 o7 i0 y5 o5 z- r. u - //直线距离
5 T+ S& D5 B. V# W5 e% ^ - double deltaProjectDistance = fabs(maxZValue - basePoint[2]);" t r& ~+ }- D1 C! r3 p
, e7 k& Z3 @4 d+ _- Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);
1 V4 S8 V4 w- ^9 F( D/ U' L
! s& H: k% ^6 d3 Y# V0 o3 k- if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回
# B) ~% {) Z r0 `5 A9 _ - {
5 P! }2 \$ f E1 C5 i - UF_VEC3_copy(basePoint, newOriginalPoint); u% ?# h+ O3 Q, y# l+ z O
- return;) h* |& Z9 W- I4 s4 M) h
- }
, E0 k9 Z% u8 O m: r0 b - 8 G5 q7 e" f" G! l. @4 _9 S1 P& P
- //计算夹角,通过单位矢量) K0 {$ d5 Z' n7 A
- //faceDir 可能反向 * X: y7 m+ Z2 w5 r4 n9 r7 z
- UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);2 X4 y& t. b! Q) e$ i& U
- // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle) 6 |$ S5 Z! B& c! h1 U+ P$ }' {
- double cosAngle = fabs(dotResult);3 S) e; X* P) v. [2 k9 `% ~
-
0 B$ G: j7 F# y) [& _ - //斜边距离0 N( R- O7 |# m" U2 X& h
- if (EQ_is_zero(cosAngle, MINTOL)); C0 t, a/ c$ _# B* g5 c4 G. ^
- {5 H/ e- i, E7 v1 ` b" i) |
- longDistance = deltaProjectDistance;
0 h% r$ I9 |4 c4 N3 J - }0 x% o# ~/ [' n( s4 J7 i# Y7 x
- else
$ R3 m3 K! z8 K y3 C - {8 j8 O! U- e; k# u" T4 M4 \
- longDistance = deltaProjectDistance / cosAngle;, |* U8 T1 D; Q2 j/ h7 S8 d& K' b2 P# j' s
- }
1 S5 X& A% [; D2 |' }$ F# L1 g - 5 G5 a; h7 O; V9 u) Y/ n) `
- //这里可能出现方向相反,我们需要进行一次判定3 ^; m: p: F1 h
- ; l; e0 v. N/ Y2 x" a2 m) t& w
- UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);
; p4 M4 i) r/ P3 M' ] - 8 T# u6 @5 g# C) _0 }1 |
- Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);( V7 t0 H8 n+ O+ q" f! b8 ^
- 1 |' S2 P- ^+ b% M: [
- if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))3 w/ a1 O- X0 t* x8 Q- }: Q" \8 M
- {
1 r5 W7 Y% M- A7 Y( l - UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);& L2 I7 q! D+ h! V/ A% u# x! x* S
- }3 X; o( C% l7 m: A; U
" n1 ` |0 _8 B4 c' u* m2 T; A
5 ~7 I2 t0 d4 _; ?4 J6 G6 f5 ^: I- Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);/ G2 _' ~3 L6 G0 F
- }
复制代码
# S! V9 y7 c" m4 k! [ ~
) E3 h9 F w+ U$ r* [1 I |
|