天气与日历 切换到窄版

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

makeUniform(mat)

[复制链接]
  • TA的每日心情
    开心
    前天 06:18
  • 签到天数: 49 天

    [LV.5]常住居民I

    185

    主题

    150

    回帖

    1695

    积分

    管理员

    积分
    1695
    发表于 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)
    哎...膜结构车棚,签到来了1...
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|中国膜结构网_中国空间膜结构协会

    GMT+8, 2024-5-13 04:29 , Processed in 0.057371 second(s), 21 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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