|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
7 {$ W, U- d" x- L# x0 F1 a) M8 j& _/ \" \: T/ K3 `
: A4 z( H$ J- |: J; c9 P! v
【二次开发源码】一种基于点投影,获取投影原始点的方法6 G; u: q( W5 p0 p
: n/ K4 ]3 z3 L+ C- `1 P( E+ E* I0 Z
一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角
: } U6 j# l" N' P然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量7 e3 K/ q+ o/ e+ W. L
2 z4 d- {+ h5 z2 l' M5 e
* z4 a/ L5 [7 ]) Z6 B1 B- //这里仅仅考虑Z轴方向
- V' y/ x/ s, |* \) c - void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3])" E3 q0 ?9 S- _ c
- {/ o) ? M* N1 S, {
- double dotResult;2 J$ l- [4 W% w; A/ t
- double longDistance;3 t9 x: Q* G6 z5 d9 ?
- double zDir[3] = { 0.0,0.0,1.0 };# Q) i6 K' M0 }& u2 N5 P
- //直线距离
2 \& }0 f' d X - double deltaProjectDistance = fabs(maxZValue - basePoint[2]);% j, m4 k& X4 Z% a$ e$ ?. S
! u, r: M3 {+ s: {0 d' Q- Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);
c. X; w' }, W* X5 o
8 E- S, D4 o& P7 r9 ]- if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回( I5 Y3 j9 H* q, u
- {
# H* J. m3 S' m1 K$ [' u - UF_VEC3_copy(basePoint, newOriginalPoint);) s1 x5 i: y) ~- }$ \% ]7 ^4 p' }
- return;
P/ i0 U, q' ?; N. ~4 t - }& M$ Z7 a: m5 C
5 m1 j9 K" N+ N8 }$ D T6 z- //计算夹角,通过单位矢量
8 c U& S0 ~' K' Q8 ^ - //faceDir 可能反向
: U. f" }; u* X: L! b - UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);/ \9 c3 {% E0 k& X$ y3 Z
- // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle) 9 d3 N. A9 x D3 u
- double cosAngle = fabs(dotResult);$ L0 B. K6 J" e1 t( X5 Y- D; G2 U
- $ m( W. h( c& D
- //斜边距离
3 H4 V( E$ M% N) n; w4 H C3 n1 `# O - if (EQ_is_zero(cosAngle, MINTOL))$ C9 T/ ]9 y- g' ?- Q1 f1 U
- {% X E1 U% f8 r# i \7 O
- longDistance = deltaProjectDistance;
1 J5 |3 ~# g) i' H" @, u- z - } Y. c E1 n( a0 I% I7 t
- else- U, t8 X @2 m! @; }! ]) T
- {
( O( h }* q" C" x) X5 h7 ]$ t1 V* \ - longDistance = deltaProjectDistance / cosAngle;
0 k& _3 \' e5 L1 F: Z6 E3 y8 h - }) ~2 h0 F1 X* R" m( `: u {+ I
- 8 {' `7 I F% p# u0 u2 Z
- //这里可能出现方向相反,我们需要进行一次判定8 o& G5 Z- `% f/ ^" T# T
( {( u& P* ~- Z- UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);
9 N" G9 i6 g( K- }
/ X! D, U k F- Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);
. c7 q5 W; ]9 ]6 }1 ?' y" K/ v
4 C2 [7 W5 |6 ~$ X- y) o. y- if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))
G# n$ U2 Y; g - {$ `) s; O0 L/ G) S- r1 {3 T, U% a$ _
- UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);
% T, _4 C+ n g8 O" l- U - }3 M# z; o+ E2 w ^% ]7 K
- . R) O+ m3 g& n. D
- $ J# N* E7 ^' P
- Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);
9 o$ Q2 w% ?& s A! V3 w - }
复制代码 ! |# t. x+ A7 I9 \! n7 z% G
# Q" r8 H1 [3 |2 ` b! r7 C: A) Z |
|