精华内容
下载资源
问答
  • 二维表

    千次阅读 2013-04-25 21:39:53
    关系模型中,数据结构表示为一个二维表一个关系就是一个二维表(但不是任意一个二维表都能表示一个关系),二维表名就是关系名。表中的第一行通常称为属性名,表中的每一个元组和属性是不可再分的,且元组的...
    在关系模型中,数据结构表示为一个二维表,一个关系就是一个二维表(但不是任意一个二维表都能表示一个关系),二维表名就是关系名。表中的第一行通常称为属性名,表中的每一个元组和属性都是不可再分的,且元组的次序是无关紧要的。
    
      常用的关系术语如下:
      记录 二维表中每一行称为一个记录,或称为一个元组。
      字段 二维表中每一列称为一个字段,或称为一个属性。
      域 即属性的取值范围。 
      关键字 在一个关系中有这样一个或几个字段,它(们)的值可以唯一地标识一条记录,称之为关键字(Key)。例如,在学生关系中,学号就是关键字。
      关系模式 对关系的描述称为关系模式,其格式为:
      关系名(属性名1,属性名2,…,属性名n)
      一个关系模式对应一个关系的结构,它是命名的属性集合。
    展开全文
  • 在数据仓库的建模时,会遇到具有层次结构的维度,对于这样的有一种建模方式是建立父子,即每条记录上包括一个指向其父记录的字段。这种父子的建立在层级深度可变时尤其有用,是一个紧凑而有效的建模方式。...


    桥接表(Bridge Table)是维度建模中的一类比较特殊的表。

    在数据仓库的建模时,会遇到具有层次结构的维度表,对于这样的表有一种建模方式是建立父子表,即每条记录上包括一个指向其父记录的字段。这种父子表的建立在层级深度可变时尤其有用,是一个紧凑而有效的建模方式。但是这种建模方式也有缺点,就是用标准SQL很难对递归结构进行操作。有时事实表必须在最低粒度上支持带有多个值的维。如果无法改变事实表的粒度来直接支持该维,那么该多值维就必须通过一个桥接表连接到事实表。当遇到事实行的多值关系时,ETL系统既可以将每个观察值集合作为一个单独的分组,也可以在出现了相同的观察值集合时重用分组。遗憾的是,无法简单地确定出哪一种选择才是正确的。当多值维具有类型2属性时,桥接表必须是时变的。桥接表构造包含了一个加权因子,用于支持从桥接表进行加权报表生成。很多情况下,加权因子都是一种熟悉的分配因子,但是在另一些情况下,很难给出恰当的权重因子,因为指定加权因子并没有合理的基础。

    与这种递归结构的父子表不同,桥接表采用不同的建模方式也可以表示这种层级结构。桥接表是建立在维度表和事实表中间的一个具有较多冗余信息的表,其中的记录包含层级结构中节点到其下面每个节点的路径。


    表结构如下所示:

    父关键字

    子关键字

    父层数

    层名

    底端标识

    顶端标识                                                     

    在桥接表中,节点与其下面的任意一个节点都建立一个关联记录保存在表中,即父子关系不再局限在相邻层,如第一层与第三层同样有父子关系,通过父层数可以区分相隔了几层。这样,可以通过父层数和父子关系来进行层级结构的查询。

    场景:销售组织结构维表和销售记录事实。由于组织是有层级的,带来问题就是一条销售记录对应多个不同层的组织层级。

    解决方式:ETL要先把组织层级打平到最细粒度,使事实表只只与最细粒度相关。

    未解决场景:一本书的多个作者,每个作者是单独的维表。

    如何解决?

    把事实表拆分,标注第一第二作者。


    当然,桥接表也不是一个完备的解决方案,它只能是在某些情况下是查询变得容易。




    展开全文
  • 对于赛题A《 CT系统参数标定及成像》中的CT系统参数标定,经过将问题进一步的提炼,问题最终变成了在平面二维空间中对任意椭圆进行拟合的问题,笔者花了大概四小时的时间建立了该问题的数学公式表达、并推导出了...

             在刚刚过去的2017全国大学生数学建模比赛中,笔者有幸指导了一组本科学生参赛。对于赛题A《 CT系统参数标定及成像》中的CT系统参数标定,经过将问题进一步的提炼,问题最终变成了在平面二维空间中对任意椭圆进行拟合的问题,笔者花了大概四个小时的时间建立了该问题的数学公式表达、并推导出了求解该问题的算法、同时编写了实现该算法的Matlab程序。整个过程一气呵成,没有一丝的错误,当时就把我震惊了,本来以为会出很多的问题,但是当我编写完代码按下F5的那一刻,出来的结果和我之前预想的一模一样,为了更进一步的验证算法的正确性后续又做了很多的测试,结果表明算法完全正确。那一刻我真的感受到了自己平时公式推导的严谨态度和规范代码编写带来的巨大效率的提升。

    公式推导

          好了,闲话不多说了,进入正题,我们通常见到的椭圆表达式是这样的:

          

        这种表达式称为椭圆的标准表达式,即其长短轴分别和坐标轴平行,且中心在坐标原点,但是更一般的椭圆其长短轴不是和坐标轴平行的,且中心也不在原点。我们将上式中的椭圆以坐标原点为旋转中心逆时针旋转θ,得到如下表达式:


    展开得:


    令:



    则有:


    此表达式表明此时的椭圆的长短轴已不再和坐标轴平行,但其中心仍在原点,接下来我们将其中心移至点(x_0,y_0)得到:


    展开得:


    令:


    则得到椭圆的一般式:


        从这里我们就可以看到,我们只需要确定参数g, c, d, e, f就可以得到椭圆的中心(x_0,y_0)、旋转角度θ、及长短轴a和b。
        我们可以看到当知道了椭圆上的五个点的坐标后,我们就可以列出一个五元一次方程组,然后求得g, c, d, e, f。然而在实际应用中我们往往得到的数据点是大于5的因此列出的方程是一个超定方程,没有唯一解。但是我们可以求出它的最小二乘解。具体的过程如下:
        设已知椭圆上N个点的坐标的检测值(x_i,y_i) (含有检测误差),i=1,2,•••,N,将每组检测值(x_i,y_i)代入上式,则有方程误差ε_i,即:


        方程误差ε_i是由于对椭圆上点的坐标的检测误差引起的,通常N远大于5。最小二乘法原理就是用极小化方程误差的平方和来确定未知椭圆模型参数(g, c, d, e, f),即他们的极小化性能指标


    由极值原则,置


    即:


    令:



    带入上式化简得:

    通过求解上述方程从而求得最小二乘意义上的参数(g, c, d, e, f),进而通过关系式:


    求得椭圆的中心(x_0,y_0)、旋转角度θ、及长短轴a和b。

    Matlab仿真

    %椭圆拟合测试程序
    
    clc;
    close all;
    clear all
    
    alpha = (1:360)/180*pi;  %标准椭圆参数方程角度取值
    a = 15;                  %短轴长
    b = 40;                  %长轴长
    x0 = 5;                  %中心点x坐标
    y0 = -10;                %中心点y坐标
    Thita = 30/180*pi;       %旋转角度
    SNR = 20;                %信噪比
    
    %*********************************生成椭圆数据******************************
    %得到标准形式的椭圆数据
    x = a*cos(alpha);
    y = b*sin(alpha);
    %旋转角度Thita
    x_r = x*cos(Thita)-y*sin(Thita);
    y_r = x*sin(Thita)+y*cos(Thita);
    %加入白噪声
    x_r = x_r + 10^(-SNR/20)*a*randn(size(x_r));
    y_r = y_r + 10^(-SNR/20)*a*randn(size(x_r));
    %中心平移到(x0,y0)
    x_r_s = x_r + x0;
    y_r_s = y_r + y0;
    
    [a_f,b_f,x0_f,y0_f,Thita_f]=Ellipse_fitting(x_r_s,y_r_s);    %椭圆拟合
    %%
    %**********利用拟合的结果生成拟合后的椭圆数据***********
    x = a_f*cos(alpha);
    y = b_f*sin(alpha);
    x_r = x*cos(Thita_f/180*pi)-y*sin(Thita_f/180*pi);
    y_r = x*sin(Thita_f/180*pi)+y*cos(Thita_f/180*pi);
    x_r_s_f = x_r + x0_f;
    y_r_s_f = y_r + y0_f;
    %% 绘图
    figure;
    plot(x_r_s,y_r_s,'b',x0,y0,'b*');
    xlabel('x');
    ylabel('y');
    axis auto equal
    grid on;
    hold on;
    plot(x_r_s_f,y_r_s_f,'r',x0_f,y0_f,'r*');
    legend('原始数据','仿真的椭圆中心','拟合后的','拟合后的椭圆中心');
    
    fprintf('椭圆拟合结果如下(信噪比 SNR=%ddB):\n',SNR);
    fprintf('参数 a=%f,b=%f\n',a_f,b_f);
    fprintf('中心坐标(x0=%f,y0=%f)\n',x0_f,y0_f);
    fprintf('旋转角度 Thita=%f°\n',Thita_f);
    

    椭圆拟合子函数

    function [a,b,x0,y0,xita]=Ellipse_fitting(x,y)
    %椭圆拟合子函数
    %参数说明
    %  a:   x轴上的轴半径
    %  b:   x轴上的轴半径
    %  x0:   椭圆的中心x轴坐标
    %  y0:   椭圆的中心y轴坐标
    %  xita:椭圆的旋转角度
    
    N = length(x);   %求总点数
    
    avr_x = sum(x)/N;
    avr_y = sum(y)/N;
    avr_xx = sum(x.*x)/N;
    avr_xy = sum(x.*y)/N;
    avr_yy = sum(y.*y)/N;
    
    avr_xxx = sum(x.*x.*x)/N;
    avr_xxy = sum(x.*x.*y)/N;
    avr_xyy = sum(x.*y.*y)/N;
    avr_yyy = sum(y.*y.*y)/N;
    
    avr_xxxy = sum(x.*x.*x.*y)/N;
    avr_xxyy = sum(x.*x.*y.*y)/N;
    avr_xyyy = sum(x.*y.*y.*y)/N;
    avr_yyyy = sum(y.*y.*y.*y)/N;
    
    %求系数矩阵
    AA = [avr_xxyy,avr_xyyy,avr_xxy,avr_xyy,avr_xy;...
         avr_xyyy,avr_yyyy,avr_xyy,avr_yyy,avr_yy;...
         avr_xxy, avr_xyy, avr_xx, avr_xy, avr_x;...
         avr_xyy, avr_yyy, avr_xy, avr_yy, avr_y;...
         avr_xy,  avr_yy,  avr_x,  avr_y,  1];
     
    bb = [-avr_xxxy;...
          -avr_xxyy;...
          -avr_xxx;...
          -avr_xxy;...
          -avr_xx];
       
    out = inv(AA)*bb;
    %得到一般式的系数   
    g = out(1);
    c = out(2);
    d = out(3);
    e = out(4);
    f = out(5);
    %得到椭圆中心坐标
    AAA = [-2, -g;...
           -g, -2*c];
    bbb = [d;e];
    out1 = inv(AAA)*bbb;
    x0 = out1(1);
    y0 = out1(2);
    %得到过渡系数
    A = 1/(x0^2 + c*y0^2 + g*x0*y0 - f);
    B = c*A;
    C = g*A;
    %求得旋转角度
    tan_2xita = C/(A-B);
    xita = atan(tan_2xita)/2;
    sin_xita = sin(xita);
    cos_xita = cos(xita);
    %求得轴半径
    AAAA = [cos_xita^2,sin_xita^2;...
            sin_xita^2,cos_xita^2];
    bbbb =[A;B];
    out2 = inv(AAAA)*bbbb;
    a = sqrt(1/out2(1));
    b = sqrt(1/out2(2));
    
    xita = xita/pi*180;       %转化成°
    

    运行一下该程序得到如下结果:


    matlab命令窗口输出:


    可见拟合的结果与仿真设定的值很接近。














    展开全文
  • 任意多边形三屋顶自动生成算法

    千次阅读 2015-01-13 17:19:00
    第一篇,写一下今年10月份做的一个屋顶算法。这个算法是为三GIS根据地图数据自动构建建筑物的预研项目做基础的。当时自己遇到许多难题,最近要写一些算法文档,顺便就贴出来,相互讨论学习一下。这个算法中...

    任意多变性三维屋顶自动生成算法


            已经在CSDN猫了一年了,通过这里找到许多资源,特别是Android方面的。但是一直没有写过博客,很感激在一些牛人博客里找到自己问题的答案,所以从今天起我也将效仿大家,写一些自己做过的东西,感觉比较有价值技术探讨吧,初次写会有表达不清的地方,欢迎批评讨论。

           第一篇,写一下今年10月份做的一个三维屋顶算法。这个算法是为三维GIS根据地图数据自动构建建筑物的预研项目做基础的。当时自己遇到许多难题,最近要写一些算法文档,顺便就贴出来,相互讨论学习一下。这个算法中涉及几何库CGAL的编译使用,希望能给在第一次编译这个库的朋友一点提示。此外,这个算法虽然是以CGAL为基础的,但是我对于CGAL库的使用仍不熟练。CGAL是一个非常给力的库,是做几何图形这一块的不可或缺的优质资源。下面介绍一下任意多边形三维屋顶自动生成算法实现的过程。


    一、任务要求:

    1.      根据提供的多边形序列顶点和输入的参数类型自动生成坡面屋顶。

    2.      输入的多变形内允许存在洞,洞的个数为任意。

    3.      将生成的多边形屋顶以OSG模型格式输出。

    4.      算法要求稳定、高效,能接受任意测试。

    二、算法设计

    1.设计思路

    根据任务需要,选取CGAL开源库中的Straight_skeleton_2任意多边形骨架算法为底层骨架生成函数,通过对得到的骨架边进行最短路径生成,得打屋顶面的多变形拓扑关系。通过设定屋顶坡面的角度,经过得到骨架点的高度值。将生成的骨架点坐标和拓扑关系渲染到OSG场景中生成OSG格式模型。

    2.过程步骤

       (1)编译CGAL开源库。

       (2)从Straight_skeleton_2算法中得多边形到骨架线的拓扑关系。

       (3)通过最短路径算法对骨架边进行遍历检查生成屋顶多边形面。

       (4)根据骨架点相对临近骨架线的距离设定骨架点的高度。

       (5)根据设定的屋面高度对屋顶进行截切,生成对应的屋顶平面。

       (6)将生成的屋顶拓扑关系输入到OSG场景中,渲染得到OSG模型格式。

    三、算法实现过程

    1.CGAL开源库的编译

      CGAL是比较经典的开源几何算法库,算法经典,稳定高效。其编译有一定难度,需要按照相应的步骤进行配置才能成功。其难点主要有三:1需要依赖BOOST库,QT环境,LibQGLviewer 。2.相应的环境搭建比较困难,设置问题直接导致编译失败。3由于BOOST库编译过程产生的版本问题需要修改相应的库文件名称,否则编译失败。(概括一点,就是麻烦,不过总能编出来!认真+细心+毅力=CGAL编译成功,加油!)网上的例子给出很多,但是不同的环境总是出现不同的情况,下面给出自己的编译过程……。

    (1)       准备工作

    本机操作系统:Win7+VS2010

    【boost_1_56_0】

    【CGAL-4.2】

    【cmake-2.8.0-win32-x86】

    【qt-opensource-windows-x86-vs2010-4.8.6】

    【libQGLViewer】

           工欲善其事必先利其器,虽然有网友说需要部分功能可以不装某些模块就行,但是对于没有开源库编译经验的朋友还是老老实实做好以上充分准备,上面那些东西最好一样都不要少。否则,你将会懂得……我用的是这个版本,亲测成功,但不是唯一方案,可以参看其他网友,版本的下载链接请找度妈。

    备注:有网友说BOOST库最好用在线安装版,但是好像那个网页失效了,就使用boost_1_56_0吧。还有CGAL,安装时需要联网,有时网速慢提示某些文件下载失败,我的解决办法是将其地址拷贝到浏览器中下载,然后放到相应的文件夹下,下面会具体提到。

    (2)       第一批安装配置

    为难于其易,先从软柿子开始。依次安装QT、libQGLViewe、Cmake,解压BOOST到一个文件夹里,这里我的文件夹是D:\Instruct。

    为防止路径变量设置出错,下面给出我的路径安装环境变量配置,这个相当重要!如有不知道环境变量怎么设置,先到墙角面壁思过一会儿。

    PATH:D:\CGAL-4.2;D:\CGAL-4.2\auxiliary\gmp\lib;

    D:\Instruct\cmake\cmake-2.8.10-win32-x86\bin;

    C:\Qt\4.8.6\bin;C:\Qt\bin;

    D:\Instruct\boost_1_56_0\boost_1_56_0;

          C:\CGAL\lib;

     

    BOOST_INCLUD:D:\Instruct\boost_1_56_0\boost_1_56_0

    BOOST_LIBRAR:D:\Instruct\boost_1_56_0\boost_1_56_0\stage\lib

    BOOST_ROOT:D:\Instruct\boost_1_56_0\boost_1_56_0

    (3)BOOST库自编译

    这个路径D:\Instruct\boost_1_56_0\boost_1_56_0\stage\lib,在编译之前是不存在的。需要首先运行bootstrap.bat生成,然后运行生成的bjam.exe;具体就不讲了,参见其他网友过程。本部分需要等待20分钟。

    (4)安装CGAL,并设置环境变量路径。

       安装时候需要联网,如果网速慢,有文件下载失败,就根据提示用浏览器下载。然后放到相应的文件夹目录下。

    (5)开始Cmake

                                        aax01

    图1 Cmake路径设置

    根据上图1设置相应的路径。然后点击configure,会让你选择编译器,我用的是VS2010,选择2010这个过程大概两分钟,如果没有错,就点击generate,会在你选择的输出路径下有一个CGAL.sln。问题来了,很多情况下会提示各种异常,原因就在于路径设置有误,正确编译会显示下面三行内容,如果路径都正确,还有错误,就根据问题错误提示修改文件名,检查下面三条信息中是否配置正确。

    D:/CGAL-4.2/auxiliary/gmp/lib/libgmp-10.lib

    MPFR include: D:/CGAL-4.2/auxiliary/gmp/include

    MPFR libraries:D:/CGAL-4.2/auxiliary/gmp/lib/libmpfr-4.lib

    (6)打开CGAL.sln,在Debug和Release模式下都运行一遍,显示的是成功5,失败0。输出路径下的lib文件夹里会有CGAL-vc100-mt.lib、CGAL-vc100-mt-gd.lib等lib生成。

    这就算编译完成了。

    如果您一次编译成功,就太TMD幸运了。如果一天编出来说明您聪明,如果两天说明您能干,如果三天才编出来,说明您有毅力!我就很有毅力,呵呵!当初configure成功眼泪都快出来了!

    2. 通过Straight_skeleton_2骨架生成算法得到骨架边拓扑关系

    参考:

    http://www.cgal.org/Manual/3.2/doc_html/cgal_manual/Straight_skeleton_2/Chapter_main.html

    如下图2,

    黑色的圈代表输入的顶点,蓝色的圈表示生成的骨架点,其中红色的线条为骨架边。

     ss01

    图2

    通过Straight_skeleton_2 例子给出的骨架输出函数(代码如下)可以输出生成的骨架点和骨架边。

    template<class K>

    void print_straight_skeleton(CGAL::Straight_skeleton_2<K>const&ss )           (1)

    {

      typedefCGAL::Straight_skeleton_2<K> Ss ;

     

      typedef typename Ss::Vertex_const_handle     Vertex_const_handle ;

      typedef typename Ss::Halfedge_const_handle   Halfedge_const_handle ;

      typedef typename Ss::Halfedge_const_iteratorHalfedge_const_iterator ;

     

      Halfedge_const_handle null_halfedge ;//半边控制handle

      Vertex_const_handle   null_vertex ;//顶点控制handle

     

      std::cout << "Straightskeleton with " << ss.size_of_vertices() //顶点数

                << "vertices, " << ss.size_of_halfedges()//半边的条数

                << "halfedges and " << ss.size_of_faces()//骨架面数

                << "faces" << std::endl ;

               

      for (Halfedge_const_iterator i = ss.halfedges_begin(); i != ss.halfedges_end(); ++i)

      {

        print_point(i->opposite()->vertex()->point());//输出骨架边起点坐标

        std::cout << "->";

        print_point(i->vertex()->point());//输出骨架边终点坐标

    std::cout << "" << ( i->is_bisector() ?"bisector": "contour" ) << std::endl;

    //"bisector" :"contour" 原始的边:生成的轮廓边

      }

    }

    例子中只给出了骨架边的信息输出,没有骨架面的输出,我试图找到骨架面的控制函数,

    typedef typenameSs::Face_const_handle    Face_const_handle  ;

    typedef typenameSs::Face_const_iterator    Face_const_iterator  ;

    但是没有智能提示其中骨架面的输出方法。找了很久,找到了关于face的一些函数,但是没有操作成功,随后就放弃了直接得到骨架面拓扑关系想法,因为可以根据找到原始边和骨架边的关系,采用最短路径算法找到每条原始边对应的骨架面。

    3.最短路径算法得到屋顶多边形

    如图3所示,顶点1—8为原始多边形顶点,9—13为生成的骨架点,其连接关系如图中所示,可以由Straight_skeleton_2中的函数(1)得到。采用最短路径算法,将原始链接边的权重设为无穷大(黑色边:1000000),将生成的骨架边的权重设为1(红色边),然后依次计算原始边1->2,2->3,…,8->1的最短路径。即可得到每条原始边对应的骨架面。

    最短路径算法参考:DijkstraShortestPathAlg。

     sss01

    图3

    4、骨架点的高程值计算

    由Straight_skeleton_2计算出的骨架点坐标为平面坐标,想得到三维屋顶,只要给生成的骨架点赋一个高度值。但是这个高度值是一个主观意识的设定,也许你想要每个点的高度不一样,这样可能更加真实。因此这里给出一个通过设定屋顶的坡面角度自动计算生成屋顶点高度的方法。如图3在一个骨架面中的五边形(1 —11—12—13—2)中,可以根据顶点11、12、13到边(1—2)的距离乘以屋面角度的正切值得到他们的高度值。当然这是也只是一种规定,假定原始点的高度值相等。你也可以设定为其他规则。

    5设定屋顶平面高度得到屋顶切截面

    ss01

    图4(a)

    如图4(a),是生成的全坡面屋顶,但有时候我们的屋顶不都是坡面,而是有坡面的房檐部分,有平的屋顶,像一个棱台那样。 所以根据以上的算法,我们得到屋顶点(即骨架点)的高度,然后用一个一定高度的平面来与屋顶相切,得到一个切截面。当然这个切截面有时候有多个,这需要我们设定一定的方法将他们找出来,如图4(b)所示,红色部分即为切截面。

    sss01

    图4(b)

    6渲染成OSG模型格式

    通过前几个步骤可以得到屋顶面的拓扑关系了,随后就是读入OSG渲染的过程了,当然OPENGL足可以胜任,只要有模型的拓扑关系用什么引擎渲染,就根据自己的喜好了。想要最后的屋顶模型为OSG格式,当然要有编译OSG库了,这个过程参见其他网友博客。

    保存为OSG模型用这个函数 :osgDB::writeNodeFile(*(root.get()),"RzXpdRoof.osg");一行代码,即可将绘制场景保存为OSG模型。

    四、算法主要代码实现

    (1)Straight_skeleton_2骨架生成算法得到骨架边拓扑关系

    参照CGAL中example中示例代码:http://doc.cgal.org/latest/Straight_skeleton_2/index.html

    在函数(1)中可以添加如下代码查看顶点编号:

    std::cout <<i->opposite()->vertex()->id()<<" "<< i->vertex()->id();

    (2)屋顶生成及切截面寻找

    详见源码print.h中函数:ROOFgetxpd_straight_skeleton( CGAL::Straight_skeleton_2<K> const& ss ,PLOYGON merofploy ,float Angle,float maxhight )

     

    (3)       OSG渲染参看工程C:\Users\zyp\Desktop\1111111111中main.cpp文件

    (4)       最后整合工程为MFC截面,进行测试,详见工程C:\Users\zyp\Desktop\SSZRidegLine

    五、算法测试分析

    实现这一整套流程,用时近三周,现在思路清晰,觉得很简单,但当时摸着石头过河非常艰难。难点:1.CGAL编译;2.发现骨架边的拓扑关系;3.找到骨架面(我是用最短路径算法得到的。至今仍不知道怎么操作骨架面,对CGAL熟悉的朋友请您赐教);4.找出切截面。

    特别是找到切截面,我开始的算法又复杂,又有Bug,这个地方调试就卡了近一两周,真实痛苦,有80%时候得到的结果正确,其他就是三角片连错。开始怀疑是我渲染模式不正确,后来大量测试,才意识到找切截面算法身不严密。意识到问题出在那里后,一天就搞定了。

     ss01

    图5不含有洞的任意多边形

    sss01

    图6含有洞的情况

    在SSZRidegLine工程中定义了ROOF结构体用来存储生成的模型拓扑关系。

    工程C:\Users\zyp\Desktop\SSZRidegLine\cinploys.txt文件中定义了多边形输入读取格式(多边形最外多边形排序为顺时针,洞为逆时针)

    PloygonNum:  6 10 3 12 5 7 3

    6:表示总共有六个多边形//

    ploygonouter:表示最外边的多边形//

    ploygonhole://表示多边形中的洞

    10 3 12 5 7 3分别依次表示6个多边形的顶点数。

    ploygonouter:

    134.000 97.0000.000 ///坐标(x,y)

    273.000 68.0000.000

    561.000 62.0000.000

    530.000 298.0000.000

    455.000 381.0000.000

    363.000 130.0000.000

    279.000 260.0000.000

    148.000 206.0000.000

    127.000 320.0000.000

    91.000 117.0000.000

    ploygonhole:

    227.000 116.0000.000

    197.000 149.0000.000

    264.000 187.0000.000

    ploygonhole:

    481.000 119.0000.000

    445.000 151.0000.000

    453.000 193.0000.000

    487.000 192.0000.000

    510.000 183.0000.000

    515.000 151.0000.000

    517.000 114.0000.000

    505.000 91.0000.000

    449.000 81.0000.000

    391.000 104.0000.000

    406.000 124.0000.000

    440.000 118.0000.000

    ploygonhole:

    464.000 253.0000.000

    455.000 273.0000.000

    469.000 293.0000.000

    486.000 289.0000.000

    501.000 264.0000.000

    ploygonhole:

    153.000 185.0000.000

    204.000 209.0000.000

    220.000 195.0000.000

    137.000 148.0000.000

    150.000 126.0000.000

    118.000 121.0000.000

    115.000 153.0000.000

    ploygonhole:

    336.000 99.0000.000

    295.000 117.0000.000

    317.000 133.0000.000

     

    输出模型文件格式

    C:\Users\zyp\Desktop\SSZRidegLine\Debug\faceoutxpd.txt

    RoofObject: 1 3 11 14

    ///

    1:表示该屋顶有削平顶,该位置次数为0则表示严格坡面屋顶

    3:表示该屋顶有由三个多边形生成(即有两个洞)

    11:表示最外边的多边形有11个顶点

    14:表示共有14个屋顶面

    ///

    PosId: 35 4 3 4

    0 907.000 140.000 0.000///序号0;坐标(x,y,z)

    1 916.000 459.000 0.000

    2 116.000 420.000 0.000

    3 228.000 100.000 0.000

    4 382.000 197.000 0.000

    5 332.000 259.000 0.000

    6 507.000 332.000 0.000

    7 814.000 257.000 0.000

    8 709.000 287.000 0.000

    9 705.000 390.000 0.000

    10 811.000 390.000 0.000

    11 675.253 418.615 28.592

    12 624.759 414.220 30.522

    13 842.971 422.701 32.675

    14 380.184 143.822 34.769

    15 861.972 194.873 46.521

    16 862.564 404.457 51.835

    17 855.390 190.053 52.959

    18 230.129 284.846 63.023

    19 640.432 380.605 64.833

    20 285.195 185.860 82.282

    21 618.737 216.125 92.871

    22 250.119 329.674 96.673

    23 589.450 242.684 121.084

    24 882.637 163.628 25.000

    25 890.228 432.694 25.000

    26 150.684 396.641 25.000

    27 245.378 126.087 25.000

    28 380.694 158.763 25.000

    29 291.590 269.253 25.000

    30 603.455 399.345 25.000

    31 839.780 223.614 25.000

    32 684.702 267.921 25.000

    33 678.990 415.020 25.000

    34 835.462 415.020 25.000

    Face: 4//屋顶面有4个顶点

    3 27 24 0屋顶面的连接关系;记录顶点序号

    Face: 4

    0 24 25 1

    Face: 4

    1 25 26 2

    Face: 4

    2 26 27 3

    Face: 4

    6 30 28 4

    Face: 4

    4 28 29 5

    Face: 4

    5 29 30 6

    Face: 4

    10 34 31 7

    Face: 4

    7 31 32 8

    Face: 4

    8 32 33 9

    Face: 4

    9 33 34 10

    Face: 4

    27 24 25 26 27

    Face: 3

    30 28 29 30

    Face: 4

    34 31 32 33 34

    算法介绍结束了!

    感兴趣请留言评论,提供代码!

     

    展开全文
  • 二维图形变化之基本知识 本章涉及向量、世界坐标系、用户坐标系、窗口与视区、齐次坐标、二维变换等 。需要掌握的知识点有: 向量、矩阵以及它们的运算 坐标系的概念和坐标系之间的变换齐次坐标的概念二维...
  • 二维物体形状识别方法(二)

    千次阅读 2016-11-30 09:07:05
    摘 要 针对模式识别中二物体的形状识别问题,以值图像中的物体形状为主要研究对象,依次从特征提取、分类器设计两主要层面对形状识别方法进行了全面综述,并分析了国内外研究现状,特别是近年来所取得的最新...
  • 数据结构——二维数组

    千次阅读 2019-01-25 17:38:35
    但是,创建二维数组以实现关系数据库外观相似的数据结构。它提供了次容纳大量数据的便利性,可以在任何需要的地方传递给任意数量的功能。 如何声明二维数组 int arr[max_rows][max_columns]; 元素以行和列的形式...
  • 二维物体形状识别方法比较

    万次阅读 2010-11-09 09:30:00
    二维物体形状识别方法比较
  • 一维线搜索确定最优步长

    万次阅读 2017-12-17 17:09:26
    1.一维搜索问题一维线搜索,就是指单变量函数的最优化,它是专门针对单峰函数设计的:如上篇文章所述,多变量函数中,迭代格式为:xk+1=xk+αkdkx_{k+1} = x_k + \alpha_k d_k其中的关键就在于找到合适的步长αk,
  • 浅析连续子向量,子数组和(维,二维)问题 By 钟桓  9月 16 2014 更新日期:9月 16 2014 文章目录 1. 最大连续子向量和 1.0.1. 问题描述: 2. 子向量和接近于03. 收费站问题4. 区间赋值问题5....
  • 在用户看来,关系模型中数据的逻辑结构是一张扁平的二维表。 1.1域 域是组具有相同数据类型值的集合。 1.2笛卡儿积 笛卡儿积是域上的种集合运算。 定义:给定组域D1,D2,...,Dn,允许其中某些域是...
  • 这时医生就好比一个分类器,而这个医生诊断的准确率,与他当初受到的教育方式(构造方法)、病人的症状是否突出(待分类数据的特性)以及医生的经验多少(训练样本数量)有密切关系。 1.3、贝叶斯分类的基础...
  • 空间坐标转化——三维转二维

    万次阅读 2018-11-19 20:22:00
    最近在做项目的时候,遇到一个问题,这个问题的其中一个解决思路中用到了三维坐标转化成二维坐标。经过一段时间的研究,终于想出了解决方法。 预备知识: 空间平面表达式: Ax+By+Cz+d =0 空间直线表达式:(x-x0)...
  • 人脸重建和表情仿真

    万次阅读 热门讨论 2014-07-03 21:00:57
     98年的文章,较为简单,第步是2d图片映射到3d模型,首先从5角度拍摄头像,手工标注人脸轮廓的13特征点的位置,主要是眼角,耳朵,嘴型,鼻子。 然后通过3d摄像机投影得到一些等式,通过13点来求解等式的
  • Matlab蒙特卡洛模拟二维伊辛模型相变过程

    千次阅读 多人点赞 2020-04-07 18:27:40
    、什么是伊辛模型 伊辛(Ising)模型是描述磁系统相变最简单的模型,但模型里自旋之间...如图,每格点的方向只有向上或向下两者状态,但临近的自旋之间有相互作用,而且点阵可以是维、二维、三维、甚至更高维...
  • 从用户角度,关系模型中数据的逻辑结构是一张二维表 建立在集合代数的基础上 1.域(Domain) 域是组具有相同数据类型的值的集合。 2.笛卡尔积(Cartesian Product) 笛卡尔积在SQL中的实现方式既是交叉连接(Cross...
  • 关系数据库系列文章之到底什么是关系

    千次阅读 多人点赞 2018-08-05 02:28:45
    在语言X中如何实现Y,像这种具体的只是(know-how)可快速提高你的工作效率。但是一旦语言发生变化,这种知识就无法再使用。... 作为程序员,在日常的开发中,我们避免不了的就要接触数据库这概念,而关系...
  • 曲线,共用一个x轴,图形两边各有一个y轴。两条图线可以调用不同的绘图方法。 例1:  x=0:0.3:12; y=exp(-0.3*x).*sin(x)+0.5; plotyy(x,y,x,y,'plot','stem')  左侧y轴对应plot形式的绘图,右侧y轴对应...
  • 聊聊三重建-条纹法之相位法()

    千次阅读 2019-12-14 20:48:13
    点击上方“3D视觉工坊”,选择“星标”干货第时间送达本文由知乎作者Tengfei Jiang授权转载,不得擅自次转载。原文链接:https://zhuanlan.zhihu.com/...
  • 数据结构-二维数组-存储结构

    千次阅读 2017-09-28 11:18:40
    数组的两主要的顺序存储方式,数组具有随机访问特点,要求能够依据下标计算出任数组元素的存储地址(概念上的地址):计算机主存的每地址和存储内的每字节是一一对应的,而每字节间的排列顺序是线式的。...
  • 分钟看懂一维空间到十维空间

    万次阅读 2018-12-16 23:08:54
    如果把到十维度的空间用一张图来表达,你是否会看得明白呢?根据弦理论,粒子被看作是长度为普朗克尺度一维弦,在引入费米子的座标后,科学家提出了超弦理论。超弦理论暗示的平行宇...
  • 一维码与二维码对比介绍

    千次阅读 2018-11-14 21:15:41
    一维码是将宽度不等的多黑条和空白,按照一定的编码规则排列,用以表达组信息的图形标识符。常见的一维码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。 1.2 用处 维码可以标出物品...
  • (15)二维图形基本几何变换

    千次阅读 2016-12-31 21:38:55
    图形变换:一般是指对图形的几何信息经过变换后...在二维空间中,用(x, y)表示平面上一点;在三维空间中用(x, y, z)表示空间一点。因此,可用点的集合(简称点集)来表示一个平面图形或三维立体,写成矩阵形式为: 
  • 类似于平移,旋转是种不变形地移动对象的刚体变换,对象上的所有点旋转相同的角度。线段的旋转可以通过将旋转方程5用于每线段端点,并重新绘制新端点间的线段而得到。多边形的旋转则是将每顶点旋转指定的旋转...
  • 本文将重点讲解向量和二维图形的变换。5.1 向量基础知识我们所使用的所有点和向量是基于某坐标系定义的,比如左手坐标系或者右手坐标系。从几何的角度来看,向量是具有长度和方向的实体,但是没有位置,而点是...
  • 【物联网】矩阵式二维条码 介绍

    千次阅读 2017-08-11 15:33:07
    QR Code是由日本Denso公司于1994年9月研制的种矩阵式二维条码,它除具有二维条码所具有的信息容量大、可靠性高、可表示汉字及图象多种信息、保密防伪性强等优点外,还具有以下特点: 超高速识读:QR Code码的超...
  • 作为一个系统介绍Unity3D中Shader编写的系列文章的开篇,本文的第一部分系列文章的前言,然后第部分介绍了这个系列文章中我们会使用的游戏场景创建方式,最后一部分讲解了如何在Unity中创建和使用Shader,为后面...
  • 重建学习之旅(

    万次阅读 2016-06-25 17:20:06
    笔者本身对三比较感...其中的很多东西并不是重建中最佳的选择(但每件我亲身试验和深入了解过),我在学习中得到的每一点进步是在前人无私的分享中获得的,因此写此博客的目的也是想将这种分享的精神延续下去
  • 关于二维平面坐标变换矩阵的说明

    千次阅读 2019-09-26 21:25:46
    坐标转换矩阵 什么是坐标转换矩阵 坐标转换矩阵就是指将两点之间的仿射关系以转换矩阵的形式表现出来,也就是通过转换矩阵作用于原始点的坐标,得到 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 61,826
精华内容 24,730
关键字:

任意的一个二维表都是一个关系