土木工程CAD技术基础第四章:计算机图形技术
清华大学土木工程系
张建平
第四章:计算机图形技术
4-1基本图形生成
4-2图形几何变换
4-3图形显示处理
4-4 工程绘图程序设计
4-1 基本图形生成
常用的坐标系 用户坐标系
z用户描述或输入图形的坐标系
z一般取直角坐标系,取值范围是实数域,单位是任意的。
设备坐标系
z图形设备输出图形的坐标系
z一般为二维坐标,取值范围是某一个整域,常用单位是光栅单位和脉冲当量。
规格化坐标系
z虚拟的坐标系,与设备无关,
通常取无量纲单位。
基本图形元素
矢量图形
z以直线段作为基本元素
z矢量图形生成器:
随机扫描显示器
笔式绘图仪
光栅图形
z以点作为基本元素
z光栅图形生成器:
光栅扫描显示器
静电绘图仪和喷墨绘图仪
直线和直线图形
1. 生成直线的基本算法
问题的提出
z笔式绘图仪: 任意一条斜直线,是由x, y方向的直线组合成的阶梯线来近似。
直线由什么样的阶梯线近似?画笔的每一步方
向如何确定?
z光栅扫描显示器: 显示任意一条直线,是确定发亮的象素点最佳逼近直线。
如何选择发亮的象素最佳逼近直线?
----取决于生成直线的基本算法
----取决于生成直线的基本算法
基本原理:“增量法”
z产生x 和y 两个方向的“走步”信号,据此指示电子束偏移或绘图笔动作。
x走步=△x/step
y走步=△y/step
其中:△x, △y ----直线起始点到终止点x, y方向上的位移量;
step ----设备的单位步长。
各种方法的不同点
z判断、生成x, y信号的过程和方法不同
z发送的命令不同
z各自更为适应的设备对象不同
生成直线的常用算法
z笔式绘图仪——逐点比较法、正负法;
z光栅扫描显示器——DDA法、Bresenham法对称DDA法简单DDA法
直线和直线图形
2.直线的属性 线宽
z直线的宽度一般是在设备坐标下定义
z把设备能产生的最小直线宽度作为基准,再定义二倍宽或四倍宽的直线。
线型
z长度定义一般在用户坐标系下进行
Tline( x1, y1, x2, y2, dy1, dk1,lt)
dy1:实线长度、dk1:虚线长
度
lt:线型名
dkl d yl SL
(x 1, y 1 )
ang (tx,ty )( x 2, y 2 )
z 虚线生成步骤:
①设线段长部分和:
dem = 0线段长:21
2212)y (y )x (x SL ?+?=
②x
0 =
x1,y0= y1 dem= dem+ dyl 若: dem> SL连线(x
1
, y1 ) →(x2, y2 )
若: dem + dem* cos(ang) ty= y0+ dem*sin(ang) 连线(x 1 , y1 ) →(tx, ty) dem=dem+dkl 若: dem> SL返回 若: dem< SL x 1 =x0+dem * cos(ang) y1=y0+dem * sin(ang)返回②实线段的终点实线段的起点 z点划线 颜色 z取决于光栅扫描系统可以提供的颜色 直线和直线图形: 3. 直线图形 折线集 z Pline(n, wpoint) 矩形 z两点式 z点差式 矩形网格 正多边形 标高线 教材:P56 尺寸线 矩形 矩形的生成按输入变量分类,有两种形式:z两点式 ?已知:两个角点坐标P1、P3; ?矩形与水平轴的夹角ang ?思路:求出P2、P4点的坐标,依次连接P1、 P2、P3、P4各点。 ?设:Cs = cos(ang),Sn= sin(ang) dx= P3x C s+P3y S n–p1x C s –P1y S n dy= –P3x S n+P3y C s +p1x S n –P1y C s P2x = dx C s +p1x P2y= dx S n+p1y P4x = –dy S n+p1x P4y= dy C s +p1y P 1 P 2 P 3 P 4 ang dy dx z 点差式 ?已知:矩形左下角点坐标P 1; 边长dx 、dy 矩形与水平轴的夹角ang ?思路:求出P 2、P 3、P 4点的坐标,依次连 接P 1、P 2、P 3、P 4各点。 #include #include #include "dbents.h" #include "math.h" //#include "geassign.h" #include "dbapserv.h" #include "adslib.h “ void initApp(); void unloadApp(); void firstARX(); void drawRect();编程绘制点差式矩形 ObjectARX 头文件声明两个应用函数 void initApp() { acedRegCmds->addCommand("firstARX_Commands",//命令组名 "firstARX",//全球命令名 "第一次",//本地/翻译命令名 ACRX_CMD_TRANSPARENT,//命令模式 firstARX);//被调用的函数 acedRegCmds->addCommand("firstARX_Commands",//命令组名 "DRAWRECT",//全球命令名 “绘制矩形”,//本地/翻译命令名ACRX_CMD_TRANSPARENT,//命令模式 drawRect);//被调用的函数 } void unloadApp() { acedRegCmds->removeGroup("firstARX_Commands");} 添加了两条命令。 void firstARX() { ads_alert("这是我的第一个ARX应用程序!"); }extern "C" AcRx::AppRetCode acrxEntryPoint(AcRx::AppMsgCode msg, void* pkt) { switch (msg) //msg参数是AutoCAD传递给应用程序的消息{ case AcRx::kInitAppMsg://解锁应用程序,这样它才能被卸载 acrxDynamicLinker->unlockApplication(pkt); acrxRegisterAppMDIAware(pkt); initApp(); break; case AcRx::kUnloadAppMsg: unloadApp(); break; default: break; } return AcRx::kRetOK; 定义应用函 数,显示一个 提示对话框 用于消息处理的主入口点,传递消息到应用程序 AcDbObjectId createLine(AcGePoint3d startPoint, AcGePoint3d endPoint){AcDbObjectId objId; AcDbLine *pLine;//初始化一个AcDbLine 类的指针AcDbBlockTable *pBlockTable;AcDbBlockTableRecord *pBlock; //打开块表 acdbHostApplicationServices()->workingDatabase()-> getBlockTable(pBlockTable,AcDb::kForRead); //打开模型空间块表段,获得当前块表记录,并关闭块表 pBlockTable->getAt(ACDB_MODEL_SPACE, pBlock, AcDb::kForWrite);pBlockTable->close(); //向当前块表记录中添加直线对象 pLine = new AcDbLine(startPoint, endPoint); pBlock->appendAcDbEntity(objId, pLine); pBlock->close(); pLine->close(); //返回直线对象ID return objId; } 该函数创建一条直线。AutoCAD 图形数据库 // This is command 'DRAWRECT' void drawRect(){// TODO: Implement the command double sideA, sideB, angle; ads_point pt; AcGePoint3d point[4]; AcGeVector3d vector1, vector2;//偏移向量 //获取基点坐标 if(acedGetPoint(NULL, "\nBase point: ", pt) != RTNORM) return; //输入矩形一边边长 if(acedGetDist(pt, "\nLength of one side: ", &sideA) != RTNORM) return; //输入矩形另一边边长 if(acedGetDist(pt, "\nLength of another side: ", &sideB) != RTNORM) return; //输入矩形转角 if(acedGetAngle(pt, "\nAngle of rotation: ", &angle) != RTNORM) return; 该函数绘制矩形。