天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 164|回复: 0

makeUniform(mat)

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-3-28 17:28:39 | 显示全部楼层 |阅读模式
  1. AcGeMatrix3d &makeUniformNoRounding(AcGeMatrix3d &mat);
  2. // Make mat uniform
  3. // Preserves:
  4. //        + direction of the Z-axis
  5. //        + ZX-plane
  6. //  + "average" length of the base vectors
  7. //  + all elements m[i][3] und m[3][j]
  8. AcGeMatrix3d &makeUniform(AcGeMatrix3d &mat)
  9. {
  10.         // set values to 0 / 1 that only differ by 1e-12 from 0 / 1
  11.         int i, j;
  12.         double *dval;
  13.         for (i = 0; i < 3; i++)
  14.         {
  15.                 for (j = 0; j < 3; j++)
  16.                 {
  17.                         dval = &(mat(i, j));
  18.                         if (fabs(*dval) < 1e-12)
  19.                                 *dval = 0.0;
  20.                         else if (fabs(*dval - 1.0) < 1e-6)
  21.                                 *dval = 1.0;
  22.                 }
  23.                 dval = &(mat(i, 3));
  24.                 if (fabs(*dval) < 1e-12)
  25.                         *dval = 0.0;
  26.         }
  27.         makeUniformNoRounding(mat);
  28.         return mat;
  29. }
  30. bool approx(const double &x1, const double &x2, const double &tol)
  31. {
  32.         int        exp1, exp2;
  33.         double mant1 = frexp(x1, &exp1);
  34.         double mant2 = frexp(x2, &exp2);
  35.         if (abs(exp1 - exp2) > 1)
  36.                 return FALSE;        // exp1 > 2*exp2 or exp2 > 2*exp1
  37.         else if (exp1 > exp2)
  38.                 mant2 *= 2;        // to same exponent
  39.         else if (exp2 > exp1)
  40.                 mant1 *= 2;
  41.         return (fabs(mant1 - mant2) < tol);
  42. }
  43. AcGeMatrix3d &makeUniformNoRounding(AcGeMatrix3d &mat)
  44. {
  45.         AcGePoint3d origin;
  46.         AcGeVector3d eX, eY, eZ;
  47.         mat.getCoordSystem(origin, eX, eY, eZ);
  48.         bool bSetKoSys = false;
  49.         double        spXY = eX.dotProduct(eY),
  50.                 spZX = eZ.dotProduct(eX),
  51.                 spYZ = eY.dotProduct(eZ);
  52.         // make pairwise perpendicular
  53.         if (spXY != 0.0 || spZX != 0.0 || spYZ != 0.0)
  54.         {
  55.                 // keep eZ
  56.                 AcGeVector3d eZnorm(eZ), eYnorm;
  57.                 eZnorm.normalize();
  58.                 eX -= eZnorm * eX.dotProduct(eZnorm);
  59.                 // eX must be perpendicular to eY and eZ
  60.                 eYnorm = eX.crossProduct(eZnorm).normalize();
  61.                 double lY = eY.dotProduct(eYnorm);
  62.                 eY = lY * eYnorm;
  63.                 bSetKoSys = true;
  64.         }
  65.        
  66.         double        slX = eX.dotProduct(eX), // = eX.lengthSqrd()
  67.                 slY = eY.dotProduct(eY),
  68.                 slZ = eZ.dotProduct(eZ);
  69.         // make same length
  70.         if (!approx(slX, slY, 1e-12) || !approx(slX, slZ, 1e-12))
  71.         {
  72.                 double lav = sqrt((slX + slY + slZ) / 3.0); // average length
  73.                 eX.normalize(); eX *= lav;
  74.                 eY.normalize(); eY *= lav;
  75.                 eZ.normalize(); eZ *= lav;
  76.                 bSetKoSys = true;
  77.         }
  78.         if (bSetKoSys)
  79.                 mat.setCoordSystem(origin, eX, eY, eZ);
  80.         return mat;
  81. }
复制代码


  1. Adesk::Boolean AcGeMatrix3d::isUniScaledOrtho(const AcGeTol& tol = AcGeContext::gTol()
复制代码

 

 

 

 

makeUniform(mat)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 08:38 , Processed in 0.127513 second(s), 28 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表