|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
8 F( r) _! P/ n+ t8 |3 z w/ Z+ s$ v3 `0 ^; A
- p8 K6 z4 o/ l4 k【二次开发源码】一种基于点投影,获取投影原始点的方法
3 x6 m2 y1 d' w+ D/ t. |0 Y3 l
# ^5 K5 l/ ]8 |一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角
) P6 S4 \" M5 Q4 b然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量
2 G' S& u. R2 E" H) `& V4 x- q ?* V( m- V7 F/ r: G
- ; A6 o i% O8 f* i/ J
- //这里仅仅考虑Z轴方向% h- R0 W+ U+ a! w( K/ Q
- void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3])
0 N% L0 k" p. Y0 @) Y j% K - {/ f7 F8 R9 r o; E+ A4 g L5 B3 N4 y
- double dotResult;
5 g* P! U* I% Z$ S. M4 c - double longDistance;) h, _' W; a' P2 S- T# X
- double zDir[3] = { 0.0,0.0,1.0 };
, U3 H0 ^" c0 T2 U - //直线距离
* _0 v- `' j6 E9 C( o - double deltaProjectDistance = fabs(maxZValue - basePoint[2]);5 }9 y4 u3 J( ~
- ) |0 u( X( j! s
- Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);
; F, _# p8 A; R" M- ?; I
9 d: {( v& L- H, {% E" j5 ?) Y- if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回9 w6 Q: B; l; I: c
- {
& e2 m' c& {$ F - UF_VEC3_copy(basePoint, newOriginalPoint);
& v3 W5 ~( l/ v& \, ^' f- P+ ^- w - return;
1 M v2 V* F5 q8 p2 |; |2 |2 ] - }
% d6 I# L4 p3 l8 ~5 n, b - ^9 G- R# Q7 z _# O* {
- //计算夹角,通过单位矢量+ l J! S6 P+ ~& r4 a p7 K/ g
- //faceDir 可能反向
. P# g5 q" b4 p9 q0 u - UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult); {5 Z$ ~. y6 x4 d ~
- // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle)
* q" S8 H$ s l; O u7 A' T - double cosAngle = fabs(dotResult);& ~% J" }, ?* B# x% G* V4 H+ s
-
( w. B% T2 v& c* M - //斜边距离6 l) }0 F+ o1 d& |4 \0 G
- if (EQ_is_zero(cosAngle, MINTOL))) g5 Z5 h% M+ j) J' R0 ~2 i
- {/ f% Z8 }" V6 F1 G& [ z3 P: b( y
- longDistance = deltaProjectDistance;4 M8 h$ r( l, h# X
- }
# ?0 a- {- w3 N* x - else
# B6 y* c% f2 g/ R# Q8 | - {4 I7 Y' C9 A0 S6 C5 t
- longDistance = deltaProjectDistance / cosAngle;( N3 B& r: B7 l+ l" C3 C! r! i8 j$ V
- }
) W" |0 `/ l& q! N, g -
+ [9 ~4 N" G9 ^3 n - //这里可能出现方向相反,我们需要进行一次判定/ _) W" l0 O$ }; ^' r6 e
- & L/ d7 x1 Y6 i" _, Z6 E" d" Y
- UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);
3 Y5 u. W7 t7 F3 J3 @
. h9 ~' g9 Z; b, a+ ^- Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);% X: A) H X) ?) }9 n
9 o( |* A, f" C$ t J. U- A- if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))
3 ^' ]2 g( l9 i2 R8 {& |! l/ V - {/ j. a# n; b' V5 B ]. z$ Y
- UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);
" N4 L6 R7 ?1 _; q M8 S - }
$ H% m! F( f- F! `9 d/ W - 2 ~( d: j# m, f2 b1 ?
4 K7 Q6 r7 n& B4 O0 G: ]- Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);
, F# U" x3 P9 F s - }
复制代码 * Z! @+ h- {: {' F
d. J3 |. _* `' v; @ |
|