找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 867|回复: 6

[ARX函数]:关于镜象问题。

[复制链接]
发表于 2003-6-5 10:22:10 | 显示全部楼层 |阅读模式

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

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

×
我在做一个点集合关于经过某两点直线的镜象时出错。点的位置没有变化。请大虾解惑。
函数如下:
void CPublicApplication::PntsMirroring(const AcGePoint3d& p1,const AcGePoint3d& p2,AcGePoint3dArray& Pnts)
{
        AcGePoint3d pt;
        AcGeLine3d CentLine(p1,p2);
        AcGeMatrix3d ma1;
        ma1.mirroring(CentLine);
        for(int i = 0 ;i < Pnts.logicalLength();i++)
        {
                pt = Pnts;
                pt.transformBy(ma1);
                Pnts = pt;
        }
}
而关于点旋转的函数却没错
void CPublicApplication::PntsRotate(double Angle,const AcGePoint3d& InsertPnt,AcGePoint3dArray& Pnts)
{
        AcGePoint3d p1;
        AcGeMatrix3d ma1;
        ma1.setToRotation(Angle,AcGeVector3d(0,0,1),InsertPnt);
        for(int i = 0 ;i < Pnts.logicalLength();i++)
        {
                p1 = Pnts;
                p1.transformBy(ma1);
                Pnts = p1;
        }
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-6-5 12:06:42 | 显示全部楼层
免费赠你一个
//-----------------------------------------------------
AcGePoint3d Utils::Mirror(AcGePoint3d pt1,AcGePoint3d pt2,AcGePoint3d ptUser,AcGeVector3d vector)
{
        AcGeVector3d vector1;
        vector1 = pt2 - pt1;
        AcGePlane plane(pt1,vector1,vector);

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

使用道具 举报

 楼主| 发表于 2003-6-5 13:17:04 | 显示全部楼层
谢谢,不过错在什么地方能说一下吗?
AcGeMatrix3d也有用AcGePlane的。我试了还是不行。

AcGeMatrix3d
mirroring(

    const AcGePlane& pln);

pln        Input mirror plane

Returns the matrix of mirroring with respect to plane pln.

最初由 binbin 发布
[B]免费赠你一个
//-----------------------------------------------------
AcGePoint3d Utils::Mirror(AcGePoint3d pt1,AcGePoint3d pt2,AcGePoint3d ptUser,AcGeVector3d vector)
{
        AcGeVector3d vector1;
        ve... [/B]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2003-6-5 16:28:17 | 显示全部楼层
最初由 chxmhsd 发布
[B]谢谢,不过错在什么地方能说一下吗?
AcGeMatrix3d也有用AcGePlane的。我试了还是不行。

AcGeMatrix3d
mirroring(

    const AcGePlane& pln);

pln        Input mirror plane

Returns the matrix of mirror... [/B]


按照你的写法,你应该用AcGeMatrix3d::setToMirroring 构造镜像矩阵,这个方法返回的是引用,如果用你的AcGeMatrix3d::mirroring(..), 那么你需要另外赋值才可以。你的用法,MAT1实际上没有改变,还是单位矩阵。

  1. <normalfont>
  2. AcGeMatrix3d&
  3. setToMirroring(

  4.     const AcGePlane& pln);

  5. pln        Input mirror plane

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

使用道具 举报

 楼主| 发表于 2003-6-6 09:04:43 | 显示全部楼层
谢谢!完全明白了。
1.用了setToRotation却没想到有setToMirroring,失败。
2.setToMirroring和mirroring区别只在于一个 是对象引用,一个返回新对象。猪。
所以用binbin的写法:
void CPublicApplication::PntsMirroring(const AcGePoint3d& p1,const AcGePoint3d& p2,AcGePoint3dArray& Pnts)
{
        AcGePoint3d pt;
        AcGePlane pln(p1,AcGeVector3d(p1- p2).perpVector());
        for(int i = 0 ;i < Pnts.logicalLength();i++)
        {
                pt = Pnts;
                pt.mirror(pln);
                Pnts = pt;
        }
}
setToMirroring的写法
void CPublicApplication::PntsMirroring(const AcGePoint3d& p1,const AcGePoint3d& p2,AcGePoint3dArray& Pnts)
{
        AcGePoint3d pt;
        AcGeLine3d CentLine(p1,p2);
        AcGeMatrix3d ma1;
        ma1.setToMirroring(CentLine);
        for(int i = 0 ;i < Pnts.logicalLength();i++)
        {
                pt = Pnts;
                pt.transformBy(ma1);
                Pnts = pt;
        }
}
用mirroring的写法。(在这个函数里,不爽,不推荐使用。)
void CPublicApplication::PntsMirroring(const AcGePoint3d& p1,const AcGePoint3d& p2,AcGePoint3dArray& Pnts)
{
        AcGePoint3d pt;
        AcGeLine3d CentLine(p1,p2);
        AcGeMatrix3d ma1(AcGeMatrix3d().mirroring(CentLine));
        for(int i = 0 ;i < Pnts.logicalLength();i++)
        {
                pt = Pnts;
                pt.transformBy(ma1);
                Pnts = pt;
        }
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-6-6 09:28:19 | 显示全部楼层
看看下面的矩阵转换
AcGeMatrix3d ma1;
ma1.setToScaling(2);
ma1.setToMirroring (line);

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

使用道具 举报

 楼主| 发表于 2003-6-6 12:02:18 | 显示全部楼层
最初由 binbin 发布
[B]看看下面的矩阵转换
AcGeMatrix3d ma1;
ma1.setToScaling(2);
ma1.setToMirroring (line);

如果我没记错,应该是得不到 放大2倍再镜像的矩阵! [/B]


是的。
想来这些函数应该先转为单位阵再进行有效转换。
非单位阵的转换结果是无效的。?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-20 22:25 , Processed in 0.193203 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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