|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
7 F- E/ h& D& z' f4 t) k- L* ], J# h9 g! x$ U
+ t. Z% m" ?. e+ o* Q【二次开发源码】一种基于点投影,获取投影原始点的方法
& c' r7 J! T0 t3 W7 `
" S5 o4 e0 \; l1 Y- v- p, j一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角! m$ l- o U, n' e( E3 D M
然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量5 g; A" z2 o x0 S P" J
5 [) l' ^* H" j- h# ?0 B0 F% Y
- 8 Z3 D' `& ?& v2 q4 p- c" r
- //这里仅仅考虑Z轴方向/ J {" Y* f- B- u% {
- void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3])
& P6 z, G2 Q! g1 b4 v - {
2 }2 i2 X% F& | - double dotResult;, ?9 K, ~3 E+ P% N( |. _' g
- double longDistance;
, d) r! n7 ^; j; B% t - double zDir[3] = { 0.0,0.0,1.0 };5 w5 L4 \0 n2 U& R6 T
- //直线距离0 w2 K! T" L x& n! e
- double deltaProjectDistance = fabs(maxZValue - basePoint[2]);
( w. @9 _7 q7 }- C. b - - V$ X1 P9 X& Z+ G
- Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);) a" e4 J) E7 p' d
- - P; Y/ x* {3 o5 U4 r; c
- if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回
* I! d. H/ k$ T/ X) Z - {) q8 f$ r4 X1 Q; J! Y
- UF_VEC3_copy(basePoint, newOriginalPoint);
! ~0 x7 t( \" Z* j- A' S$ O `6 | - return;/ m% Y: @: u. X4 o
- }
0 D) u3 X5 V# a" d: ?7 r4 V
9 \5 [$ x( Y% ` T! w- //计算夹角,通过单位矢量* a; @; i$ V; m: Q8 w9 M
- //faceDir 可能反向
& b) N% }" H2 T( y/ W# \) B- F6 F - UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);- w6 T) E4 g. u# y' t! r
- // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle)
d9 B" e) ]4 D4 c - double cosAngle = fabs(dotResult);
- {" a) R2 H8 y p4 m -
2 T% [$ k3 m. D3 b7 u. v - //斜边距离( H! p! h4 D: b9 P, H* s% f# Q
- if (EQ_is_zero(cosAngle, MINTOL))
8 G: T' P! o) G5 { - {: R4 B$ A* K. X4 p* j7 q* Z
- longDistance = deltaProjectDistance;) H `2 F) q3 V
- }$ z. J# j7 U' a2 A
- else! Z1 A! A! r6 D0 i
- {+ j Y; E# H" @$ H" u0 F/ z
- longDistance = deltaProjectDistance / cosAngle;8 Q; M. b. F3 f* |* t
- }
* S7 O; U' Q9 Z - ) I1 {9 }: z5 W3 t
- //这里可能出现方向相反,我们需要进行一次判定
. r5 G C c& K. j! S8 K
; v- P6 F( z, @4 o% Z; N! H6 X$ t- UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);
3 ~) P$ E L" K6 w; V+ [# A8 q - $ W4 ]# L! l& ^5 e/ f$ P
- Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);
. g( ?$ Y& S/ X" R
# x' W, P3 V6 G9 N% ^- if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))+ _9 s$ `1 U" ^8 ?
- {
+ s, u; n1 o# S( I3 U - UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);" K, L) V) K& A; q0 T! m
- }3 H2 R- q" t$ g) |8 Q4 \
- T) R9 L* O# l3 i
) l2 x, y6 v1 S) V8 w1 b- Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);. @8 @ R# B) Z m) z9 F! v7 w
- }
复制代码
Y- ~& C! e9 R
, T: B: P# d `7 }* y d |
|