|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
; c0 E! O. \% ?9 O% H. e# R E D
: Y: d. m8 X! V
9 N% b9 w; _' z, T【二次开发源码】一种基于点投影,获取投影原始点的方法
1 }" q& N# Y+ u( f! C. a! z9 E) M; L& V% G0 `8 R
一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角# l0 E# q4 K, }: k4 k) h' Q
然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量
, f& l$ [% g6 `- Q4 X! W2 x
4 `. l/ C+ O0 b8 i' C m k- ) r [0 ]7 v# P$ u+ n1 p$ D
- //这里仅仅考虑Z轴方向
+ g: R5 b/ A+ W: p; Z - void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3]) k2 ]$ }# b/ q* r0 r0 z) Z
- {
{; s7 X) Y- K - double dotResult;
2 X* e ?/ N$ v. ?4 g/ p - double longDistance;
+ O8 {: m, j) m1 J. l - double zDir[3] = { 0.0,0.0,1.0 };
0 E' ?. F; @% T - //直线距离
. n! Q1 z' h' F& B - double deltaProjectDistance = fabs(maxZValue - basePoint[2]);
6 U {2 ?& d3 b' u: V - , k% \! {5 u7 g5 \: T% D) O
- Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);8 K1 C' f/ w4 j+ K
- . D @( p9 B: l' }+ o8 X
- if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回
2 ~" K: f; B% S. X7 U/ \ - {$ P' Q+ y8 A9 ^: X
- UF_VEC3_copy(basePoint, newOriginalPoint);8 ]/ l7 B) z) m, O) S
- return;
% Q0 M3 S! M P p; J - }
* G! H6 R/ t9 |% Q
6 t* b4 S7 h% ~4 N( E+ J( R- //计算夹角,通过单位矢量
# ]* T8 t9 {. d Y) a$ q4 ? - //faceDir 可能反向
|; X% U" U- N5 l+ y - UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);- S; e, T1 d( K# ^; g7 w& a5 ^
- // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle) 9 A3 y, t+ a8 S
- double cosAngle = fabs(dotResult);
- o* \+ ?* O; q$ }! h+ T& c& | -
' ]+ H3 Q6 _& m7 D& ?5 n - //斜边距离$ a3 L, E/ } P9 E" m8 ^
- if (EQ_is_zero(cosAngle, MINTOL))' P# K1 F" @0 h0 C$ ]) u7 c
- {1 J. @/ B" r8 C' d% C2 o
- longDistance = deltaProjectDistance; S* J# R q7 D# b: p$ Z
- }
C J1 [7 O: q - else
3 `$ d0 U( T2 V z. s9 f8 D! I - {5 ` B# c) g) K
- longDistance = deltaProjectDistance / cosAngle;0 ]( m5 `8 w( V6 o
- }2 [" u1 R- Q; o% E( ~ X+ f
- 9 i- ~+ |/ a- F4 R
- //这里可能出现方向相反,我们需要进行一次判定& w2 q. w# a; E
- 6 C3 d1 K7 T# u5 `4 `: R8 C8 W
- UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);! L+ v* T" v$ l; G
' F1 ?$ s# n! M z" G- Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);
; T/ a7 I# D! s; n# [
' k% {, R. J5 _ k- if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))* @% z% R9 p( l6 G! |0 O0 o8 N4 x5 n
- {
# } | v2 C+ N4 K - UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);8 J! l: n& I# `! i/ y! j- r2 U+ o+ Z- z
- }
6 m' _$ ~. e2 k- A( H1 I z, l - 9 x: O X7 d6 { f" D+ K+ c
- % f' o$ Z8 w2 l' ]: `) R* j, c5 n' \3 P
- Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);
' h! y- w6 L M - }
复制代码 ) o+ V3 l/ y: b: f9 k
7 O. |* a! z1 @% K
|
|