|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
( S& |! N. @, B- P+ B
3 w" y( d [; ^, \3 r2 {/ d
( c* K! b9 {" ^/ T' v【二次开发源码】一种基于点投影,获取投影原始点的方法4 h" [" a9 A3 z- f
/ h' X m( h7 m" j p9 h
一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角
) ?0 g' m! q$ O+ M5 L$ z) a然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量! o4 h' l+ E8 e
0 K* y8 s" `* l5 ^" m# z" X6 {
- % v8 J" w/ I$ d: b& P' ^# j+ I8 a
- //这里仅仅考虑Z轴方向4 J% C' q& }; S. D, C9 o
- void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3])5 ^4 _; h( c3 X& M
- {
; N* L6 g3 n$ j4 d$ F/ u - double dotResult;4 o1 D% I9 t' ^" ~
- double longDistance;
, ]) |! B7 N- ^$ r3 x - double zDir[3] = { 0.0,0.0,1.0 };! l( G- \0 d6 a* f; q
- //直线距离3 p, F8 |2 Q, e8 { D0 ~3 U
- double deltaProjectDistance = fabs(maxZValue - basePoint[2]);1 K+ I1 ]. `* W _
( u# w$ i! ^6 h5 u- {- Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);/ w* i, ?. e5 t: C
Z: L7 G8 L' M( ?6 ]1 x6 \( H- if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回4 s7 H2 L$ m S0 r" D
- {
, `4 Q& s5 S+ `# I* N. I - UF_VEC3_copy(basePoint, newOriginalPoint);
3 q8 ^/ C! v7 Z& I: v! | - return;8 n6 C/ J& d( z- a& [
- }
/ J3 l: x+ n8 U2 B
* W) h# n9 m) q3 Y, W- //计算夹角,通过单位矢量
$ [, m: }. x7 G" N3 ?/ X - //faceDir 可能反向
9 ], [7 ^* l4 {9 w6 \ - UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);
4 V3 |6 y) m. z9 x& [* d - // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle)
: o9 Y, O, J$ ?/ o, _% M - double cosAngle = fabs(dotResult);
4 J1 k3 m* R' Q8 q; { F- g3 W. l, ? - ( ^% f. Q1 B) D8 b" J- j
- //斜边距离
1 i) M$ P0 I; m- {. G1 s" j# u5 n - if (EQ_is_zero(cosAngle, MINTOL))
( Z! @5 S# _: k& e7 f - {$ I% J0 _4 `! ~8 Z$ D" ?) M/ }
- longDistance = deltaProjectDistance;0 n) I7 t/ k* p
- }5 t0 h/ T# h& P
- else' T+ ^$ D/ ^/ I
- {
- E- K( Q8 u6 c- f( f$ d - longDistance = deltaProjectDistance / cosAngle;
: i5 g* l9 x4 u" q) f/ ` - }
+ {% A! {# M" O - $ n+ _% S7 e4 k6 Z: `7 u
- //这里可能出现方向相反,我们需要进行一次判定+ U0 A" N+ F) B+ v4 c
- . B$ ~* H0 t' e) x- G
- UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);: p4 u1 w0 z2 O6 e3 F$ u
, d+ n- M# e; \' d3 x. E% i- Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);
6 L* {* t/ B4 F: T9 ^; x - 0 p' D- N% W% M0 y! {5 \
- if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))
G- Y0 B& j, z$ O% { - {5 Z3 @ f( H; D0 `$ o
- UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);
" z" Y& V# S& q - }8 ~ A. h5 e. g3 u7 z s) w# z, N
& ^2 v0 v, B6 O. \5 [9 s j- 0 A9 }0 x0 _0 b% F# U
- Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);
$ M% ]; u" X4 Z* O" T - }
复制代码 - L# n5 i3 i- _
& v/ Q* o) ]& v |
|