|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
# z G+ [! ]1 n& F3 I/ I2 C2 f
U/ _ |& A7 t3 C* s, \( ^8 ~+ z, K/ e- I: q/ P+ d0 F9 ?
【二次开发源码】一种基于点投影,获取投影原始点的方法
4 p# o, U/ c" g& R6 }3 o; Y. h- e6 @4 ?" U3 I4 n2 C q
一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角+ n( B. V( ?# A- L7 g
然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量 e# t: Z- k+ I3 [" Q
$ `# ]+ M* B0 `4 w1 R' Q9 b
$ ` L" Q% p# O0 `- //这里仅仅考虑Z轴方向
P3 F7 y, E) J, P( J- X - void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3])4 _- C5 y9 P! O% q
- {
! y, ?# n9 v8 o2 I - double dotResult;
$ V) F ^- F9 j$ t! j; Q- A - double longDistance;
" O8 @' r% @4 O8 R9 [. F - double zDir[3] = { 0.0,0.0,1.0 };
3 d' C7 \9 h" G# X. L- B- ] q - //直线距离1 E0 r0 a$ n% Q5 ?- N8 B8 }
- double deltaProjectDistance = fabs(maxZValue - basePoint[2]);
+ I1 J G" r# {# ?" k z
0 \, [( D; _( h& Q6 H' ]1 k- Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);
7 F" L; W7 g9 b6 j& |, X% P
4 F3 ?4 f6 }! C- if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回3 A3 a) o( @1 Q2 P3 v
- {
5 J* Y- y$ a# M3 z, ~/ W+ a0 o - UF_VEC3_copy(basePoint, newOriginalPoint);
: N$ r; X* E+ y% j5 ? - return;
5 r( k5 U, Y9 t+ v% L - }5 Q2 N$ Z$ {: l- O1 O! I: ]5 [
0 s& t; u1 O6 ` b. p \( K- //计算夹角,通过单位矢量
# N! Q2 ~ }8 B# u, f: B6 _ - //faceDir 可能反向 # L i) \/ k# ?: K* [" B, w! q
- UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);2 b3 t: r- l4 J" q4 P
- // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle)
3 K! n8 @1 \) I7 N K: p - double cosAngle = fabs(dotResult);
4 [' I. X2 O( @9 ~4 N - 3 W1 {3 J/ g* R% C/ t
- //斜边距离
8 }5 E# Y Z) p! T - if (EQ_is_zero(cosAngle, MINTOL))
8 A$ C. k. M9 T a: l# P4 \2 ]! u: t) ` - {3 m! d2 C$ C- }3 P
- longDistance = deltaProjectDistance;1 A+ l8 D, n4 [* e4 s4 g
- }
5 w; I3 P/ m7 ]& C$ r - else2 a- ^# ?) j% `) i
- {
& \, L# @( A* y. Z6 k& J3 V, A - longDistance = deltaProjectDistance / cosAngle;9 p+ x% n1 h& r6 }2 a& |
- }
A5 G$ b5 B, `6 p8 I2 E. G1 I/ s$ U, E -
, m7 P* g. u" `, _& l4 X/ w { - //这里可能出现方向相反,我们需要进行一次判定# t* t2 R$ Z0 l; W& ^7 f
; ~+ t7 _5 {7 P* j! h Z- UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);: S: T- s* Z7 F/ T
- . y8 [( ^5 G) N) e b
- Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);
/ S5 X2 ], k) V% s
: q5 G8 F ?* y3 P9 D- if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))
" ~1 J ]0 i) ^; Z - {
% u; t: o; h6 c - UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);
$ I1 |+ u- G) J& M; a+ Y6 [/ w - }
; s% V4 L+ e+ A6 H Y* Z - 5 Z$ J$ D2 E9 n0 E
- : _, A+ |4 j7 ^$ Y1 ]/ Y
- Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);
a& u- Q) `+ V0 @: q - }
复制代码 # z% P# J+ o& w$ Z0 P% D4 K
6 G; `, H- X0 X/ f3 r7 v
|
|