图形阵列(矩形和环形)_第1页
图形阵列(矩形和环形)_第2页
图形阵列(矩形和环形)_第3页
图形阵列(矩形和环形)_第4页
图形阵列(矩形和环形)_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计算机图形学课程设计报告课 题 图形的阵列(矩形和环形) 专 业 地理信息系统 班级学号 24,25,26,29 姓 名 童萌,姚大壮,尹程,周超伟指导教师 许耀东 学 期 2014-2015第一学期 南京工业大学测绘学院图形阵列(矩形和环形) 一:设计思路阵列特征即将单个特征、特征组或阵列特征按照某种规则排列,生成大量形状相同或相近的特征。常用于快速、准确地创建数量较多、排列规则且形状相同或相近的一组结构。注意:阵列只能对单个特征进行阵列,要想对多个特征进行阵列,须将多个特征编为一个组进行阵列。我们可以创建对象的环形阵列或矩形阵列。对象阵列不是使用一组专门的函数创建的,而是通过复制对象然后使

2、用变换矩阵旋转和移动对象复本等组合动作创建的。下面简述一下每种阵列类型的基本逻辑:环形阵列 :复制要阵列的对象并围绕基点按角度移动对象。对象到阵列基点的距离用来计算所创建的每个复本的位置。移动复本对象之后,就可以基于基点的角度旋转对象。每创建一个复本,就需将其追加到块表记录去。矩形阵列 复制对象到基于所需行数和列数的阵列。复本对象间的距离基于给定的行列间距。首先复制一定数量的原件创建第一行或列,然后基于第一行或列创建其他的行或列。每创建一个复本,就需将其追加到块表记录去。二:代码实现(我们使用C#创建的代码)1. 环形阵列:本例创建一个圆,然后实现该圆的环形阵列,创建4个圆

3、绕点(4, 4, 0) 围成180度using Autodesk.AutoCAD.Runtime;using Autodesk.AutoCAD.ApplicationServices;using Autodesk.AutoCAD.DatabaseServices;using Autodesk.AutoCAD.Geometry; static Point2d PolarPoints(Point2d pPt, double dAng, double dDist)  return new Point2d(pPt.X + dDist * Math.Cos(dAng), &

4、#160;                   pPt.Y + dDist * Math.Sin(dAng); CommandMethod("PolarArrayObject")public static void PolarArrayObject()  / Get the current document and database获取当前文档和数据库  Docume

5、nt acDoc = Application.DocumentManager.MdiActiveDocument;  Database acCurDb = acDoc.Database;   / Start a transaction启动事务  using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction()        /以读打开Block表      Blo

6、ckTable acBlkTbl;      acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,                                 

7、0; OpenMode.ForRead) as BlockTable;            / 以写打开块表记录ModelSpace      BlockTableRecord acBlkTblRec;      acBlkTblRec = acTrans.GetObject(acBlkTblBlockTableRecord.ModelSpace,   &

8、#160;                                  OpenMode.ForWrite) as BlockTableRecord;         

9、60;  / 创建圆,圆心2,2半径1      Circle acCirc = new Circle();      acCirc.Center = new Point3d(2, 2, 0);      acCirc.Radius = 1;           / 添加新对象到块表记录和事务    

10、0; acBlkTblRec.AppendEntity(acCirc);      acTrans.AddNewlyCreatedDBObject(acCirc, true);        /创建4个对象的180度环形阵列      int nCount = 1;       /定义60度弧度值      doubl

11、e dAng = 1.0472;       / 定义阵列基点      Point2d acPt2dArrayBase = new Point2d(4, 4);       while (nCount < 4)                Entity acEntClone =

12、acCirc.Clone() as Entity;           Extents3d acExts;          Point2d acPtObjBase;                   /典型情况,使用对象范围的

13、左上角作为要阵列对象上的点,除非          /要阵列对象是类似圆这样的对象(使用圆心);          Circle acCircArrObj = acEntClone as Circle;           if (acCircArrObj != null)/是圆   &#

14、160;                    acPtObjBase = new Point2d(acCircArrObj.Center.X,                       

15、                 acCircArrObj.Center.Y);                    Else/不是圆           &

16、#160;            acExts = acEntClone.Bounds.GetValueOrDefault();              acPtObjBase = new Point2d(acExts.MinPoint.X,         

17、0;                              acExts.MaxPoint.Y);                  &

18、#160;  double dDist = acPt2dArrayBase.GetDistanceTo(acPtObjBase);          double dAngFromX = acPt2dArrayBase.GetVectorTo(acPtObjBase).Angle;           Point2d acPt2dTo = PolarPoints(acPt2dArrayBase,&

19、#160;                                        (nCount * dAng) + dAngFromX,     &#

20、160;                                   dDist);           Vector2d acVec2d = acPt

21、ObjBase.GetVectorTo(acPt2dTo);          Vector3d acVec3d = new Vector3d(acVec2d.X, acVec2d.Y, 0);          acEntClone.TransformBy(Matrix3d.Displacement(acVec3d);        &

22、#160;            / 下列代码演示怎样旋转每个对象,就像Array命令所做的那样;          acExts = acEntClone.Bounds.GetValueOrDefault();          acPtObjBase = new Point2d(acExts.MinPoint.X,

23、                                    acExts.MaxPoint.Y);           

24、0;        / 围绕左上范围点旋转对象          Matrix3d curUCSMatrix = acDoc.Editor.CurrentUserCoordinateSystem;          CoordinateSystem3d curUCS = curUCSMatrix.CoordinateSystem3d; &

25、#160;        acEntClone.TransformBy(Matrix3d.Rotation(nCount * dAng,                                 

26、;                  curUCS.Zaxis,                              

27、60;                    new Point3d(acPtObjBase.X,                          

28、                                     acPtObjBase.Y, 0);          */ &#

29、160;/ 添加新对象到块表记录和事务          acBlkTblRec.AppendEntity(acEntClone);          acTrans.AddNewlyCreatedDBObject(acEntClone, true);           nCount = nCount + 1;

30、60;            /保存新对象到数据库      acTrans.Commit();  2:本例创建一个圆并实现该圆的五行五列矩形阵列。using Autodesk.AutoCAD.Runtime;using Autodesk.AutoCAD.ApplicationServices;using Autodesk.AutoCAD.DatabaseServices;using Autodesk.AutoCAD.Geometry;

31、 static Point2d PolarPoints(Point2d pPt, double dAng, double dDist)  return new Point2d(pPt.X + dDist * Math.Cos(dAng),                     pPt.Y + dDist * Math.Sin(dAng); CommandMethod

32、("RectangularArrayObject")public static void RectangularArrayObject()  /获取当前文档和数据库  Document acDoc = Application.DocumentManager.MdiActiveDocument;  Database acCurDb = acDoc.Database;   /启动事务  using (Transaction acTrans = acCurDb.TransactionManager.StartTransa

33、ction()        /以读打开块表      BlockTable acBlkTbl;      acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,                   &#

34、160;               OpenMode.ForRead) as BlockTable;            / 以写打开块表记录ModelSpace      BlockTableRecord acBlkTblRec;      a

35、cBlkTblRec = acTrans.GetObject(acBlkTblBlockTableRecord.ModelSpace,                                      OpenMode.F

36、orWrite) as BlockTableRecord;       / Create a circle that is at 200,200 with a radius of 60      Circle acCirc = new Circle();      acCirc.Center = new Point3d(200, 200, 0);      acCirc.Radius =

37、 60;       / Add the new object to the block table record and the transaction      acBlkTblRec.AppendEntity(acCirc)      acTrans.AddNewlyCreatedDBObject(acCirc, true);       / 创建5行5列的矩形阵列

38、60;     int nRows = 5;      int nColumns = 5;             / 设置行列间距及阵列基角      double dRowOffset = 200;      double dColumnOffset = 300;  

39、0;   double dArrayAng = 0       / 获取到当前UCS坐标系X轴的角度      Matrix3d curUCSMatrix = acDoc.Editor.CurrentUserCoordinateSystem;      CoordinateSystem3d curUCS = curUCSMatrix.CoordinateSystem3d;    

40、;  Vector2d acVec2dAng = new Vector2d(curUCS.Xaxis.X,                                         c

41、urUCS.Xaxis.Y);            / 如果UCS坐标系旋转了,相应地调整阵列的角度      dArrayAng = dArrayAng + acVec2dAng.Angle;       Extents3d acExts = acCirc.Bounds.GetValueOrDefault();      P

42、oint2d acPt2dArrayBase = new Point2d(acExts.MinPoint.X,                                         

43、;   acExts.MaxPoint.Y);          / 跟踪为每列创建的对象      DBObjectCollection acDBObjCollCols = new DBObjectCollection();      acDBObjCollCols.Add(acCirc);        

44、   创建第一行的对象(个数等于列数)      int nColumnsCount = 1;      while (nColumns > nColumnsCount)                Entity acEntClone = acCirc.Clone() as Entity;   

45、60;      acDBObjCollCols.Add(acEntClone);                   / 计算新位置          Point2d acPt2dTo = PolarPoints(acPt2dArrayBase,  

46、0;                                      dArrayAng,           

47、;                              dColumnOffset * nColumnsCount);           Vector2d acVec2d = acPt2dArrayBa

48、se.GetVectorTo(acPt2dTo);          Vector3d acVec3d = new Vector3d(acVec2d.X, acVec2d.Y, 0);          acEntClone.TransformBy(Matrix3d.Displacement(acVec3d);         

49、  acBlkTblRec.AppendEntity(acEntClone);          acTrans.AddNewlyCreatedDBObject(acEntClone, true);           nColumnsCount = nColumnsCount + 1;          &

50、#160;  / Set a value in radians for 90 degrees      double dAng = Math.PI / 2;       / 跟踪为每列创建的对象      DBObjectCollection acDBObjCollLvls = new DBObjectCollection();       foreach (DBOb

51、ject acObj in acDBObjCollCols)                acDBObjCollLvls.Add(acObj);            /创建其余各行      foreach (Entity acEnt in acDBObjCollCols)  

52、0;             int nRowsCount = 1;           while (nRows > nRowsCount)                     

53、   Entity acEntClone = acEnt.Clone() as Entity;              acDBObjCollLvls.Add(acEntClone);              / 计算新位置       

54、0;        Point2d acPt2dTo = PolarPoints(acPt2dArrayBase,                                  

55、0;          dArrayAng + dAng,                                     

56、0;       dRowOffset * nRowsCount);               Vector2d acVec2d = acPt2dArrayBase.GetVectorTo(acPt2dTo);              Vector3d acVec3

57、d = new Vector3d(acVec2d.X, acVec2d.Y, 0);              acEntClone.TransformBy(Matrix3d.Displacement(acVec3d);               acBlkTblRec.AppendEntity(acEntClone);

58、60;             acTrans.AddNewlyCreatedDBObject(acEntClone, true);               nRowsCount = nRowsCount + 1;           

59、           /保存到数据库      acTrans.Commit();  PS:遇到的问题 因为Autodesk.Autocad.Imon.dll缺失,导致无法运行。三:阵列在CAD中具体实现:阵列是AutoCAD复制的一种形式,在进行有规律的多重复制时,阵列往往比单纯的复制更有优势。在AUTOCAD中,阵列分为最基本的两种:矩形阵列和环形阵列。矩形阵列-进行按多行和多列的复制,并能控制行和列的数目以及行/列的间距。环形阵列-即指定指定环形的中心,用来确定此环形(就是一个圆)的半径。围绕此

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论