|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
; U0 X* g" P! s: g* N1 B" |4 ^- K: v- f' ?/ x
4 C3 o' k) M0 z
【二次开发源码】一种基于点投影,获取投影原始点的方法
6 }* B( ?1 v) T/ N
- W& V5 g$ [1 u" o! E' |3 D一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角
I! N0 g' A) u$ s' B R, F然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量
! f1 ] s! @2 ^0 ^, L# O4 n7 g! H0 s0 J/ }- b, e; {/ [
8 D# N) R Y1 c! F7 @( a& y- //这里仅仅考虑Z轴方向
' z$ u1 N5 g9 r: D% C4 O - void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3])
7 {4 Q8 c5 X, C e2 F$ o' T - {
4 E2 I* E' X8 M- { - double dotResult;; E0 a. x5 V. q4 ?% ~9 v' _
- double longDistance;. g# c/ H: ~7 K/ |" M
- double zDir[3] = { 0.0,0.0,1.0 };# j4 j3 j" y. k I5 i) g6 A
- //直线距离1 H' T# ?" p- Q" l" D0 |
- double deltaProjectDistance = fabs(maxZValue - basePoint[2]);" e6 a( p& G# M' ~
3 H+ l* v9 }% t* @& ~4 T- Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);
/ a) V R( Z6 B# Q6 t- E) f
7 ?, C% W @. ^7 L- if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回* B, h* r& ?9 O3 }
- { R- ^" Q/ e T. a9 J( y6 s1 N
- UF_VEC3_copy(basePoint, newOriginalPoint);
" I U3 |0 y3 t" \+ d$ n6 Q9 P - return;" G# c. ~- _- t2 ^. b# e+ X/ J
- }& q' T+ e- _8 h" i& w# s
- $ K) Z3 `% h" L7 D$ W0 v
- //计算夹角,通过单位矢量
1 `. L7 |: H7 \$ m4 i3 ^; e$ f - //faceDir 可能反向
$ ]. c+ r8 o( u$ A5 V( ~ - UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);
3 |# G0 a: C! i" K/ b - // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle)
3 _7 }1 G) I. w - double cosAngle = fabs(dotResult);
+ q! S: ], s" t) z# W! G: m6 I - ) [' H* [6 K/ U4 _& S5 o& I, @ I
- //斜边距离+ e) y4 ^% P; u) }, h
- if (EQ_is_zero(cosAngle, MINTOL))7 _1 a; C9 G; u, ]7 E; H$ `
- {
" Z0 P6 |/ S8 j7 e. U* K - longDistance = deltaProjectDistance;
0 _5 v" x4 [, b4 r - }
- V. U6 o* j; f t3 [9 |$ o - else( S9 U& m$ S/ ?
- {
+ o! B. a! a1 ^4 G+ h4 ] - longDistance = deltaProjectDistance / cosAngle;
, P) m& u$ q& p/ i& J/ ~ - }
2 U3 H. P* C6 }. G - * o( h3 I7 H0 c% |& y) A- g, y
- //这里可能出现方向相反,我们需要进行一次判定
0 U6 |6 L0 p. j% }8 u
$ a! l) E- q3 _ R; Q3 u- UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);; `# |, c. X3 c' A9 T0 R
: ]# V/ \, V. P' y- Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);
q% y* i0 f0 L$ V; N4 t- ~
' R" m% h" g/ F( f# P0 M$ A0 g0 N+ m- if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))+ `2 M/ k$ M" n" U
- {
7 w) E( p3 h% c V+ H - UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);
3 U- x5 M1 d4 ?8 G8 U7 Z( o - }
9 G' @4 [1 w5 V# R7 p
+ c. m2 Z( _1 W7 S: w* ~
6 Z7 z& E: V: C" D: [- Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);
4 t% \7 M' F o1 r7 r( p4 w8 l - }
复制代码 3 c! |$ ^; f! ]. [
3 o: k, w. {! a0 E |
|