|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
* X$ N- F+ u# Y" ^. o
1 y% {0 Y* e5 x, M' A# V3 [" V% t, D" W9 P, B' K0 Z
【二次开发源码】一种基于点投影,获取投影原始点的方法; a; V9 S% v9 @, H4 i' ]
: i* r% b9 S$ }& r/ A* `
一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角5 H# R0 p. d$ e# p, `- S& h
然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量6 ]8 d9 G, m7 X: d: |% ] @0 P/ `
$ o. c: |! f/ l& d
0 U- S: x5 m% l/ _' k. j$ Y- //这里仅仅考虑Z轴方向
# ^4 @3 x" h* B; S* N4 i1 k - void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3])+ e( s/ W% Y; a; |, J$ W1 M0 [3 n3 {
- {, Q. m( t) D6 X% E
- double dotResult;! r. W' O- }; Y
- double longDistance;
/ [% Y, G. b- u) N' w5 \0 [' f t; x - double zDir[3] = { 0.0,0.0,1.0 };4 |' D+ T, ^+ T7 m3 |9 p
- //直线距离
- k1 [6 R. l* u! T* w1 ]: L - double deltaProjectDistance = fabs(maxZValue - basePoint[2]);
- H( e- v+ @( ~2 p* Z9 s6 A/ D
. ?7 @9 d9 a0 a0 \* }- Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);
7 t0 r( l( E3 Z4 `) ?) P) E( {
5 w1 i7 k9 ?, x5 i) q2 \& t- if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回4 \# G" ]# Q# S7 Z3 r. M# E* A
- {. I9 e- L1 z/ Q* Y/ B) H; b, S
- UF_VEC3_copy(basePoint, newOriginalPoint);
" b' i/ c4 P3 r9 p I3 Z7 H5 L - return;
! W$ ~# X3 w1 b0 O) m+ i, y" T- r7 I - }
! \3 @/ B9 N* f, R/ N
3 B4 k* }" R6 B1 p+ M' i- //计算夹角,通过单位矢量
0 a A6 g& j) R7 `' k - //faceDir 可能反向 & q* e4 p, T! G/ R3 }7 [* V0 K
- UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);
$ `# W: \/ P2 G1 N1 N U( ]: A" S. h - // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle)
P n& n! j& ?( I& n8 v - double cosAngle = fabs(dotResult);
- K4 R Z# ?2 B( ^! l' W8 T - ! o; e$ a$ J( n/ N
- //斜边距离
* ]8 v Z( f; J7 R4 b# Q - if (EQ_is_zero(cosAngle, MINTOL))0 g& q# P6 U: s( N
- {
- A! ? D* u9 `& n - longDistance = deltaProjectDistance;7 b. m9 g9 G& T+ c+ A8 }$ _
- }, v8 T+ G5 N. M# W2 H# T
- else( R$ n7 q% x) p+ A2 r C7 U
- {5 D* ~( K' Y4 B+ H" F/ k3 s
- longDistance = deltaProjectDistance / cosAngle;) b1 `$ t6 x; N$ m q' M
- }
4 f; x# m2 X/ \$ l1 f/ c4 \" T% Y - O8 U0 E4 g1 s
- //这里可能出现方向相反,我们需要进行一次判定 ^' J) }! v3 o6 G' V% P7 O: {' O
* S: m( Q3 N& g- UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);, Z! n0 D1 c4 z* @5 f
- ! b* X8 S1 E& x7 E5 x
- Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);
; d* }$ F% \' z; O a0 Q
' D1 j" }/ b! y; O) `- if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))
( t5 L8 g2 y8 h8 B2 c8 Z3 o - {+ L0 Z" n, h0 ]; u
- UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);
8 T1 ]' n% Y9 z H' Q7 A - }
! o( U5 A4 q l+ D! G; V/ W' m - ' H; V- D' W" a( v: J
- % U5 D+ {1 Q# v0 \
- Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);* K5 X7 l: [/ F7 K T! N- K
- }
复制代码
9 k5 O |: I/ s: U. k7 r! _, c$ h
( X) O7 C) I4 u2 B6 H2 E% g |
|