




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 四不伤害培训试题及答案
- 初级会计实操试题及答案
- 2024年农艺师考试科学论证试题及答案
- 2024年农艺师考试能力方向试题及答案
- 园艺师考试心理素质培养试题及答案
- 农业考试重点解析试题及答案
- 园艺师重要法规知识试题及答案
- 大学礼仪部面试题及答案
- 2024年农艺师考试生动案例剖析与讨论试题及答案
- 2024年农艺师考试对社会的影响试题及答案
- API SPEC 5DP-2020钻杆规范
- (完整版)有机太阳能电池课件2
- 电梯使用单位电梯使用和运行安全管理制度
- 新中初中课程建设汇报材料
- 乙肝两对半ppt课件
- 锅炉空气预热器拆除安装方案
- 莲中器乐演奏活动方案
- 0730土木工程概论 练习题答案
- 保监〔2005〕22号标准
- 抗震支架力学计算书
- 出纳岗位笔试试题
评论
0/150
提交评论