|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
, ]* i$ h! R) p% o5 l9 P
- D3 v: Q. Y7 \+ E/ J% [0 |
4 L- l1 O( {+ M
【二次开发源码】一种基于点投影,获取投影原始点的方法0 q. m# _/ r% _0 P0 l& z6 d% h6 V
`" v( N6 I$ {3 Z0 N7 k& D% r
一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角
) y: f$ D0 ~# y, ~5 K然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量
8 I- G8 `0 I, m& P2 a1 Y; d$ O: N
0 q" W# H2 p; B# D7 Q- F; M
9 v6 ]+ d1 D( f* w+ N: Z- //这里仅仅考虑Z轴方向
( {( w4 R* N% k0 z. V# c - void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3])( J6 Q" u( m+ i; D: s" t7 Y& u1 Z1 y
- { s5 ]* E# _# X1 u4 l
- double dotResult;
0 a0 ]+ s6 P# O- V9 I! z1 M8 q - double longDistance;/ g( Z8 k' I9 p2 n+ K
- double zDir[3] = { 0.0,0.0,1.0 };
! C. y. P s- L/ x l) }% T, _ - //直线距离5 u3 `# Y1 q1 i. f" T% B( T: A* Q
- double deltaProjectDistance = fabs(maxZValue - basePoint[2]);8 W& N+ u) [4 t s# ^4 k+ W
- $ j4 \$ B8 @1 D0 L4 ^. P
- Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue); W# l. g* x8 ]3 r) P
3 W1 ], l% ~0 P l- if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回* Z/ w2 T4 C0 n. c
- {' ]* `( |- |" S5 \. I
- UF_VEC3_copy(basePoint, newOriginalPoint);
0 i6 g5 W# t) z - return;5 S0 W' a. \9 v" N% p7 U6 L
- }' T+ N9 v. V. }5 P& z. P. N9 u2 w
- 9 ?8 g1 |! n* G) Y, t$ H" U
- //计算夹角,通过单位矢量0 d9 f8 X" a- ^, U+ ]
- //faceDir 可能反向
% W3 @; \% |* V - UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);
: c$ S* m0 P8 N7 E* Z) \ - // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle)
: R! H, @8 h0 n/ y6 r2 j% v! D! }' v1 c - double cosAngle = fabs(dotResult);
+ @6 a: P' `% E, M - . n& q$ k! f# \
- //斜边距离
/ A. k8 L& B2 n1 M' i% w - if (EQ_is_zero(cosAngle, MINTOL)): u+ K: I; R5 K1 R/ g* J* H1 H
- {
+ M6 R2 [8 S9 ]$ l0 F* H- B - longDistance = deltaProjectDistance;
% R5 }+ l6 E1 S2 A7 R - }
- j; F: |6 ?# \% l& g1 d# r2 g - else
; t/ e3 t) H( Y - {
/ n2 v4 W3 \2 ]) S) V9 o - longDistance = deltaProjectDistance / cosAngle;
1 }' }- ~8 B- `7 T6 M - }, _, _/ x8 N3 P! U6 M
- # C0 m) B: v- M/ z$ x; ]; o
- //这里可能出现方向相反,我们需要进行一次判定
4 Q/ y* E& n# ~/ F/ g - " [! x" x1 }8 f, j2 K
- UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);
. l4 W6 i( q! B - # [ E$ J4 {, F+ Z) ~
- Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);. M* v Z: C# A* s/ J, p
- 2 Z: T6 \' V" O c8 O8 j/ g6 r" g( e# t
- if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL)), ]) f3 y& U0 d/ O4 g$ s' H2 F
- {+ d% ~& A, _2 o- D* \+ {
- UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);
$ E$ R. O o) n. f6 [! s' ^- \ - }
4 J$ `% y5 l$ Z - ( W4 E3 V- m& t# @) v6 {% v1 `
- , R* K' ?) ?4 h3 y7 v3 V% l5 N0 O5 w+ i
- Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);' H1 E. g5 X$ S/ L. i3 w
- }
复制代码 ' {; _5 u% u! ^# ?- C$ i" R
9 @" i, D3 C$ x9 R) A
|
|