图形处理.ppt
图形处理与CAD 主讲老师:张应中,第一章 概述,1.1 图形处理研究内容1.1.1 图形的分类1.矢量线条图形2.明暗光栅图形,1.1.2 图形处理内容1.将几何模型或数据变成图形 研究和实现建立几何形体的数学模型、计算机的表示、分析和绘制2.图像本身处理及将图像(图形)变成几何数据或几何模型的识别处理 图像处理,将客观世界中原来存在的物体映像处理成新的数字化数据,1.2 计算机图形技术的发展1.20世纪50年代,在美国MIT诞生第一个图形显示器。2.20世纪60年代,美国学者Ivan Sutherland 以博士论文的形式完成第一个真正交互图形系统,开始在大型的飞机、汽车公司使用。3.20世纪70年代,出现基于小型机的CAD/CAM交钥匙系统(turnkey system)。4.20世纪80年代,随着微型计算机和32位工作站的迅猛发展,CAD图形系统向微型计算机和工作站移植和发展。硬件:SGI工作站、SUN工作站、DEC工作站为代表。软件:Unix操作系统,UG、Pro/e、Ideas等三维实体造型软件,Autodesk公司于85年推出基于PC机的AutoCAD1.0版,2.17版。5.20世纪90年代以来,图形技术的发展主要基于Intel和Windows结合的PC机平台,主要有如下特点:(1)图形界面(2)图形处理速度快,硬件成本低,使用更方便(3)三维几何造型技术技术、特征造型技术发展成熟,得到广泛应用。,1.3 计算机图形技术的应用1.计算机辅助设计制造(CAD/CAM)CAD/CAM是图形技术在工业界最重要的应用领域(1)二维工程绘图(2)产品三维实体造型、电子样机(3)可视化动态运动仿真(4)数控自动编程、刀具加工轨迹仿真2.地形地貌和自然资源图(GIS)(1)地图(2)卫星遥感图(3)三维地形模拟,3.计算机动画和艺术(1)工业动画、产品演示(2)游戏(3)电影、电视动画4.用户界面,1.4 计算机图形处理硬件和软件1.4.1 图形处理硬件,1.计算机主机(1)CPU(中央处理器)(2)内部存储器(RAM)(3)外部存储器(硬盘)2.显示处理器(显卡)专门用于图形处理,对许多图形向量计算,可以采用硬件来实现3.显示器 最终产生图形显示效果的部件,包括:阴极射线管(CRT)、液晶、等离子等 阴极射线管包括:随机扫描、存储管式、光栅扫描式。显示器的主要技术指标:(1)分辩率:在显示器的水平和垂直方向的单位长度上能识别的最大光点数(Pixel)。640480,800600,1024768,(2)显示速度,一般用每秒显示矢量线段的条数表示,显示速度取决CRT偏转系统的速度4.图形输入设备(1)向量型图形输入设备 以记录坐标点的方法输入图形,有:数字化仪、鼠标、光笔。数字化仪由一块平板和一个探头组成。数字化仪分为:机械式、超声波式、电磁式。(2)光栅扫描型图形输入设备 采取逐行扫描,按一定密度采用方式输入图形,识别出数据是光栅图像,有:光栅扫描仪、数码相机等。,5.图形绘制设备(1)打印机:针打、喷墨、激光(2)绘图机:笔式绘图仪,有平板式和滚筒式 喷墨绘图仪(打印机),HP喷墨绘图打印机应用最为广泛。技术参数:打印分辩率(dpi):每平方英寸点数。打印幅面:A0A4,滚筒式在长度方向可以打印数米。,1.4.1 图形处理软件1.操作系统软件 Windows,Man2.图形支撑软件 UG,Pro/e,SolidWorks,AutoCAD3.图形开发库 OpenGL,DirectX等。,1.5 本课程讲授的主要内容及特点 综合国内外最新成熟的二维、三维图形处理技术,介绍图形处理的基本原理和常用方法,使学生从机械CAD应用的角度理解计算机图形学的理论,为今后学习各种CAD图形软件、开发与图形相关的软件打下基础。主要内容:图形处理基础、二维图形处理、三维图形处理、产品真实感渲染及动画、图形标准化等。参考书:1.计算机图形学教程,唐荣锡等编著,科学出版社,1991 2.计算机图形学原理、方法及应用,潘云鹤主编,高等教育出版社,20013.机械CAD技术基础,童秉枢,清华大学出版社,20034.面向对象的Windows编程技术,王培杰、张应中等编,大连理工大学出版社,1995,第二章 图形处理基础2.1 图形的几何表示1、直线(Line)参数表达式:R(t)=P+tD-t+P是直线上的一点,D是直线的方向一般直线段用空间中两点表示:起点 StartP 终点 EndP,2、圆(Circle)参数表达式:R(t)=C+rXcos(t)+rYsin(t)0t2 C:圆心点,X、Y为圆所在平面方向轴矢量 r:圆半径 对在XOY平面上的圆:X方向矢量:(1,0,0)Y方向矢量:(0,1,0)圆的一般定义:圆心点,圆所在平面的方向矢量,圆所在平面的参考方向矢量,圆半径,区域在02。圆弧是圆的一部分,通过区域参数控制,如在第一象限的圆弧,区域在00.5。,3、椭圆(Ellipse)参数表达式:R(t)=C+aXcos(t)+bYsin(t)0t2C:圆心点,X、Y为圆所在平面方向轴矢量 a:长轴半径,b:短轴半径 椭圆的一般定义:圆心点,圆所在平面的方向矢量,圆所在平面的参考方向矢量(一般选长轴方向),长轴半径,短轴半径,区域在02。椭圆弧是椭圆的一部分,通过区域参数控制,如在第一象限的圆弧,区域在00.5。,4、B样条曲线(B-Spline)(1).样条和样条函数样条(Spline):是在船体、汽车或航天器设计中设计员使用的弹性均匀的木条(或钢 条)。沿着样条画出的光顺曲线是样条曲线。1946年I.J.Shoenberg提出样条函数的概念,并给出严格的数学定义。由弹性力学得到梁的曲率与弯距成正比,与梁的抗弯刚度成反比,有:,分段弯距M(x)是一个线性函数,积分后所得各分段上的函数y(x)是x的三次多项式。这一力学背景导致了数学上得三次样条函数得建立。(2).三次样条曲线 已知n个型值点Pi(xi,yi),i=1,2,n,如何建立y=S(x)?Si(x)=ai+bi(x-xi)+ci(x-xi)2+di(x-xi)3 xxi,xi+1,i=1,2,n ai,bi,ci,di为待求系数 根据型值点的关系式(如一阶导数连续、二阶导数连续),边界条件可以推导出三次样条曲线的矩阵表达式。(3).Bezier曲线 在设计时,样条曲线不直观,修改不方便,Bezier提出一种新的参数曲线表示方法,称为Bezier曲线,Bezier曲线形状是通过一组多边折线的各顶点唯一定义出来。在多边折线的各顶点中,只有第一点和最后一点在曲线上,其余顶点则用于定义曲线的导数、阶次和形状,第一条和最后一条折线表示出曲线在起点和终点处的切线方向。,Bezier曲线数学表达式:给定n+1个点P0,P1,P2Pn,有下列n次Bezier曲线:Bi,n为伯恩斯坦(Bernstein)多项式,称为基底函数。,当t=0时,P(0)=P0,当t=n时,P(n)=Pn,曲线通过多折线的起点和终点。Bezier曲线P(t)与控制多边型的关系可以这样认为:控制多边形P0P1Pn是P(t)的大致形状的勾画,P(t)是对P0P1Pn的逼近。Bezier曲线的离散生成通过中点分割递推生成的。Bezier曲线在实际中有很好的应用,例如TrueType字体。,(4).B样条(Basic Spline 或B-Spline)设P1,P2,Pn(nk)为给定空间的n个点,T=ti(titi+1)为参数t轴上的一个分割,下列参数曲线 为k阶(k-1)次的B样条曲线,折线P1P2Pn为P(t)的控制多边形,点集Pi为P(t)的控制顶点。Bi,k(t)为k阶B样条基函数,且有:,因此P(t)值可以通过递推关系求得,是著名的deBoor算法。deBoor算法是将B样条曲线转化为若干条Bezier曲线生成问题。一次B样条是折线样条,重合多边形,在实际应用中,用的最多的是三次B样条。三次B样条曲线的构造:(1)输入大于等于四个空间点作为控制点,求出B样条曲线。(2)输入B样条曲线上的三个型值点,求出B样条曲线,实际上是一个反问题。也就是已知型值点,要找一条三次B样条曲线L通过各Pi点,解代数方程求出控制顶点,再插值出样条曲线。三次B样条曲线计算算法步骤:(1)计算各节点矢量(采用弦长法)。(2)计算插值的步数及步长。(3)取连续四个控制顶点及相应的节点矢量,根据前面的递推关系,计算三层系数值 得到插值的P(t)值,(4)将计算得到的P(t)值与上一步长计算的P(t)值用直线连接。,计算节点矢量void CSplineCons:CalculateKnotNormal()if(numCtrlPts3)return;pKnotVal=new doublenumCtrlPts+3;for(int i=0;i4;i+)pKnotVali=0.;double u=PtPtDis(pCtrlPoints0,pCtrlPoints1);/两点距离for(i=1;inumCtrlPts-1;i+)u=u+PtPtDis(pCtrlPointsi,pCtrlPointsi+1);pKnotVali+3=u;for(i=1;inumCtrlPts-1;i+)pKnotVali+3=pKnotVali+3/u;for(i=numCtrlPts-1;inumCtrlPts+3;i+)pKnotVal3+i=1.;,void CSplineCons:DrawCurve(CDC*pDC,VportParameter Vps)if(numCtrlPts3)return;double a42,b32,c22,d2;double ui6,a13,a22,a3;double u=0.0;double deta=10.0;int i,j,s;int m;double step;VpMoveTo(pDC,pCtrlPoints0.x,pCtrlPoints0.y,Vps);/计算步数和步长m=LineNum*numCtrlPts;if(m36)m=36;step=1.0/m;/画B样条曲线 int ip=0;int ik=1;,for(s=0;s1.0)break;/判断ui是否应该变为ui+1double bijiao=u-pKnotValik+3;while(bijiao0)ip+;ik+;bijiao=u-pKnotValik+3;VpLineTo(pDC,pCtrlPointsnumCtrlPts-1.x,pCtrlPointsnumCtrlPts-1.y,Vps);,2.2 图形的特性表示1.颜色 在计算机中表示颜色主要方法是RGB三元组:将红色值R(Red)、绿色值G(Green)、篮色值B(Blue)三种颜色组合出一个无符号的长整数(四字节32位)表示图形颜色。每个颜色域定义0255色彩浓度,这样组合起来有一千六百多万种颜色,在Windows中,一般采用一个宏表示:COLORREF rgbColor=RGB(nRed,nGreen,nBlue)例:RGB(0,0,0)表示黑色,RGB(255,255,255)表示白色,RGB(255,0,0)表示红色。,2.线型 在工程图纸中,线型是有非常明确的表达意义的,国家制图标准定义了如下图线:(1)粗实线,应用在可见的轮廓线(2)细实线,应用在尺寸线、剖面线等(3)细点画线,应用在轴线、圆中心线,对称中心线等(4)虚线,应用在不可见的轮廓线(5)细双点画线,应用在极限位置、假设状态轮廓线等。线型一般通过建立线型库,对线型建立一个文本描述的方式定义,这样用户可以方便地加载、修改线型。AutoCAD定义了一个线型库文件:ACAD.LIN AutoCAD线型描述定义方式:alignment,dash-1,dash-2,Alignment是一个对准动作,一般用“A”,Dash-n表示构成线型的一个线段长度,如果长度是正值,就是落笔,也就是画的线段,负长度值是抬笔,即空白线段,长度为0,画一个点,不断循环,只需定义一个循环段。例如定义一虚线线型:*DASH,-A,2,-13.图层定义:根据图形实体本身所具有的属性(颜色、线型)和其它应用特性等信息对实体进行分类,将具有相同信息的实体放在一组,该组称为图层。图层具有如下特性:(1)图层具有层名、颜色、线型和状态参数。(2)一幅图上具有的图层数目不受限制,每个图层具有的图形实体数目也不受限制。(3)图层有状态参数:打开和关闭、冻结和解冻,打开和关闭决定图形实体的可见性,冻结和解冻决定图形实体的可编辑性。(4)可以将一个图层上的实体转换到另一个图层上。图层是对图形实体特性进行组织的有效方法,主要有如下功能操作:,(1)创建新层(2)将已有层置为当前层(3)打开和关闭图层(4)冻结和解冻图层(5)设置图层属性(颜色、线型、线宽),2.3 基于Windows GDI的图形绘制2.3.1 基本图形的生成 基本图形包括:直线、圆、圆弧。传统(底层)的生成方法:(1)采用汇编语言利用BIOS中断(INT10)输出功能,编制显示器的置点功能,或用C语言函数库中的显示器置点功能。(2)采用Bresenham算法,将直线离散成一个连续的光点。目前一般图形绘制方法:(1)基于Windows GDI的图形绘制。(2)基于OpenGL的图形绘制。2.3.2 Windows GDI1、什么是GDI?GDI就是图形设备接口(Graphic Device Interface)。2、GDI的功能特点:(1)设备无关 两个含义:一是同一图形输出功能,应用程序在不同输出设备上输出时,使用同一GDI函数。,另一个是为某一种类型的设备编制的程序同样可以在另一种类型的设备上使用。设备无关的实现:GDI绘图是在逻辑设备下绘图,通过设备驱动程序将逻辑绘图变为实际设备绘图。3、GDI设备描述表(DC:Device Context)设备描述表是应用程序、设备驱动程序和输出设备之间的连接器,为GDI正确地产生图形提供必要信息。(1)主要功能:描述图形绘制的特性(工具、颜色、字体等)、图形绘制的方式、图形绘制的区域等。DC与特定设备相连,当设备描述表(DC)占用设备期间,其它设备不能使用此设备,因此当程序使用完DC后,一定要释放DC。(2)设备表类型:普通、类的、私有和窗口四种类型 普通:系统窗口默认,可在窗口用户区内绘图。类的:当窗口指定了CS_CLASSDC风格,Windows就专门为窗口分配一个类的DC。私有:当窗口指定了CS_OWNDC风格,Windows就专门为窗口分配一个私有DC。,窗口:在窗口内的任何地方绘图,包括标题栏、菜单栏等。主要用于窗口的非客户区绘 图。(3)设备描述表的获取和释放 GetDC(HWindow)ReleaseDC()4、逻辑绘图对象 笔、刷子、字体、坐标单位等2.3.3 在窗口里画图 GDI绘图主要有两种:线条:直线、折线、椭圆形线、Beizer曲线 填充图:在一封闭区域内填上一定颜色的图形1、直线(1)LineTo函数 LineTo(hDC,xEnd,yEnd);hDC:设备描述表句柄,xEnd,yEnd 画线到点坐标。一般和MoveTo函数一起使用。,例如画一条从点(x1,y1)到(x2,y2)的直线:MoveTo(hDC,x1,y1);LineTo(hDC,x2,y2);如连续折线,可以连续调用LineTo函数。(2)Polyline 函数 画有许多点的多边形时,可用此函数。Polyline(hDC,lpPoints,nCount);lpPoints:包含点数组指针,数组中点是一个POINT结构 struct POINT x;y;nCount:点的个数 例:绘制(0,0),(10,0),(10,30)组成的三角形 POINT pt=0,0,10,0,10,30,0,0;Polyline(hDC,pt,4);,2、画填充图 填充图是边界封闭的几何图形,包括两个部分:内部区域和区域边界,区域边界是线条,由笔决定,内部区域由刷子决定。(1)Polygon函数 绘制多边形填充 Polygon(hDC,lpPoints,nCount);和前面介绍的Polyline 函数相似,区别在输出的结果不同。(2)Rectangle函数 绘制矩形填充 Rectangle(hDC,x1,y1,x2,y2);(x1,y1)是矩形的一个角,(x2,y2)是矩形的另一个角(3)Ellipse函数 绘制圆填充 Ellipse(hDC,x1,y1,x2,y2);(x1,y1)是椭圆外接矩形的一个角,(x2,y2)是椭圆外接矩形的另一个角。,2.3.4 绘图属性1、绘图坐标系 绘图坐标系决定如下绘图方式:(1)绘图单位:逻辑单位与实际设备单位间的关系。(2)绘图方向轴,X轴方向,Y轴方向。(3)绘图原点位置。在GDI中,通过设置绘图映像模式设置绘图坐标系,GDI有8种映像模式:(1)MM_TEXT 一个逻辑单位映像成一个像素,原点在窗口左上角,x轴朝右,y轴朝下,与文本方式一致,也是缺省方式。(2)MM_LOMETRIC 一个逻辑单位映像成0.1毫米,原点在窗口左下角,x轴朝右,y轴朝上。(3)MM_HIMETERIC 一个逻辑单位映像成0.01毫米,原点在窗口左下角,x轴朝右,y轴朝上。(4)MM_ISOTROPIC 一个逻辑单位映像成任意的物理单位,x轴上的一个单位与y轴上的一个单位相等。具体的比例因子及方向,用两个矩形区域:窗口和视口推导(后续介绍)。,映像模式的设置:SetMapMode(nMode);设置指定映像模式 GetMapMode();获取当前映像模式例如:SetMapMode(MM_LOMETRIC);2、笔 笔是画线的重要属性,笔决定了线的颜色、宽度和线型。(1)库存笔 系统库中预定义3支笔:一支黑笔、一支白笔、一支无色笔。可以用函数 GetStockObject选取其一,例如:HPEN hPen=GetStockObject(nIndex);SelectObject(hDC,hPen);nIndex:BLACK_PEN 黑色笔,WHITE_PEN 白色笔 NULL_PEN 无色笔 获得笔句柄后,要将其装入到设备描述表中,并且在DC中只能有一支笔,注意替换。(2)创建新笔 hPen=CreatePen(nPenStyle,nWidth,crColor);nWidth:笔的宽度,逻辑单位 crColor:笔的颜色,RGB定义 nPenStyle:笔型(线型),有如下线型:,类型 值 描述PS_SOLID 0 实线PS_DASH 1 虚线PS_DOT 2 点线PS_DASHDOT 3 点划线PS_DASHDOTDOT 4 双点划线例如:hPen=CreatePen(PS_SOLID,2,RGB(255,0,0);(3)笔释放 DeleteObject(hPen);笔用完后,程序应将创建的笔删除,Windows不能自动删除,如不删除将永久占有资源。3、刷子 刷子描述填充图区域内部填充的重要属性,决定填充图内部填充区域的类型、颜色。(1)库存刷子 系统库中预定义6个刷子:黑色刷、白色刷、灰色刷、浅灰色刷、深灰色刷、无色刷。可以用函数 GetStockObject选取其一,例如:HBRUSH hBrush=GetStockObject(nIndex);SelectObject(hDC,hBrush);nIndex:BLACK_BRUSH 黑色刷,WHITE_BRUSH 白色刷,NULL_BRUSH 无色刷 LTGRAY_BRUSH 浅灰色刷,DKGRAY_BRUSH 深灰色刷,GRAY_BRUSH 灰色刷 获得刷子句柄后,要将其装入到设备描述表中,并且在DC中只能有一个刷子,注意替换。(2)创建新刷子()创建各种颜色的实心刷子 hBrush=CreateSolidBrush(crColor);,可以用函数 GetStockObject选取其一,例如:HBRUSH hBrush=GetStockObject(nIndex);SelectObject(hDC,hBrush);nIndex:BLACK_BRUSH 黑色刷,WHITE_BRUSH 白色刷,NULL_BRUSH 无色刷 LTGRAY_BRUSH 浅灰色刷,DKGRAY_BRUSH 深灰色刷,GRAY_BRUSH 灰色刷 获得刷子句柄后,要将其装入到设备描述表中,并且在DC中只能有一个刷子,注意替换。(2)创建新刷子()创建各种颜色的实心刷子 hBrush=CreateSolidBrush(crColor);,crColor:颜色的RGB值例如创建一个红色刷子:hBrush=CreateSolidBrush(crColor);()创建各种阴影图案的刷子 hBrush=CreateHatchBrush(nIndex,crColor);nIndex指定刷子的阴影类型:HS_HORIZONTAL:水平线组成 HS_VERTICAL:垂直线组成 HS_BDIAGONAL:45度向下斜线 HS_FDIAGONAL:45度向上斜线,2.3.5 GDI绘图应用举例 HDC hDC=GetDC(Hwindow);HPEN hPen=CreatePen(PS_SOLID,2,RGB(0,0,255);HPEN hOldPen=SelectObject(hDC,hPen);HBRUSH hBrush=CreateSolodeBrush(RGB(0,255,0);HBRUSH hOldBrush=SelectObject(hDC,hBrush);SetMapMode(MM_LOMETRIC);MoveTo(hDC,0,0);LineTo(hDC,50,0);LineTo(hDC,50,50);LineTo(hDC,0,0);Ellipse(hDC,200,200,300,100);SelectObject(hDC,hOldPen);SelectObject(hDC,hOldBrush);DeleteObject(hPen);,DeleteObject(hBrush);ReleaseDC(Hwindow,hDC);,