|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
. h9 J8 W6 c8 ~8 U9 ?
! @0 e) ?! N& x! W# Y! |0 k: V, [' b6 J' k- m4 S6 K
【二次开发源码】一种基于点投影,获取投影原始点的方法# X# b% s1 ^% l3 `8 R
3 e& h* @7 l8 ]3 q- V. k1 c. y6 n% e- u一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角
! }8 r9 y# L9 \3 Y/ U# ^# \- O" Q, D然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量
1 i% J% @! Z4 X
& B m4 f+ W+ _, f- l- . Z1 Z7 j: _) g' A/ F1 b; m
- //这里仅仅考虑Z轴方向
" _0 [/ U* t7 D( ?3 X# v/ e - void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3])) r4 [( z. L* t; ]9 H2 L
- {9 K* R0 q8 ?, R- w" v% N! I, }
- double dotResult;5 \+ l$ ]; G# Y% O5 R
- double longDistance;$ D6 s5 s) b( ]; i/ j' d6 b
- double zDir[3] = { 0.0,0.0,1.0 };. g+ M( E) M" \6 R- p8 x
- //直线距离( L- y. M4 J1 Y/ \3 `! d
- double deltaProjectDistance = fabs(maxZValue - basePoint[2]);" Y7 O0 C* r% b3 Y2 s$ J( U3 W8 q
- $ Q! i4 b) S5 q8 d, }
- Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);$ L& r" a7 u. A- _9 \9 ?! E5 S
- & D% i, L* p2 m/ ~( W
- if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回7 X# n7 o: F$ {4 {1 Q2 v$ a% t
- {
# w. H# u d5 Y7 |8 U; H7 t: x - UF_VEC3_copy(basePoint, newOriginalPoint);* C" b% h7 a4 ?" y) \
- return;& a+ l+ S4 o, K' k- s9 _
- }* l2 B% A* _: u
7 s, ^5 y' i& }- //计算夹角,通过单位矢量8 e' P- K0 \1 _4 h" F- v
- //faceDir 可能反向
6 b0 e( }/ l2 e3 M! d - UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);
1 C1 o+ t/ Z2 O4 v O- w6 z - // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle) q! o+ D4 N! M/ E3 o
- double cosAngle = fabs(dotResult);
9 `7 k+ E. t3 x x -
8 j! E2 ^ x( g0 `( M - //斜边距离
5 V: ~( J" M" e9 E - if (EQ_is_zero(cosAngle, MINTOL))
; } J8 Z; s$ q8 g6 ] - {
' {1 u2 l% C) g5 {1 O0 {6 { C7 } - longDistance = deltaProjectDistance;* J I5 \( ^9 L" J
- }, |4 F8 W! o) {
- else
) G8 \% l4 y# Y5 J& G" M5 M1 k - {
Z* _" f! j1 ^6 R/ E, f - longDistance = deltaProjectDistance / cosAngle;
: u h+ S" a6 f# s: j7 W" o0 O - }9 L8 R( E2 w# _
-
! L! k: L K$ a$ d& v8 q' u Y - //这里可能出现方向相反,我们需要进行一次判定$ E8 T4 _% E8 `. A
. b( r0 Z6 E+ J- g8 v; o- UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);
* R6 S; U4 l H6 R$ W+ U9 y/ z- z - 8 s+ u$ N3 S# X4 |+ |( u( a9 d
- Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);; v- n; l5 W+ z5 K( y$ ^4 G
- - B [) y. `) r/ P- N3 o+ w& D
- if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))
/ `8 g. ]6 w* `( G6 h5 H% K( D- X* D. F# R - {
A h$ \% P5 `! u. _% u - UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);
; \* @ w1 K9 {9 i# J - }
& ]' P; }; G- D2 d9 x7 S
: ]1 ?: q% i) R# b- c
8 u: i+ O% @6 n/ L* H- Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);2 Y _/ _' R0 f: M* D
- }
复制代码
5 W# R9 f4 R6 i! c8 M' h
. r) s7 E. m8 f9 V+ M% b! F |
|