PLM之家PLMHome-国产软件践行者

[二次开发源码] 【二次开发源码】一种基于点投影,获取投影原始点的方法

[复制链接]

2023-2-28 20:27:29 1042 0

admin 发表于 2023-2-28 20:27:29 |阅读模式

admin 楼主

2023-2-28 20:27:29

请使用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; {/ [

  1. 8 D# N) R  Y1 c! F7 @( a& y
  2. //这里仅仅考虑Z轴方向
    ' z$ u1 N5 g9 r: D% C4 O
  3. 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. {
    4 E2 I* E' X8 M- {
  5.         double dotResult;; E0 a. x5 V. q4 ?% ~9 v' _
  6.         double longDistance;. g# c/ H: ~7 K/ |" M
  7.         double zDir[3] = { 0.0,0.0,1.0 };# j4 j3 j" y. k  I5 i) g6 A
  8.         //直线距离1 H' T# ?" p- Q" l" D0 |
  9.         double deltaProjectDistance = fabs(maxZValue - basePoint[2]);" e6 a( p& G# M' ~

  10. 3 H+ l* v9 }% t* @& ~4 T
  11.         Echo("斜度垂直直线距离:%.3f maxZValue:%.3f", deltaProjectDistance, maxZValue);
    / a) V  R( Z6 B# Q6 t- E) f

  12. 7 ?, C% W  @. ^7 L
  13.         if ( EQ_is_eq(deltaProjectDistance,0.0,MINTOL)) //就是最高点 ,直接返回* B, h* r& ?9 O3 }
  14.         {  R- ^" Q/ e  T. a9 J( y6 s1 N
  15.                 UF_VEC3_copy(basePoint, newOriginalPoint);
    " I  U3 |0 y3 t" \+ d$ n6 Q9 P
  16.                 return;" G# c. ~- _- t2 ^. b# e+ X/ J
  17.         }& q' T+ e- _8 h" i& w# s
  18. $ K) Z3 `% h" L7 D$ W0 v
  19.         //计算夹角,通过单位矢量
    1 `. L7 |: H7 \$ m4 i3 ^; e$ f
  20.         //faceDir 可能反向
    $ ]. c+ r8 o( u$ A5 V( ~
  21.         UF_VEC3_dot(projectOrignialUnitDir, zDir, &dotResult);
    3 |# G0 a: C! i" K/ b
  22.         // cos() faceDir.zDir = |FaceDir||ZDir|cos(angle)
    3 _7 }1 G) I. w
  23.         double cosAngle = fabs(dotResult);
    + q! S: ], s" t) z# W! G: m6 I
  24.         ) [' H* [6 K/ U4 _& S5 o& I, @  I
  25.         //斜边距离+ e) y4 ^% P; u) }, h
  26.         if (EQ_is_zero(cosAngle, MINTOL))7 _1 a; C9 G; u, ]7 E; H$ `
  27.         {
    " Z0 P6 |/ S8 j7 e. U* K
  28.                 longDistance = deltaProjectDistance;
    0 _5 v" x4 [, b4 r
  29.         }
    - V. U6 o* j; f  t3 [9 |$ o
  30.         else( S9 U& m$ S/ ?
  31.         {
    + o! B. a! a1 ^4 G+ h4 ]
  32.                 longDistance = deltaProjectDistance / cosAngle;
    , P) m& u$ q& p/ i& J/ ~
  33.         }
    2 U3 H. P* C6 }. G
  34.         * o( h3 I7 H0 c% |& y) A- g, y
  35.         //这里可能出现方向相反,我们需要进行一次判定
    0 U6 |6 L0 p. j% }8 u

  36. $ a! l) E- q3 _  R; Q3 u
  37.         UF_VEC3_affine_comb(basePoint, longDistance, projectOrignialUnitDir, newOriginalPoint);; `# |, c. X3 c' A9 T0 R

  38. : ]# V/ \, V. P' y
  39.         Echo("maxZValue: %f ,newOriginalPoint[2]:%.3f", maxZValue, newOriginalPoint[2]);
      q% y* i0 f0 L$ V; N4 t- ~

  40. ' R" m% h" g/ F( f# P0 M$ A0 g0 N+ m
  41.         if (!EQ_is_eq(maxZValue,newOriginalPoint[2],MINTOL))+ `2 M/ k$ M" n" U
  42.         {
    7 w) E( p3 h% c  V+ H
  43.                 UF_VEC3_affine_comb(basePoint, -longDistance, projectOrignialUnitDir, newOriginalPoint);
    3 U- x5 M1 d4 ?8 G8 U7 Z( o
  44.         }
    9 G' @4 [1 w5 V# R7 p

  45. + c. m2 Z( _1 W7 S: w* ~

  46. 6 Z7 z& E: V: C" D: [
  47.         Echo("cosAngle: %f ,longDistance:%.3f", cosAngle, longDistance);
    4 t% \7 M' F  o1 r7 r( p4 w8 l
  48. }
复制代码
3 c! |$ ^; f! ]. [

3 o: k, w. {! a0 E
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 doTeam.tech
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 注册

返回列表 本版积分规则

  • 发布新帖

  • 在线客服

  • 微信

  • 客户端

  • 返回顶部

  • x
    温馨提示

    本网站(plmhome.com)为PLM之家工业软件学习官网站

    展示的视频材料全部免费,需要高清和特殊技术支持请联系 QQ: 939801026

    PLM之家NX CAM二次开发专题模块培训报名开始啦

    我知道了