找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1668|回复: 4

[求助]:我想要模拟Acad的ALIGN命令,实体的转换矩阵怎么写?

[复制链接]

已领礼包: 13个

财富等级: 恭喜发财

发表于 2002-5-13 14:06:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
谢谢大家,我是新来的,请多关照!

本帖被以下淘专辑推荐:

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 13个

财富等级: 恭喜发财

 楼主| 发表于 2002-5-13 14:18:10 | 显示全部楼层

试试贴图

试试贴图,下面是2002帮助关于ALIGN命令,我到不是想写个相同的命令,只是想知道如何构造能实现这个命令效果的转换矩阵。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-5-14 14:36:44 | 显示全部楼层

Re: [求助]:我想要模拟Acad的ALIGN命令,实体的转换矩阵怎么写?

最初由 LoveArx 发布
[B]谢谢大家,我是新来的,请多关照! [/B]


你需要构造一个“旋转、缩放、和最终的平移”矩阵。见下面的代码,模拟ACAD的ALIGN命令



  1. [FONT=courier new]
  2. void fAlign()
  3. {

  4. ads_name mEnt;
  5. ads_point pt1;
  6. ads_point pt2;

  7. acedEntSel("\n选取一个实体:",mEnt,pt1);
  8. acedGetPoint(NULL,"\n第一个源点",pt1);

  9. acedGetPoint(NULL,"\n第二个源点",pt2);

  10. AcGePoint3d mSrcPt1(pt1[X],pt1[Y],pt1[Z]);
  11. AcGePoint3d mSrcPt2(pt2[X],pt2[Y],pt2[Z]);

  12. acedGetPoint(NULL,"\n第一个目标点",pt1);
  13. acedGetPoint(NULL,"\n第二个目标点",pt2);

  14. AcGePoint3d mDestPt1(pt1[X],pt1[Y],pt1[Z]);
  15. AcGePoint3d mDestPt2(pt2[X],pt2[Y],pt2[Z]);

  16. AcGeVector3d mVec1(mSrcPt1 - mSrcPt2);
  17. AcGeVector3d mVec2(mDestPt1 - mDestPt2);

  18. AcDbObjectId mObjId;
  19. acdbGetObjectId(mObjId,mEnt);

  20. //打开实体写

  21. AcDbEntity *pEnt;
  22. acdbOpenAcDbEntity(pEnt,mObjId,AcDb::kForWrite);

  23. //构造旋转、平移矩阵

  24. AcGeMatrix3d mMatScale;
  25. AcGeMatrix3d mMatRot;
  26. AcGeMatrix3d mMatResul;
  27. //沿着 0,0,0构筑一个旋转矩阵
  28. mMatRot = mVec1.rotateTo(mVec2);

  29. //设置矩阵的缩放比例
  30. mMatScale.setToScaling(mVec2.length()/mVec1.length());
  31. mMatResul = mMatRot*mMatScale;

  32. //把第一个源点用当前的矩阵变换
  33. mSrcPt1.transformBy(mMatResul);
  34. //按照第一个源点和第一个目标点构筑平移矩阵
  35. mMatResul.setTranslation(mDestPt1 - mSrcPt1);

  36. //把构造的矩阵应用到实体上
  37. pEnt->transformBy(mMatResul);
  38. pEnt->close();//关闭实体
  39. }


  40. [/FONT]
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-5-16 03:34:26 | 显示全部楼层

Re: Re: [求助]:我想要模拟Acad的ALIGN命令,实体的转换矩阵怎么写?

//设置矩阵的缩放比例
mMatScale.setToScaling(mVec2.length()/mVec1.length());
mMatResul = mMatRot*mMatScale;


setToScaling只能对X,Y,Z同一比例缩放,如果不同怎么办??
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-5-16 03:50:57 | 显示全部楼层
如果X,Y,Z比例不同,那么就要用AcGeScale3d对象,设置好X,Y,Z后,用AcGeScale3d::getMatrix(..)得到矩阵。

不是什么实体都支持X,Y,Z不同比例缩放的,支持的有:

AcDbLeader, AcDbMLine, AcDbMText, AcDbOle2Frame, AcDbPloyFaceMesh, AcDbPolygonMesh,
AcDbRay, AcDbXline, AcDbFcf, AcDbSolid, AcDbEllipse, AcDbSpline, AcDbImage

不支持的实体是:

AcDb2dPolyine, AcDb3dPolyine, AcDbDimension and derived classes, AcDbArc, AcDbCircle,
AcDbBlockReference, AcDbMInsert, AcDbFace, AcDbLine, AcDbPloyline, AcDbPoint,
AcDbPoint, AcDbHatch, AcDbShape, AcDbText and derived classes, AcDbTrace, AcDbViewport,
AcDbRegion, AcDb3dSolid, and AcDbBody.

如果对不支持非同比例缩放的实体用transFromBy时候,会返回:
Acad::eCannotScaleNonUniformly 的。不能成功。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-16 01:20 , Processed in 0.190877 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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