Conner's profile☆ Conner Wang ☆PhotosBlogListsMore Tools Help

Blog


    September 29

    曲线与曲面的表示

    曲线与曲面
      曲线分为规则曲线拟合曲线(不规则曲线)两大类。所谓规则曲线就是具有确定描述函数的曲线,如圆锥曲线、正弦曲线、渐开线等。由离散点的特征点(或称为型值点)构造函数来描述的曲线称为拟合曲线,也称自由曲线。对于同样的特征点,由于构造函数的方法不同,因而出现了读诸如最小二乘法拟合曲线、三次参数曲线、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样条曲线,并考虑到开放曲线和闭合曲线两种情况。

    September 23

    突然觉得自己太对不住自己

      今天突然觉得自己太对不住自己,觉得自己对自己太吝啬、太苛刻、太没有人情味~~ 哭泣

      我不愿做对不住别人的事,却为什么屡屡委屈自己?悲伤

    判断一个点是在多边形内还是形外

    今天写程序碰到一个几何问题:给定一个多边形的每个顶点的坐标和任意一个点的坐标,如何判断这个点是在这个多边形的内部还是外部?[假设点在多边形的边上也归属为在形内的一种特殊情况]

    我思考了好常时间,最后把这个问题归结为:给定一个三角形的三个顶点的坐标和任意一个点的坐标,如何判断这个点是在三角形内部还是外部?

    我的思路是:先通过对各个顶点求平均,得到一个中心点,这个中心点和每个边组成三角形,只要所给的点在任意一个三角形内,则这个点就在多边形内。

    但是如何判断点在三角形内呢?我问了实验室的好几个人,方法不一,只有阿登的方法比较可行。

    后来咨询了一下老耿,他从网上找到了几种方法。我后来也到网上搜了一下,不看不知道,一看下一跳,方法还真不少,啥样的都有,有的较麻烦,有的较简单,而且还有的跟本就是错的。

    我比较了几种可行的方法,发现下面这种方法是最简单、最可行。

    假设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;
       }
    }

    作者: http://conner-wang.spaces.live.com 转载请注明出处!

    September 21

    买了**人的东西

      首先说明我不是一个种族主义者,在平时我反而会为他们辩护,我一直在尝试用一种平等、宽容的心来对待和看待他们。每当别人在评论他们,说他们的种种不是,我都会在心里辩解道:只是某些或极少数**人比较坏而已。所以别人说什么我从来都不往心里去,我觉得人人生来都是善良的,并且生来都是平等的。

      现在,我心里仍然坚持自己的立场。但是今天发生的事,确实令我很不愉快。当我看到若干个**人聚结在一起,强买强卖,蛮不讲理的时候,我的心里很不舒服。我觉得这些个人野蛮、不讲道理、没素质。

      十几块钱的东西我倒不再乎,但是心里那种被欺骗的感觉却让我久久不能平静。但愿这只是个别现象,我不希望心里仅存的一点宽容和理解也消失殆尽。

    September 18

    粗心的家伙

      本来以为前一阶段的得程序已经写得可以了,没想到今天小朱看我的程序又发现了3处错误,而且都是非常关键的错误,而是能够直接影响程序运行效果的逻辑错误。幸亏有人看我的程序,否则可能到最后我自己跟本发现不了这几个错误。小朱读程序读得很仔细,在此感谢他:)

      另外我以后写程序的时候一定要认真加仔细,不能有个大差不离的结果就以为可以了。有些错误是很难发现的,有可能永远也不会被发现。到时候得到不理想的结果,没准还以为是算法本身的原因呢。

      这两天又得整一个阶段汇报,要用英文。我最不喜欢做文字工作了,又浪费时间和精力,又没有用。可能是我不太善长写东西的原因吧,郁闷!

      两天多没复习了,真是对这次考试越来越没有信心了...

    September 17

    实验室终于可以上网了

      今天吴老师终于给我们三个在五楼的人申请开通了网络,呵呵!终于不用整天往楼下跑了。
      不过虽然能上网了,也为克制住自己,不能老是上网。还要以学习为主嘛~~
      晚上回去把宿舍机器上的一些资料备份过来。
    September 13

    又是开学尹始

       开学一周了,最近一直在忙着编程,有些枯躁。
      大前天刚报了软设,到11月3日就要考了,还没开始复习。从网上买的辅导书今天刚到,要好好看看了。不过由于很紧迫,估计能过的可能性不大,就当作一个系统复习软件基础理论的机会吧。