|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
! v, V+ Q3 Y5 p- m# w$ g1 S
+ P% E) w# }" J" g1 v1 a
0 L- M- Y, E- Z$ h【二次开发源码】一种基于点投影,获取投影原始点的方法. B& l6 X, z! i7 m2 K
" H+ |! ?7 a; H- `: W
一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角
' S5 d( W% x- k+ v: _$ Q然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量# x6 w8 w/ C2 x/ x }, U
, v. s; P+ q' s$ m; A. H+ Y6 k- ' g, }# d! E, C5 A4 L
- //这里仅仅考虑Z轴方向6 B- i# W* w; x. o. D! b
- void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3])
|( \. Y7 \" ~ - {
2 ]1 B5 z: f" d& f( \! H O/ U3 l: V - double dotResult;
; B; x/ w% C: q' n h6 J) J8 F1 p - double longDistance;' A( o6 K- `% u- N; t0 g
- double zDir[3] = { 0.0,0.0,1.0 };
- Z5 h0 K0 J1 f - //直线距离
2 {% ]& W; F3 Z" P - double deltaProjectDistance = fabs(maxZValue - basePoint[2]);7 @3 B7 A- H9 v K% U( H' r
& O0 w/ E& y2 ^: j- d1 E- Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);
- D+ ~6 B- u) F( v
" o: c& K* f& u' X- if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回, L! O0 V% f2 B! J7 p7 y
- {
! a( d8 u- o4 p0 A+ |/ S* Q6 x( c - UF_VEC3_copy(basePoint, newOriginalPoint);
; ?7 L% k; c2 X/ ~! @ - return;
; ^& r* M3 r# p* O4 D$ q+ Z - }7 `3 b% ?, x* B( D: q- P" q
- * j7 p, [) J. X
- //计算夹角,通过单位矢量
+ }" N3 E0 n! o% x" p! A: R - //faceDir 可能反向 . F% w2 @) i' i9 O* v& V
- UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);& E/ ~ L3 t/ x/ X& o9 R7 b, B
- // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle)
5 E) M5 s9 k$ N. T - double cosAngle = fabs(dotResult);+ g) H' \, n# R- C3 b# f4 |
-
7 D* p; n( [6 q - //斜边距离& t8 v' y; t& z7 V5 O* u
- if (EQ_is_zero(cosAngle, MINTOL))
x2 |; T; ]2 E6 r! r. j - {
1 l6 h' ]' I" |5 t* Q - longDistance = deltaProjectDistance;/ x* ^- B. u8 z2 B
- }
" y9 [" y6 v8 s7 `* E - else2 g! f/ i+ ~7 f5 A
- {5 y$ _2 v! r! j, G0 t
- longDistance = deltaProjectDistance / cosAngle;
; o5 W% {) b; G7 v - }6 ^" f. {4 h' C9 `
- 0 d6 O3 i' m$ w/ H
- //这里可能出现方向相反,我们需要进行一次判定
# |* D; [( _) B# u
: b* ^% B, R0 O1 T3 G- UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);
. p/ N- B7 U8 s; f; e$ B6 t f# k - * I5 H U# b" G( m# s7 X% H2 Z% k
- Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);
+ f C- B1 x# n! ?. r2 K5 l: ]
) |1 j' c: A( }8 L' x: u' X- if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL)): c7 I' z5 f, e8 C& T9 Q
- {
6 y; g5 R2 W3 D7 [( y7 M" Z - UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);+ O8 b$ G6 L" S( @/ [% _
- }
3 ~' X6 E- \; ^$ B1 ^/ t
( K; h; t H) m% i+ @
; ~& Y7 P7 O7 b# \5 A+ f- Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);* x+ O; ?2 L1 }+ ?# o: b
- }
复制代码 ' J" p* F" R' U, |4 X. N
2 L$ I! c# H/ m9 K7 Q
|
|