第四章:计算机图形技术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/stepy走步=△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:线型名dkldylSL(x1,y1)ang(tx,ty)(x2,y2)z虚线生成步骤:①设线段长部分和:dem=0线段长:212212)y(y)x(xSL−+−=②x0=x1,y0=y1dem=dem+dyl若:demSL连线(x1,y1)→(x2,y2)若:demSLtx=x0+dem*cos(ang)ty=y0+dem*sin(ang)连线(x1,y1)→(tx,ty)dem=dem+dkl若:demSL返回若:demSLx1=x0+dem*cos(ang)y1=y0+dem*sin(ang)返回②实线段的终点实线段的起点颜色z取决于光栅扫描系统可以提供的颜色zz点划线直线和直线图形:3.直线图形折线集zPline(n,wpoint)矩形z两点式z点差式矩形网格正多边形标高线尺寸线教材:P56矩形矩形矩形的生成按输入变量分类,有两种形式:z两点式¾已知:两个角点坐标P1、P3;¾矩形与水平轴的夹角ang¾思路:求出P2、P4点的坐标,依次连接P1、P2、P3、P4各点。¾设:Cs=cos(ang),Sn=sin(ang)dx=P3xCs+P3ySn–p1xCs–P1ySndy=–P3xSn+P3yCs+p1xSn–P1yCsP2x=dxCs+p1xP2y=dxSn+p1yP4x=–dySn+p1xP4y=dyCs+p1yP1P2P3P4angangdydxzz点差式点差式¾已知:矩形左下角点坐标P1;边长dx、dy矩形与水平轴的夹角ang¾思路:求出P2、P3、P4点的坐标,依次连接P1、P2、P3、P4各点。#includeaced.h#includerxregsvc.h#includedbents.h#includemath.h//#includegeassign.h#includedbapserv.h#includeadslib.h“voidinitApp();voidunloadApp();voidfirstARX();voiddrawRect();编程绘制点差式矩形ObjectARX头文件声明两个应用函数voidinitApp(){acedRegCmds-addCommand(firstARX_Commands,//命令组名firstARX,//全球命令名第一次,//本地/翻译命令名ACRX_CMD_TRANSPARENT,//命令模式firstARX);//被调用的函数acedRegCmds-addCommand(firstARX_Commands,//命令组名DRAWRECT,//全球命令名“绘制矩形”,//本地/翻译命令名ACRX_CMD_TRANSPARENT,//命令模式drawRect);//被调用的函数}voidunloadApp(){acedRegCmds-removeGroup(firstARX_Commands);}添加了两条命令。voidfirstARX(){ads_alert(这是我的第一个ARX应用程序!);}externCAcRx::AppRetCodeacrxEntryPoint(AcRx::AppMsgCodemsg,void*pkt){switch(msg)//msg参数是AutoCAD传递给应用程序的消息{caseAcRx::kInitAppMsg://解锁应用程序,这样它才能被卸载acrxDynamicLinker-unlockApplication(pkt);acrxRegisterAppMDIAware(pkt);initApp();break;caseAcRx::kUnloadAppMsg:unloadApp();break;default:break;}returnAcRx::kRetOK;}定义应用函数,显示一个提示对话框用于消息处理的主入口点,传递消息到应用程序AcDbObjectIdcreateLine(AcGePoint3dstartPoint,AcGePoint3dendPoint){AcDbObjectIdobjId;AcDbLine*pLine;//初始化一个AcDbLine类的指针AcDbBlockTable*pBlockTable;AcDbBlockTableRecord*pBlock;//打开块表acdbHostApplicationServices()-workingDatabase()-getBlockTable(pBlockTable,AcDb::kForRead);//打开模型空间块表段,获得当前块表记录,并关闭块表pBlockTable-getAt(ACDB_MODEL_SPACE,pBlock,AcDb::kForWrite);pBlockTable-close();//向当前块表记录中添加直线对象pLine=newAcDbLine(startPoint,endPoint);pBlock-appendAcDbEntity(objId,pLine);pBlock-close();pLine-close();//返回直线对象IDreturnobjId;}该函数创建一条直线。AutoCAD图形数据库//Thisiscommand'DRAWRECT'voiddrawRect(){//TODO:ImplementthecommanddoublesideA,sideB,angle;ads_pointpt;AcGePoint3dpoint[4];AcGeVector3dvector1,vector2;//偏移向量//获取基点坐标if(acedGetPoint(NULL,\nBasepoint:,pt)!=RTNORM)return;//输入矩形一边边长if(acedGetDist(pt,\nLengthofoneside:,&sideA)!=RTNORM)return;//输入矩形另一边边长if(acedGetDist(pt,\nLengthofanotherside:,&sideB)!=RTNORM)return;//输入矩形转角if(acedGetAngle(pt,\nAngleofrotation:,&angle)!=RTNORM)return;该函数绘制矩形。//计算坐标vector1.x=sideA*cos(angle);vector1.y=sideA*sin(angle);vector2.x=-sideB*sin(angle);vector2.y=sideB*cos(angle);point[0]=asPnt3d(pt);point[1]=point[0]+vector1;point[2]=point[1]+vector2;point[3]=point[2]-vector1;//绘制矩形createLine(point[0],point[1]);createLine(point[1],point[2]);createLine(point[2],point[3]);createLine(point[3],point[0]);}正多边形:凸多边形已知:边数n外接圆半径R外接圆圆心(x0,y0)起始点与圆心的方向角α各顶点坐标:xi=x0+Rcos(α+i△θ)yi=y0+Rsin(α+i△θ)其中:△θ=2π/nP1P1P2P2P3P3P4P4P5P5P6P6RRα(x0,y0)正多边形:凹多边形已知:P1,P3,P5…为内顶点,位于内接圆上Ps,P2,P4…为外顶点,位于外接圆上外接圆半径R内接圆半径R1nnnnRR2/)2sin((2/)4sin((1ππ−−=PsPsP2P2P1P1P4P4P3P3P5P5注意:z边数范围:n4;z循环次数2n;z角度增量:△θ=π/nz偶数点为外顶角奇数点为内顶角方法:用R1,R分别计算内外顶点,再连线。直线和直线图形4.程序实现明确所要解决的问题;明确已知条件,确定需要输入的原始数据;z输入原则:方便用户,数据必须提示清晰根据问题和条件建立数学模型,找出解决问题的途径和数学关系;程序编制,用计算机语言描述该模型。作业三:用VC语言和ObjectARX编程绘制矩形网格要求:z参照教材(P56)矩形网格的编程步骤z已知:z矩形网格的左下角点P(Px,Py);z矩形边长dx,dy;z网格x和y方向的分格数Nx,Ny;z网格与水平轴的夹角ang。选作题一:选作题一:用VC语言和ObjectARX编程绘制任意正多边形要求:zMypoly(x0,y0,r,n,ang)zx0,y0-----正多边形外接圆圆心坐标;zr-----外接圆半径;zn----正多边形边数;zn0凸多边形;zn0凹多边形;zAng-----起始点与圆心连线的方向角.基本图形生成曲线图形生成曲线方法z曲线插补法(基本算法)z用一系列直段逼近一条曲线1.圆弧圆弧算法z逐点比较法z正负法zDDA法zBresenham法角度DDA法教材:P602.二次曲线参数拟合•已知离散点•求未知曲线•由已知曲线计算更多的点•已知曲线在一区域内逼近•用直线段连接各点内插技术:已知一组离散点,近似画出该曲线需要解决的问题:z确定什么样的未知曲线?z在有限范围内通过离散点的曲线的数学表达式?二次曲线的一般方程二次函数:Ax2+Bxy+Cy2+Dx+Ey+F=0讨论前提z已知:三个型值点P1、P2、P3z构造:一条二次曲线t=0过P1点,且与P1P2相切;t=1过P3点,且与P2P3相切。P1P1P2P2P3P3zzaa00、、aa11、、aa22常数向量常数向量zzee00、、ee11、、ee22为为常数常数22122101)(tetetataatQ++++=)()1()2)(()1)(2()1(')()0('1)1()0(232212121021121211132121010PPLeeeeaaaeeaaQPPKPeaQPeeaaaQPaQ−=+++++−+++=−=−==++++===参数方程将上式对t求导,根据已知条件得到(1)(1)(1)代数