|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
! L. Z& K9 G$ v# I
& X# b( `% r2 r5 e6 E4 ?' m! v' P3 e. o: \0 A4 H1 _% j
【二次开发源码】一种基于点投影,获取投影原始点的方法
! `" p$ ~0 P; j# L
- g! W0 U+ u; N# O4 V一直斜边和一个直边的向量,单位向量可以通过dot 获取 夹角
( a( g- i" `% ?' [& y9 s' R" @+ L然后通过勾股定理,计算得到长边值,最后进行基于点的affine,即可获取斜边向量 |5 L |6 f( g
+ E/ {# v7 t8 e' B7 C D, D
! e0 y7 l% d# A' e- |1 e& p- //这里仅仅考虑Z轴方向% n d0 w, }; T0 @
- void Get_Projection_OrignalPoint(double basePoint[3],double maxZValue,double projectOrignialUnitDir[3], double newOriginalPoint[3])) |1 q; t4 e6 |- @! t* B
- {2 n' e8 o! Y9 Y$ i
- double dotResult;
. M m2 ]/ A! H; K/ b# ~ - double longDistance;
& h# D0 p# _, W& s: _2 q4 y' G - double zDir[3] = { 0.0,0.0,1.0 };
1 ? \# i4 f/ D1 I - //直线距离. R2 ^3 j: d2 X' i" c; ]
- double deltaProjectDistance = fabs(maxZValue - basePoint[2]);* @1 \, B3 E1 _, e) {
- ) E+ ~6 u9 ^3 z: t; J- d6 V4 T
- Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);
7 R# ^- s6 p# _) [3 E/ Y2 p - - G! D8 }, ^% z2 c/ a$ g
- if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回 @+ Z& O% |9 q0 k7 {
- {
' L( l1 J" J" N$ ^- Y4 e6 U - UF_VEC3_copy(basePoint, newOriginalPoint);
+ n x3 o; t# ]4 _5 w4 U - return;
; f9 H+ S7 ?" K9 ^/ G - }: V. N7 P/ ?. G7 y7 P' G
- , k6 i& l( \5 d' q* r7 c
- //计算夹角,通过单位矢量
4 ?4 D7 {$ R0 @2 l2 ^8 j - //faceDir 可能反向
. i+ F( L( ]0 K z. V - UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);
# g/ h' V" T# q: b5 `6 m& S - // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle) 0 Q# K; [* G5 B+ k
- double cosAngle = fabs(dotResult);
& J) @ @8 z# H/ i -
( Z2 _7 W5 A; H% \& _ - //斜边距离" p9 A) L& ] T9 G: ^
- if (EQ_is_zero(cosAngle, MINTOL))
* y- m5 s+ C. S" c0 h1 ?; Y5 k - {
+ ^6 Z# p4 l, v3 Q' @# H - longDistance = deltaProjectDistance;
% d& P! t& _) m7 A6 [ - }
0 u: e" n* X6 v4 _, I: G - else
2 i+ U ]7 _+ n+ K# o, B - {
4 m/ r& z1 j' A6 h2 y2 E9 w - longDistance = deltaProjectDistance / cosAngle;
! z( h% C: p+ k; b5 w - }) ^$ ~$ Y. V, e- b/ }# a
-
) }8 x5 ^2 b6 V2 q& h, Y - //这里可能出现方向相反,我们需要进行一次判定
& e' |) `" a0 ~% O' W& i - 3 c l' N( m7 B3 B/ i3 H1 m4 }* r
- UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);
6 m0 e: r1 [$ b# i2 Z2 Q
& H% } A; j4 u! ?! N- Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);" u/ W) N: p+ L: X0 `
2 A9 \9 L! J1 D6 m5 P' \) n- if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))
8 x, t; Y$ E; g# E4 M - {7 X3 g) X7 [+ X1 u% J5 ^
- UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);1 O% K& N( e# f/ D8 `
- }
3 t# Q3 r, Z2 W - 4 Q+ c$ E# }4 l! [
6 H/ y" E1 I) Q- Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);; z; H& Z; x# a0 U
- }
复制代码 7 i7 |0 _; ]2 V6 C$ [. B) H" H
5 i7 D5 s6 n# }, M) E
|
|