计算机图形学

计算机图形学 编辑 | 删除 | 权限设置 | 更多▼ 设置置顶 推荐日志 转到私密记事本 转载自 水月洞天 转载于2009年03月24日 12:06 阅读(3) 评论(0) 分类: 个人日记 权限: 公开 曲线与曲面的表示 曲线与曲面   曲线分为规则曲线和拟合曲线(不规则曲线)两大类。所谓规则曲线就是具有确定描述函数的曲线,如圆锥曲线、正弦曲线、渐开线等。由离散点的特征点(或称为型值点)构造函数来描述的曲线称为拟合曲线,也称自由曲线。对于同样的特征点,由于构造函数的方法不同,因而出现了读诸如最小二乘法拟合曲线、三次参数曲线、Bezier曲线、B样条曲线等众多曲线。   曲面也分为规则曲面和拟合曲面(不规则曲面)两大类。规则曲面就是具有确定描述函数的曲面,如圆柱、圆锥、圆球等回转曲面、螺旋曲面等。由离散特征点构造函数来描有述的曲面称为拟合曲面,也称自由曲面。如Coons曲面、Bezier曲面、B样条曲面等。 插值与逼近   给定一组有序的数据点Pi, i=0,1,...n, 这里的数据点可以是通过实验、测量或计算得到的。要求构造一条曲线经过这些数据点,称为对这些数据点进行插值(interpolation),所构成的曲线称为插值曲线,这些数据点若原来位于某曲线上,则称该曲线为被插曲线。构造插值曲线所采用的数学方法称为曲线插值法。把曲线插值推广到曲面,类似地就有插值曲面、被插曲面与曲面插值法的概念。   在某些情况下,实验、测量或计算得到的数据点本身就很粗糙,要求构造一条曲线严格通过给定的一组数据点就没有什么意义。更为合理的做法是,构造一条曲线使之在某种意义下最为接近给定的数据点,称之为对这些数据进行逼近(approximation),所构造的曲线称为逼近曲线。这些数据点若原来位于某条曲线上,则称该曲线为被逼曲线。构造逼近曲线所采用的数学方法称为曲线逼近法。类似地可将曲线逼近推广到曲面。   插值与逼近统称为拟合。 Bezier曲线   Bezier曲线是法国雷诺汽车公司工程师Bezier于1962年创立的。Bezier的方法是用折线组成的多边形来定义一条曲线,设计者先用折线多边形描绘这条曲线的大致轮廓,再用Bezier曲线的表达式产生一条光滑的曲线。若达不到要求再改变多边形顶点位置,直到构造出满意的曲线为止。因此,Bezier曲线直观、形象,数学方法简便。   Bezier曲线虽然有很多优点,但也有一些不容忽视的缺点。如修改一个顶点会影响整段曲线的形状,局部修改力差;Bezier曲线离特征多边形较远,逼近性不是很好;特征多边形顶点增多时,曲线阶次增高,给计算带来不便。 B样条曲线   20世纪70年代初期,Riesenfeld等人受到Bezier方法的启示,把B样条函数作一拓展,从而形成了B样条曲线。B样条曲线继承了Bezier曲线的优点,同时又克服了其缺点,已成为目前在CAGD(计算机辅助几何设计)中最受设计者欢迎的工具。 由于构造B样条曲线时所采用的基函数不同,B样条有多种,如均匀B样条、非均匀B样条、均匀有理B样条、非均匀有理B样条(Non-Uniform Rational B-Spline, NURBS)等。   均匀B样条曲线中的B样条函数采用等距参数节点,由此形成的B样条曲线具有简单、直观、易用的特点。通常所说的B样条函数多数是指均匀B样条曲线。   NURBS正日益受到设计人员重视,其特点是可用统一的数学形式精确表示分析曲线(如直线、圆锥曲线等)和自由曲线(如均匀B样条曲线等),因而便于用统一的数据库管理、存储,程序量大减少;NURBS定义中的权因子使外形设计理加灵活,设计人员通过调整具有几何意义的点、线、面元素即可达到预期的效果。鉴于NURBS的强大功能,1991国际标准化组织(ISO)正式颁布了工业产品几何定义的STEP标准,其中,自由曲线、曲面惟一地用NURBS表示。   在做轮廓跟踪的项目时,为了算法的简便有效,采用均匀B样条曲线,并考虑到开放曲线和闭合曲线两种情况。 判断一个点是在多边形内还是形外 今天写程序碰到一个几何问题:给定一个多边形的每个顶点的坐标和任意一个点的坐标,如何判断这个点是在这个多边形的内部还是外部?[假设点在多边形的边上也归属为在形内的一种特殊情况] 我思考了好长时间,最后把这个问题归结为:给定一个三角形的三个顶点的坐标和任意一个点的坐标,如何判断这个点是在三角形内部还是外部? 我的思路是:先通过对各个顶点求平均,得到一个中心点,这个中心点和每个边组成三角形,只要所给的点在任意一个三角形内,则这个点就在多边形内。 我比较了几种可行的方法,发现下面这种方法是最简单、最可行。 假设O是所给的任意点,其实就是判断这三个条件是否同时成立: O,C是否在AB同侧? O,A是否在BC同侧? O,B是否在AC同侧? 如何判断O,C是否在AB同侧呢?我采用的方法是:先利用AB所在直线的两点式求出该直线的一般式Ax+By+C=0,然后分别将点O和点C的坐标代入该式左边即Ax+By+C,只要所得结果同号即可,即判断该条件是否成立:(Axo+Byo+C)*(Axc+Byc+C)>=0? C++结合OpenCV的实现如下: BOOL pointTriangleTest(CvPoint2D32f point0, CvPoint2D32f point1, CvPoint2D32f point2, CvPoint2D32f pointX) { double A1 = point1.y-point0.y; double B1 = point0.x-point1.x; double C1 = point1.x*point0.y-point0.x*point1.y; double A2 = point2.y-point1.y; double B2 = point1.x-point2.x; double C2 = point2.x*point1.y-point1.x*point2.y; double A3 = point0.y-point2.y; double B3 = point2.x-point0.x; double C3 = point0.x*point2.y-point2.x*point0.y; if( (A1*pointX.x+B1*pointX.y+C1)*(A1*point2.x+B1*point2.y+C1)>=0 && (A2*pointX.x+B2*pointX.y+C2)*(A2*point0.x+B2*point0.y+C2)>=0 && (A3*pointX.x+B3*pointX.y+C3)*(A3*point1.x+B3*point1.y+C3)>=0 ) { return TRUE; } else { return FALSE; } }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值