注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

信息 灵感 创新

I? =Information,Inspiration,Innovation

 
 
 

日志

 
 
关于我

we are 5. Mathematics, Computation, Programming, Engineering, and Making fun of life.

网易考拉推荐

对任意平面的镜像  

2010-12-30 18:58:06|  分类: ObjectARX |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

数学基础

如果向量n为平面P的单位法向量,即有:

对任意平面的镜像 - Castor - 趁年轻,多折腾~~

对任意平面的镜像 - Castor - 趁年轻,多折腾~~

 则实体关于该平面的变换矩阵为:

对任意平面的镜像 - Castor - 趁年轻,多折腾~~

 

AutoCAD环境下的实现

下面是测试代码,我们用三个点构建一个平面,平面的Normal返回一个Vector3d对象,该对象是该平面的单位法向量。

using System;

using Autodesk.AutoCAD.Runtime;

using Autodesk.AutoCAD.Geometry;

using Autodesk.AutoCAD.ApplicationServices;

using Autodesk.AutoCAD.DatabaseServices;

using Autodesk.AutoCAD.EditorInput;

namespace CADTest

{

    public class Class1

    {

        #region 实体镜像

        [CommandMethod("MP")]//Mirror Entity

        public void MirrorEntity()

        {

            Database db = Application.DocumentManager.MdiActiveDocument.Database;

            Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;

            //对称平面

            Plane mp = new Plane(new Point3d(1, 0, 0), new Point3d(0, 1, 0), new Point3d(0, 0, 1));

            double x = mp.Normal.X;

            double y = mp.Normal.Y;

            double z = mp.Normal.Z;

            double[] dm = new double[16];

            dm[0] = 1 - 2 * x * x;

            dm[5] = 1 - 2 * y * y;

            dm[10] = 1 - 2 * z * z;

            dm[15]=1;

            dm[1] = dm[4] = -2*x * y;

            dm[2] = dm[8] = -2*x * z;

            dm[6] = dm[9] = -2*y * z;

            Matrix3d Tm = new Matrix3d(dm);

            using (Transaction trans = db.TransactionManager.StartTransaction())

            {

                BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);

                BlockTableRecord btr = (BlockTableRecord)trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);

                Solid3d sld = new Solid3d();

                sld.SetDatabaseDefaults();

                sld.CreateBox(100, 150, 200);

                sld.ColorIndex = 1;//red

                btr.AppendEntity(sld);

                trans.AddNewlyCreatedDBObject(sld, true);

                Solid3d sldClone = sld.Clone() as Solid3d;

                sldClone.ColorIndex = 3;//green

                sldClone.TransformBy(Tm);

                btr.AppendEntity(sldClone);

                trans.AddNewlyCreatedDBObject(sldClone, true);

                trans.Commit();

            }

        }

        #endregion

    }

}

 

  评论这张
 
阅读(982)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016