精华内容
下载资源
问答
  • 简要介绍 计算几何 的几个简单算法和应用

    一、前言

      最近听过感触最深的一句话:思想能够到达的地方比光速还要快!月球到了!太阳到了!你能知道的就是你能到达的,所以我们才要扩充我们的知识面,你要知道你才能到啊!
      太阳之外是什么?不知道了?到不了了,原因是什么?因为无知!因为我们把时间和精力花在了喝酒、吃饭、K歌。
      如果你有足够大的勇气去说再见,放弃一切娱乐,从现在开始每天学习,生活一定会奖励你一个新的开始。人生最难的是改变自己。凤凰涅槃浴火重生的人都很了不起。在这里插入图片描述

    二、计算几何基本概念

    • 计算几何是计算机科学的一个分支,以往的解析几何,是用代数的方法,建立坐标系去解决问题,但是很多时候需要付出一些代价,比如精度误差,而计算几何更多的是从几何角度,用向量的方法来尽量减少精度误差,例如:将除法转化为乘法、避免三角函数等近似运算 等等。

    1、浮点数精度

    1)double 代替 float

    • c++ 中 double 的精度高于 float,对精度要求较高的问题,务必采用 double;

    2)浮点数判定

    • 由于浮点数(小数)中是有无理数的,即无限不循环小数,也就是小数点后的位数是无限的,在计算机存储的时候不可能全部存下来,一定是近似的存储的,所以浮点数一定是存在精度误差的(实际上,就算是有理数,也是存在误差的,这和计算机存储机制有关,这里不再展开,有兴趣可以参见我博客的文章:C++ 浮点数精度判定);
    • 两个浮点数是否相等,可以采用两数相减的绝对值小于某个精度来实现:
    const double eps = 1e-8;
    bool EQ(double a, double b) {
        return fabs(a - b) < eps;
    }
    
    • 并且可以用一个三值函数来确定某个数是零、大于零还是小于零:
    int threeValue(double d) {
        if (fabs(d) < eps)
            return 0;
        return d > 0 ? 1 : -1;
    }
    

    3)负零判定

    • 因为精度误差的存在,所以在输出的时候一定要注意,避免输出 -0.00:
        double v = -0.0000000001;
        printf("%.2lf\n", v);
    
    • 避免方法是先通过三值函数确定实际值是否为0,如果是0,则需要取完绝对值后再输出:
        double v = -0.0000000001;
        if(threeValue(v) == 0) {
            v = fabs(v);
        }
        printf("%.2lf\n", v);
    

    4)避免三角函数、对数、开方、除法等

    • c++ 三角函数运算方法采用的是 CORDIC算法,一种利用迭代的方式进行求解的算法,其中还用到了开方运算,所以实际的算力消耗还是很大的,在实际求解问题的过程中,能够避免不用就尽量不用。
    • 除法运算会带来精度误差,所以能够转换成乘法的也尽量转换为乘法运算。

    2、点和向量

    1)定义

    • 本章为计算几何入门级,所以只介绍二维的情况,对于二维的点,只需要两个浮点数表示即可,点的定义如下:
    typedef double Type;
    class Point2D {
    private:
        Type x, y;
    public:
        Point2D(Type _x, Type _y) : x(_x), y(_y) {}
        ...
    };
    
    • 两点相减就变成了向量,向量支持平移(可以将起点平移到坐标系原点(0,0)),所以向量的程序运算和点几乎无差别,可以直接用 typedef 定义:
    typedef Point2D Vector2D;
    
    • 数学表示如下:
      a\vec a

    2)四则运算

    • 点(向量)的四则运算 加减乘除 如下:

    • 实现的是两个向量相加,代码如下:
    Point2D Point2D::operator+(const Point2D& other) const {
        return Point2D(x + other.x, y + other.y);
    }
    
    • 如图二-2-1所示,红色向量为两向量相加后的向量;
      图二-2-1

    • 实现的是两个向量相减,代码如下:
    Point2D Point2D::operator-(const Point2D& other) const {
        return Point2D(x - other.x, y - other.y);
    }
    
    • 如图二-2-2所示,红色向量为两向量相减后的向量;
      图二-2-2

    • 向量和向量的乘法分为点乘和叉乘,这个后面再展开;
    • 这里的乘法为 向量 和 数字 的乘法,代码实现如下:
    Point2D Point2D::operator *(const double &k) const {
        return Point2D(x * k, y * k);
    }
    
    • 如图二-2-3所示,向量乘法就是将向量扩大(k>1k > 1)或缩短(k<1k < 1) kk 倍;
      图二-2-3

    • 向量和向量的之间不存在除法;
    • 向量 和 数字 的除法,可以转换成向量乘法(乘上 kk 的倒数)。

    2、向量的模

    • 两点之间的欧几里得距离,为两点组成向量的模,代码实现如下:
    double Vector2D::len() {
        return sqrt(x*x + y*y);
    }
    
    • 调用的时候,可以直接调用两点之间的减法,再调用 lenlen 成员函数,实现如下:
    Point2D a(0, 2), b(3, 4);
    double dist = (b - a).len();
    
    • 优化:在单纯进行向量长度比较的时候,往往只需要知道哪个更长(或者更短),

    3、标准化

    • 有时候为了方便计算,会把向量转换成 单位向量(模为 1 的向量),此所谓标准化。实现如下:
    Point2D Vector2D::normalize() {
        double l = len();
        if (threeValue(l)) {
            x /= l, y /= l;
        }
        return *this;
    }
    
    • 由于存在零向量,所以标准化过程中,在进行除法的时候需要先用三值函数判断向量的模是否为0,避免引起除零错误;

    4、点乘

    • 点乘(又叫点积、数量积、内积),表示的是两个向量每一维相乘的加和,结果是个数字,二维的情况如下:
      a=(xa,ya)\vec a = (x_a,y_a)b=(xb,yb)\vec b = (x_b,y_b)ab=xaxb+yayb\vec a \cdot \vec b = x_ax_b+y_ay_b
    • 代码实现如下:
    Type Point2D::operator*(const Point2D& other) const {
        return x*other.x + y*other.y;
    }
    
    • (当然,点积同样适用于三维、甚至多维的情况)
    • 点乘可以用来求两个向量的夹角,公式如下:
      ab=abcosθ\vec a \cdot \vec b = |\vec a||\vec b|cos\theta
    • 从以上公式可以看出,点乘的结果和夹角的关系:
    • 1)点乘为0,夹角为90度;
    • 2)点乘为1,夹角为0度;
    • 3)点乘为-1,夹角为180度;
    • 特殊的,任何向量和零向量的点乘都为 0;
    • 下文会介绍 点乘 在线段判交中的应用;

    5、叉乘

    • 叉乘(又叫叉积、向量积,外积),表示的是两个向量经过运算后,和这两个向量垂直的向量(和点乘不同,它的结果还是一个向量),如下:
      a=(xa,ya,za)\vec a = (x_a,y_a,z_a)b=(xb,yb,zb)\vec b = (x_b,y_b,z_b)a×b=c=(yazbzayb)i+(zaxbxazb)j+(xaybyaxb)k\vec a \times \vec b = \vec c = (y_az_b-z_ay_b) \vec i + (z_ax_b-x_az_b)\vec j + (x_ay_b-y_ax_b)\vec k
    • 其中 i=(1,0,0),j=(0,1,0),k=(0,0,1)\vec i = (1, 0, 0), \vec j = (0, 1, 0), \vec k = (0, 0, 1)
    • 当两个向量都在 z=0z = 0 的平面上时,za=zb=0z_a=z_b=0,退化为二维的情况,则有 a×b=(xaybyaxb)k\vec a \times \vec b = (x_ay_b-y_ax_b)\vec k
    • 代码实现如下(因为 k\vec k 方向已经确定,为垂直原向量,所以返回值可以定义为一个数值类型):
    Type Point2D::X(const Point2D& other) const {
        return x*other.y - y*other.x;
    }
    
    • 在二维计算几何中,叉乘可以用来判断两个点是否在一个向量的同一侧,如图二-5-1所示:
    图二-5-1
    • 对于向量 s=OS\vec s = OS,假设有任意一个点 T(x,y)T(x,y),对原点到这个点做一个向量 t\vec t。那么有叉乘:
      s×t=(10yx10)k\vec s \times \vec t = (10y-x10) \vec k

    • 1)s×t>0\vec s \times \vec t > 0,则 (x,y)(x,y)s\vec s 左侧(参考点A);

    • 2)s×t=0\vec s \times \vec t = 0,则 (x,y)(x,y)s\vec s 共线(参考点B);

    • 3)s×t<0\vec s \times \vec t < 0,则 (x,y)(x,y)s\vec s 右侧(参考点C);

    • 所以,只要两个点分别和对应向量做叉乘,再将结果相乘,如果值大于0,则代表同侧;小于零代表异侧;

    • 叉乘还代表了两个向量组成的平行四边形的面积,有公式:
      a×b=absinθ\vec a \times \vec b = |\vec a||\vec b|sin\theta

    • 同样也代表了两个向量组成的三角形的面积的两倍。

    6、旋转

    • 通过 叉乘 和 点乘 联立方程组,可以求出一个点绕着原点旋转 θ\theta 角度后的点的位置;
    • 令旋转前的点的位置为 S(xs,ys)S (x_s,y_s),旋转 θ\theta 角度后的点的位置 T(xt,yt)T(x_t,y_t),则有:
      {st=xsxt+ysyt=(xs2+ys2)cosθs×t=xsytysxt=(xs2+ys2)sinθ\begin{cases} \vec s \cdot \vec t = x_sx_t + y_sy_t = (x_s^2+y_s^2)cos\theta \\ \vec s \times \vec t = x_sy_t - y_sx_t = (x_s^2+y_s^2)sin\theta \end{cases}
    • 两个方程,两个未知数,求解得到:
      {xt=xscosθyssinθyt=xssinθ+yscosθ\begin{cases} x_t= x_scos\theta - y_ssin\theta\\ y_t = x_ssin\theta + y_scos\theta\\ \end{cases}
    • 表示成矩阵的形式为:
      [xtyt]=[xsys][cosθsinθsinθcosθ] \left[ \begin{matrix} x_t & y_t \end{matrix} \right] \quad = \left[ \begin{matrix} x_s & y_s \end{matrix} \right] \left[ \begin{matrix} cos\theta & sin\theta \\ -sin\theta & cos\theta \end{matrix} \right]
    • 代码实现如下:
    Point2D Point2D::turn(double theta) {
        double costheta = cos(theta);
        double sintheta = sin(theta);
        return Point2D(
            x*costheta - y*sintheta, 
            x*sintheta + y*costheta
        );
    }
    

    三、计算几何基础算法

    1、线段判交

    • 判断两个线段是否相交,在计算几何算法中有着广泛的应用,两个线段的相交情况有如下三种:
    图三-1-1
    * 这里用枚举来代表三种线段的相交关系:
    enum SegCrossType {
        SCT_NONE = 0,          // 不相交
        SCT_CROSS = 1,         // 相交于内部
        SCT_ENDPOINT_ON = 2,   // 其中一条线段的端点在另一条上
    };
    
    • 并且定义线段的数据结构如下:
    class Segment2D {
        Point2D s, t;
    public:
        ...
    };
    

    1)相交于内部

    • 首先对于两个线段,选取其中一个线段作为向量,另外一个线段的两端点作为测验点,如果这两个测验点在向量两边,那么可以肯定,这两个线段一定是不相交的(检测是否在向量两边可以用上文提到的叉乘),如图三-1-2所示:
      在这里插入图片描述
      图三-1-2
    • 然后,选取另外一个线段向量作为向量重复同样的测验;
    • 如果两次测验都满足在向量两边,则这两个线段必然有交点;
    • 这种测验被称为 跨立测验, c++ 代码实现如下:
    Type Segment2D::cross(const Point2D& p) const {
        return (p - s).X(t - s);
    }
    bool Segment2D::lineCross(const Segment2D& other) const {
        return threeValue(cross(other.s)) * threeValue(cross(other.t)) == -1;
    }
    
    • cross实现的是点 pp 在向量 tst - s 的哪边;
    • lineCross判断两个点是否在向量的两边(通过取三值函数后,相乘为 -1 来实现);
    图三-1-3
    * 最后,需要两次跨立测验都成立,才算满足线段相交的条件,如图三-1-3所示;

    2)相交于端点

    • 当一个线段的端点 P 在另一个线段 (S, T) 上时,只有三种情况:
    • 1)P = S;
    • 2)P = T;
    • 3)∠SPT = 180°;
    • 利用叉乘 和 点乘 进行组合判断即可,代码实现如下:
    bool Segment2D::pointOn(const Point2D& p) const {
        // 满足两个条件:
        //  1.叉乘为0,    (p-s)×(t-s) == 0
        //  2.点乘为-1或0,(p-s)*(p-t) <= 0
        return cross(p) == 0 && (p - s)*(p - t) <= 0;
    }
    
    • 然后对四个点分别进行端点相交判断;

    3)线段判交实现

    • 两次 跨立测验 和 四次 端点测验,实现如下:
    SegCrossType Segment2D::segCross(const Segment2D& other) {
        if (this->lineCross(other) && other.lineCross(*this)) {
            // 两次跨立都成立,则必然相交与一点
            return SCT_CROSS;
        }
        // 任意一条线段的某个端点是否在其中一条线段上,四种情况
        if (pointOn(other.s) || pointOn(other.t) ||
            other.pointOn(s) || other.pointOn(t)) {
            return SCT_ENDPOINT_ON;
        }
        return SCT_NONE;
    }
    

    2、多边形面积

    • 多边形的面积可以通过将多边形进行三角剖分后,计算每个三角形的面积加和后得到,如图三-2-1所示:
      图三-2-1
    • 求三角形面积采用叉乘来实现;
    • C++代码实现如下:
    struct Polygon {
        int n;
        Point2D p[MAXP];
        double area();
    };
    double Polygon::area() {
        double sum = 0;
        p[n] = p[0];
        for (int i = 0; i < n; i++)
            sum += p[i].X(p[i + 1]);
        return sum / 2;
    }
    
    • 这里的点是按照 p[0]p[0] 进行极角排序的,并且保证 p[n]=p[0]p[n] = p[0]
    • 如果点是按照顺时针排序,或者凹多边形的情况,求出来的面积可能是负数,如果进行输出的时候需要取下绝对值;

    3、凸多边形判定

    • 对于一个凸多边形而言,任意一条边作为向量,其它所有的顶点一定是在他的同侧的,所以可以利用这个性质来判断一个多边形是否是凸多边形;
      图三-3-1
    // 是否凸多边形
    bool Polygon::isConvex() {
        bool s[3] = { false, false, false };
        p[n] = p[0], p[n + 1] = p[1];
        for (int i = 0; i < n; i++) {
            s[threeValue((p[i + 1] - p[i]) * (p[i + 2] - p[i])) + 1] = true;
            // 叉乘有左有右,肯定是凹的
            if (s[0] && s[2]) return false;
        }
        return true;
    }
    

    4、点在多边形内判定

    • 通过从无限远的地方引入一个随机点,然后和判定点做一条线段,把多边形的每条边和这条线段做判交检测,如果相交得到的交点数量,如果是奇数,说明在多边形内;如果是偶数,说明不在多边形内;
    • 射线法同样也适用于凹多边形;

    5、多边形点的逆时针转换

    • 如果点是按照顺时针排布的,那么利用叉乘计算出来的面积为负数,根据这个特点可以将多边形的点进行反序,代码如下:
    // 转成逆时针顺序
    void Polygon::convertToCounterClockwise() {
        if (area() >= 0) {
            return;
        }
        for (int i = 1; i <= n / 2; ++i) {
            Point2D tmp = p[i];
            p[i] = p[n - i];
            p[n - i] = tmp;
        }
    }
    

    四、计算几何算法和应用

    • 介于篇幅,以下算法只简单进行应用介绍,具体的算法实现将在后续章节进行详细展开。

    1、凸包

    • 凸包可想象为一条刚好包著所有点的橡皮圈,它一定是一个凸多边形。
    • 凸包一般用来进行点集筛选,比如求解点集中的 最大面积三角形、最大周长三角形,因为这些点一定是在点集的凸包上,可以先进行凸包筛选降低点集数量,减少算法运行时间。

    2、旋转卡壳

    • 旋转卡壳一般配合凸包,用来求 凸多边形直径(点集的最远点对)、宽、凸多边形间最大距离、凸多边形间最小距离、最小面积外接矩形、最小周长外接矩形等等;

    3、半平面交

    • 半平面交一般可以用来求解以下问题:
    • 1、两个多边形的交、并。
    • 2、多边形的核:求解一个区域,使得这个区域内的任意点可以看到给定图形的任意角落。
    • 3、求可以放进凸多边形的最大内接圆。
    • 4、一些线性规划问题。

    4、圆和多边形交

    • 将多边形进行三角剖分以后,分别和圆进行求交,转换成三角形和圆相交的问题。

    5、最小包围球

    • 最小覆盖圆的三维情况,利用四点确定一个球体,然后判断其它点是否在这个球体中,用随机算法进行优化。

    6、模拟退火

    • 模拟退火是一种概率算法,在某个解空间内寻找最优解。比如求解三角形和圆的最大相交面积,寻找最近的最远点等等。

    本文所有示例代码均可在以下 github 上找到:github.com/WhereIsHeroFrom/模板/计算几何


    在这里插入图片描述


    五、计算几何题集整理

    点乘

    题目链接 难度 解析
    HDU 2080 夹角有多大II ★☆☆☆☆ 点乘

    旋转

    题目链接 难度 解析
    HDU 2438 Turn the corner ★☆☆☆☆ 枚举 + 点旋转
    HDU 1700 Points on Cycle ★★☆☆☆ 点的旋转
    HDU 2898 旋转 ★★★☆☆ 3D点的旋转
    HDU 3320 openGL ★★★☆☆ 3D点的旋转
    HDU 4998 Rotate ★★★★☆ 2D点旋转

    线段判交

    题目链接 难度 解析
    HDU 1086 You can Solve a Geometry Problem too ★☆☆☆☆ 线段判交
    HDU 2150 Pipe ★☆☆☆☆ 线段判交
    PKU 1127 Jack Straws ★★☆☆☆ 线段判交 + 并查集
    PKU 2653 Pick-up sticks ★★☆☆☆ 线段判交
    HDU 3803 gxx’s Problem ★★★★☆ 线段判交

    多边形面积

    题目链接 难度 解析
    PKU 1265 Area ★☆☆☆☆ 多边形求面积模板
    PKU 1654 Area ★☆☆☆☆ 多边形求面积模板
    HDU 2036 改革春风吹满地 ★☆☆☆☆ 多边形求面积模板

    点在多边形内

    题目链接 难度 解析
    PKU 1081 You Who? ★☆☆☆☆ 判定点在多边形内
    PKU 2318 TOYS ★☆☆☆☆ 二分 + 判定点在多边形内
    PKU 2398 Toy Storage ★☆☆☆☆ 二分 + 判定点在多边形内
    PKU 1410 Intersection ★★☆☆☆ 判定点在多边形内
    PKU 3788 Interior Points of Lattice Polygons ★★☆☆☆ 判定点在多边形内

    凸包

    题目链接 难度 解析
    HDU 1392 Surround the Trees ★☆☆☆☆ 凸包模板 求周长
    HDU 1348 Wall ★☆☆☆☆ 凸包模板 求周长
    PKU 3348 Cows ★☆☆☆☆ 凸包模板 求面积
    PKU 1228 Grandpa’s Estate ★★☆☆☆ 凸包模板 凸包边上的点
    HDU 3285 Convex Hull of Lattice Points ★★☆☆☆ 凸包模板 路径输出
    HDU 2907 Diamond Dealer ★★☆☆☆ 凸包上的点标记
    HDU 5533 Dancing Stars on Me ★★☆☆☆ 凸包判断是否正多边形
    HDU 2406 Doors and Penguins ★★★☆☆ 凸多边形交判定
    HDU 6325 Interstellar Travel ★★★☆☆ 单调栈 + 凸包
    HDU 3021 Tree Fence ★★★★☆ 凸包 + 弗洛伊德
    HDU 4978 A simple probability problem. ★★★★☆ 概率推导 + 凸包
    HDU 5928 Birthday Gift ★★★★☆ 动态规划 + 凸包优化
    HDU 6219 Empty Convex Polygons ★★★★★ 动态规划 + 凸包优化
    PKU 1259 The Picnic ★★★★★ 动态规划 + 凸包优化

    旋转卡壳

    题目链接 难度 解析
    HDU 2202 最大三角形 ★☆☆☆☆ 旋转卡壳模板
    HDU 3934 Summer holiday ★★☆☆☆ 凸包 + 旋转卡壳
    HDU 5251 矩形面积 ★★★☆☆ 旋转卡壳
    HDU 5784 How Many Triangles ★★★☆☆ 旋转卡壳

    半平面交

    题目链接 难度 解析
    PKU 1279 Art Gallery ★★☆☆☆ 半平面交
    PKU 1474 Video Surveillance ★★☆☆☆ 半平面交
    PKU 3130 How I Mathematician ★★☆☆☆ 半平面交
    PKU 2540 Hotter Colder ★★☆☆☆ 半平面交
    PKU 2451 Uyuw’s Concert ★★☆☆☆ 半平面交
    PKU 3335 Rotating Scoreboard ★★☆☆☆ 半平面交
    PKU 3525 Most Distant Point from the Sea ★★★☆☆ 半平面交
    HDU 1632 Polygons ★★☆☆☆ 半平面交
    HDU 3060 Area2 ★★☆☆☆ 半平面交

    最小覆盖集

    题目链接 难度 解析
    ZJU 1450 Minimal Circle ★★★☆☆ 最小覆盖圆
    HDU 3007 Buried memory ★★★☆☆ 最小覆盖圆
    HDU 3932 Groundhog Build Home ★★★☆☆ 最小覆盖圆
    BZOJ 2823 信号塔 ★★★☆☆ 最小覆盖圆
    PKU 2069 Super Star ★★★★☆ 最小包围球
    HDU 2226 Stars ★★★★☆ 最小包围球

    模拟退火

    题目链接 难度 解析
    PKU 1379 Run Away ★★☆☆☆ 寻找最远的最近点
    PKU 2069 Super Star ★★☆☆☆ 寻找最近的最远点(3维)
    PKU 2420 A Star not a Tree? ★★☆☆☆ 寻找到所有点距离最小的点
    PKU 2600 Gemetrical dreams ★★★☆☆ 模拟向量旋转
    HDU 3932 Groundhog Build Home ★★★★☆ 寻找最近的最远点
    HDU 3644 A Chocolate Manufacturer’s Problem ★★★★☆ 任意简单多边形的最大内接圆
    HDU 4717 The Moving Points ★★★★☆ 寻找距离最小的最远点对
    HDU 5017 Ellipsoid ★★★★☆ 曲面最小距离
    HDU 3202 Circle and Triangle ★★★★★ 三角形和圆的最大相交面积(难题)
    展开全文
  • Open3D 绘制几何图形

    万次阅读 2021-04-11 16:25:39
    Open3D 绘制常见几何图形

    1、绘制立方体

    import open3d as o3d
    
    print("绘制立方体")
    mesh_box = o3d.geometry.TriangleMesh.create_box(width=1.0,          # x长度
                                                    height=1.0,         # y长度
                                                    depth=1.0)          # z长度
    mesh_box.compute_vertex_normals()
    mesh_box.paint_uniform_color([0.9, 0.1, 0.1])
    o3d.visualization.draw_geometries([mesh_box])
    
    

    在这里插入图片描述

    2、绘制箭头

    import open3d as o3d
    
    # 绘制箭头
    arrow = o3d.geometry.TriangleMesh.create_arrow(cylinder_radius=1.0,  # 圆柱体的半径
                                                   cone_radius=1.5,      # 圆锥的半径
                                                   cylinder_height=5.0,  # 圆柱体的高度。圆柱体从(0,0,0)到(0,0,圆筒高度)
                                                   cone_height=4.0,      # 圆锥的高度。圆锥的轴将从(0,0,圆筒高度)到(0,0,圆筒高度+圆锥高度)
                                                   resolution=20,        # 圆锥将被分割成“分辨率”段。
                                                   cylinder_split=4,     # "圆柱高度"将被分割成"圆柱分割"段
                                                   cone_split=1)         # “cone_height”将被分割成“cone_split”段。
    arrow.compute_vertex_normals()
    arrow.paint_uniform_color([1, 0, 0])
    print("绘制箭头")
    o3d.visualization.draw_geometries([arrow])
    
    

    在这里插入图片描述

    3、绘制球体

    import open3d as o3d
    
    # 绘制球体
    mesh_sphere = o3d.geometry.TriangleMesh.create_sphere(radius=1.0,      # 球的半径
                                                          resolution=100)  # 图形显示的分辨率,可省略。默认值为:20
    mesh_sphere.compute_vertex_normals()
    mesh_sphere.paint_uniform_color([0.1, 0.1, 0.7])
    o3d.visualization.draw_geometries([mesh_sphere])
    
    

    在这里插入图片描述

    4、绘制圆柱

    import open3d as o3d
    
    # 绘制圆柱
    mesh_cylinder = o3d.geometry.TriangleMesh.create_cylinder(radius=0.3,  # 半径
                                                              height=4.0)  # 高(有第三个参数为分辨率)
    mesh_cylinder.compute_vertex_normals()
    mesh_cylinder.paint_uniform_color([0.1, 0.4, 0.1])
    o3d.visualization.draw_geometries([mesh_cylinder])
    
    

    在这里插入图片描述

    5、绘制圆锥

    import open3d as o3d
    
    # 绘制箭头
    cone = o3d.geometry.TriangleMesh.create_cone(radius=1.0,   # 圆锥的半径
                                                 height=2.0,   # 圆锥的高度
                                                 resolution=20,
                                                 split=1)      # The ``height`` will be split into ``split`` segments
    
    cone.compute_vertex_normals()
    cone.paint_uniform_color([0, 1, 0])
    print("绘制箭头")
    o3d.visualization.draw_geometries([cone])
    
    

    在这里插入图片描述

    6、用直线绘制立方体

    import open3d as o3d
    
    print("Let's draw a box using o3d.geometry.LineSet.")
    points = [
        [0, 0, 0],
        [1, 0, 0],
        [0, 1, 0],
        [1, 1, 0],
        [0, 0, 1],
        [1, 0, 1],
        [0, 1, 1],
        [1, 1, 1],
    ]
    lines = [
        [0, 1],
        [0, 2],
        [1, 3],
        [2, 3],
        [4, 5],
        [4, 6],
        [5, 7],
        [6, 7],
        [0, 4],
        [1, 5],
        [2, 6],
        [3, 7],
    ]
    colors = [[1, 0, 0] for i in range(len(lines))]
    # 绘制直线
    line_set = o3d.geometry.LineSet(
        points=o3d.utility.Vector3dVector(points),
        lines=o3d.utility.Vector2iVector(lines),
    )
    line_set.colors = o3d.utility.Vector3dVector(colors)
    o3d.visualization.draw_geometries([line_set])
    
    

    在这里插入图片描述

    展开全文
  • 【OpenCV】图像几何变换:旋转,缩放,斜切

    万次阅读 多人点赞 2012-05-30 14:56:25
    几何变换 几何变换可以看成图像中物体(或像素)空间位置改变,或者说是像素的移动。 几何运算需要空间变换和灰度级差值两个步骤的算法,像素通过变换映射到新的坐标位置,新的位置可能是在几个像素之间,即不一定...

    几何变换

    几何变换可以看成图像中物体(或像素)空间位置改变,或者说是像素的移动。

    几何运算需要空间变换和灰度级差值两个步骤的算法,像素通过变换映射到新的坐标位置,新的位置可能是在几个像素之间,即不一定为整数坐标。这时就需要灰度级差值将映射的新坐标匹配到输出像素之间。最简单的插值方法是最近邻插值,就是令输出像素的灰度值等于映射最近的位置像素,该方法可能会产生锯齿。这种方法也叫零阶插值,相应比较复杂的还有一阶和高阶插值。

    插值算法感觉只要了解就可以了,图像处理中比较需要理解的还是空间变换。

    空间变换

    空间变换对应矩阵的仿射变换。一个坐标通过函数变换的新的坐标位置:

    所以在程序中我们可以使用一个2*3的数组结构来存储变换矩阵:

    以最简单的平移变换为例,平移(b1,b2)坐标可以表示为:

    因此,平移变换的变换矩阵及逆矩阵记为:

    缩放变换:将图像横坐标放大(或缩小)sx倍,纵坐标放大(或缩小)sy倍,变换矩阵及逆矩阵为:

    选择变换:图像绕原点逆时针旋转a角,其变换矩阵及逆矩阵(顺时针选择)为:

     

    OpenCV中的图像变换函数

    基本的放射变换函数:

     

    void cvWarpAffine( 
        const CvArr* src,//输入图像
        CvArr* dst, //输出图像
        const CvMat* map_matrix,   //2*3的变换矩阵
        int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,   //插值方法的组合
        CvScalar fillval=cvScalarAll(0)   //用来填充边界外的值
    );

    另外一个比较类似的函数是cvGetQuadrangleSubPix:

     

     

    void cvGetQuadrangleSubPix( 
           const CvArr* src,  //输入图像 
           CvArr* dst,   // 提取的四边形
           const CvMat* map_matrix //2*3的变换矩阵
    );

    这个函数用以提取输入图像中的四边形,并通过map_matrix变换存储到dst中,与WarpAffine变换意义相同,

     

    即对应每个点的变换:

    WarpAffine与 GetQuadrangleSubPix 不同的在于cvWarpAffine 要求输入和输出图像具有同样的数据类型,有更大的资源开销(因此对小图像不太合适)而且输出图像的部分可以保留不变。而 cvGetQuadrangleSubPix 可以精确地从8位图像中提取四边形到浮点数缓存区中,具有比较小的系统开销,而且总是全部改变输出图像的内容。

     

    实践:图像旋转变换(原尺寸)

    首先用cvWarpAffine实验将图像逆时针旋转degree角度。

    //逆时针旋转图像degree角度(原尺寸)
    void rotateImage(IplImage* img, IplImage *img_rotate,int degree)
    {
    	//旋转中心为图像中心
    	CvPoint2D32f center;  
    	center.x=float (img->width/2.0+0.5);
    	center.y=float (img->height/2.0+0.5);
    	//计算二维旋转的仿射变换矩阵
    	float m[6];            
    	CvMat M = cvMat( 2, 3, CV_32F, m );
    	cv2DRotationMatrix( center, degree,1, &M);
    	//变换图像,并用黑色填充其余值
    	cvWarpAffine(img,img_rotate, &M,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,cvScalarAll(0) );
    }

    逆时针旋转30度结果:

    这里我们将新的图像还保留原来的图像尺寸。这样的效果显然不太好,我们通过计算相应放大图像尺寸。

     

    实践:图像旋转变换(保留原图内容,放大尺寸)

    需要计算新图的尺寸,示意图如下:

    所以新图size为(width*cos(a)+height*sin(a), height*cos(a)+width*sin(a))

    //旋转图像内容不变,尺寸相应变大
    IplImage* rotateImage1(IplImage* img,int degree){
    	double angle = degree  * CV_PI / 180.; // 弧度  
    	double a = sin(angle), b = cos(angle); 
    	int width = img->width;  
    	int height = img->height;  
    	int width_rotate= int(height * fabs(a) + width * fabs(b));  
    	int height_rotate=int(width * fabs(a) + height * fabs(b));  
    	//旋转数组map
    	// [ m0  m1  m2 ] ===>  [ A11  A12   b1 ]
    	// [ m3  m4  m5 ] ===>  [ A21  A22   b2 ]
    	float map[6];
    	CvMat map_matrix = cvMat(2, 3, CV_32F, map);  
    	// 旋转中心
    	CvPoint2D32f center = cvPoint2D32f(width / 2, height / 2);  
    	cv2DRotationMatrix(center, degree, 1.0, &map_matrix);  
    	map[2] += (width_rotate - width) / 2;  
    	map[5] += (height_rotate - height) / 2;  
    	IplImage* img_rotate = cvCreateImage(cvSize(width_rotate, height_rotate), 8, 3); 
    	//对图像做仿射变换
    	//CV_WARP_FILL_OUTLIERS - 填充所有输出图像的象素。
    	//如果部分象素落在输入图像的边界外,那么它们的值设定为 fillval.
    	//CV_WARP_INVERSE_MAP - 指定 map_matrix 是输出图像到输入图像的反变换,
    	cvWarpAffine( img,img_rotate, &map_matrix, CV_INTER_LINEAR | CV_WARP_FILL_OUTLIERS, cvScalarAll(0));  
    	return img_rotate;
    }

     

    实践:图像旋转变换(保留原图内容,放大尺寸)-2

    试一下用cvGetQuadrangleSubPix函数:

    //旋转图像内容不变,尺寸相应变大
    IplImage* rotateImage2(IplImage* img, int degree)  
    {  
    	double angle = degree  * CV_PI / 180.; 
    	double a = sin(angle), b = cos(angle); 
    	int width=img->width, height=img->height;
    	//旋转后的新图尺寸
    	int width_rotate= int(height * fabs(a) + width * fabs(b));  
    	int height_rotate=int(width * fabs(a) + height * fabs(b));  
    	IplImage* img_rotate = cvCreateImage(cvSize(width_rotate, height_rotate), img->depth, img->nChannels);  
    	cvZero(img_rotate);  
    	//保证原图可以任意角度旋转的最小尺寸
    	int tempLength = sqrt((double)width * width + (double)height *height) + 10;  
    	int tempX = (tempLength + 1) / 2 - width / 2;  
    	int tempY = (tempLength + 1) / 2 - height / 2;  
    	IplImage* temp = cvCreateImage(cvSize(tempLength, tempLength), img->depth, img->nChannels);  
    	cvZero(temp);  
    	//将原图复制到临时图像tmp中心
    	cvSetImageROI(temp, cvRect(tempX, tempY, width, height));  
    	cvCopy(img, temp, NULL);  
    	cvResetImageROI(temp);  
    	//旋转数组map
    	// [ m0  m1  m2 ] ===>  [ A11  A12   b1 ]
    	// [ m3  m4  m5 ] ===>  [ A21  A22   b2 ]
    	float m[6];  
    	int w = temp->width;  
    	int h = temp->height;  
    	m[0] = b;  
    	m[1] = a;  
    	m[3] = -m[1];  
    	m[4] = m[0];  
    	// 将旋转中心移至图像中间  
    	m[2] = w * 0.5f;  
    	m[5] = h * 0.5f;  
    	CvMat M = cvMat(2, 3, CV_32F, m);  
    	cvGetQuadrangleSubPix(temp, img_rotate, &M);  
    	cvReleaseImage(&temp);  
    	return img_rotate;
    }  

     

     

    实践:图像放射变换(通过三点确定变换矩阵)

    在OpenCV 2.3的参考手册中《opencv_tutorials》介绍了另一种确定变换矩阵的方法,通过三个点变换的几何关系映射实现变换。

    变换示意图如下:

    即通过三个点就可以确定一个变换矩阵。(矩形变换后一定为平行四边形)

    以下是基于OpenCV 2.3的代码(需至少2.0以上版本的支持)

    int main( )
    {
    	Point2f srcTri[3];
    	Point2f dstTri[3];
    	Mat rot_mat( 2, 3, CV_32FC1 );
    	Mat warp_mat( 2, 3, CV_32FC1 );
    	Mat src, warp_dst, warp_rotate_dst;
    	//读入图像
    	src = imread( "baboon.jpg", 1 );
    	warp_dst = Mat::zeros( src.rows, src.cols, src.type() );
    	// 用3个点确定A仿射变换
    	srcTri[0] = Point2f( 0,0 );
    	srcTri[1] = Point2f( src.cols - 1, 0 );
    	srcTri[2] = Point2f( 0, src.rows - 1 );
    	dstTri[0] = Point2f( src.cols*0.0, src.rows*0.33 );
    	dstTri[1] = Point2f( src.cols*0.85, src.rows*0.25 );
    	dstTri[2] = Point2f( src.cols*0.15, src.rows*0.7 );
    	warp_mat = getAffineTransform( srcTri, dstTri );
    	warpAffine( src, warp_dst, warp_mat, warp_dst.size() );
    	/// 旋转矩阵
    	Point center = Point( warp_dst.cols/2, warp_dst.rows/2 );
    	double angle = -50.0;
    	double scale = 0.6;
    	rot_mat = getRotationMatrix2D( center, angle, scale );
    	warpAffine( warp_dst, warp_rotate_dst, rot_mat, warp_dst.size() );
    	OpenCV 1.0的形式
    	//IplImage * img=cvLoadImage("baboon.jpg");
    	//IplImage *img_rotate=cvCloneImage(img);
    	//CvMat M =warp_mat;
    	//cvWarpAffine(img,img_rotate, &M,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,cvScalarAll(0) );
    	//cvShowImage("Wrap2",img_rotate);
    
    	namedWindow( "Source", CV_WINDOW_AUTOSIZE );
    	imshow( "Source", src );
    	namedWindow( "Wrap", CV_WINDOW_AUTOSIZE );
    	imshow( "Wrap", warp_dst );
    	namedWindow("Wrap+Rotate", CV_WINDOW_AUTOSIZE );
    	imshow( "Wrap+Rotate", warp_rotate_dst );
    	waitKey(0);
    	return 0;
    }

    变换结果:

     

    转载请注明出处:http://blog.csdn.net/xiaowei_cqu/article/details/7616044
    实验代码下载:https://github.com/xiaoweicqu/image-rotate/blob/master/main_rotate.cpp

    写在最后的一点点闲话

    之前一直用的2.1的版本,后来装了2.3,只是听说2.3很强大,但我刚开始学,用的也基础,完全没感觉出不同。直到今天忽然看到了2.3的手册,才发现从2.0开始函数和基本结构都有了很大的改变,而我一直还是用的1.0风格的函数(比如cvMat,cvLoadImage)。我的两个学习工具《Learnning OpenCV》和《OpenCV中文参考手册》都是基于1.0的,这也是我到今天才看到Mat,然后直接被惊艳到了。

    别人总结出来的东西能帮助我们在一开始迅速入门,但要学深,学精,终归还是要自己去努力挖的。

     

     

    展开全文
  • 平面几何和立体几何

    千次阅读 2017-06-15 17:21:25
    http://blog.csdn.net/pipisorry/article/details/73294222平面几何余弦定理和勾股定理余弦定理和勾股定理的几何图形解释[震惊!余弦定理和勾股定理竟然有这样的关系]点间距离、点线距离、线间距离两点间的距离已知...

    http://blog.csdn.net/pipisorry/article/details/73294222

    平面几何

    余弦定理和勾股定理

    余弦定理和勾股定理的几何图形解释

    [震惊!余弦定理和勾股定理竟然有这样的关系]


    点间距离、点线距离、线间距离

    两点间的距离

    已知平面上两点P1(x1,y1), P2(x2,y2)。分别过两点作x轴 和 y轴的垂线,在Rt△P1 QP2中,|P1 P2|2 = |P1 Q|2 + |P2 Q|2

    从图可知 |P1 Q| = |x2 – x1 |,|P2 Q| = |y2 –  y1 |

    代入可得两点间的距离公式:

    点到直线的距离

    若在平面坐标几何上的直线定义为ax + by + c = 0,点的座标为(x0, y0),则两者间的距离为:

    d =  \frac{\left|ax_0 + by_0 + c\right|}{\sqrt{a^2+b^2}}

    已知平面上的一点P(x0 ,y0)和直线l:Ax + By + C = 0.

    过点 P作 PN // x轴,PN ∩ l = N,  作 PM // y轴,PM ∩ l = M,作 PQ ⊥ l, PQ ∩ l = Q

    那么点P到直线上的距离就是 | PQ |,设 | PQ | = d,由三角形面积公式可得

    在Rt△MPN中,d · |MN | = | PM | · | PN |

    现在分别求出 | MN | 、 | PM |、| PN |

    ∵ M、N 两点在直线l上,PN // x轴, 把y0代入Ax + By + C = 0 可得点N的横坐标是 – (By0 + C) / A

    同理PM // y轴,把x0代入Ax + By + C = 0 可得点M的纵坐标是 – (Ay0 + C) / B

    其它证明方法参考[证明方法]

    点到平面的距离

    若点坐标为(x_0,y_0,z_0),平面为Ax+By+Cz+D=0,则点到平面的距离为:

    d = \frac{\left|Ax_0+By_0+Cz_0+D\right|}{\sqrt{A^2+B^2+C^2}}

    点到n维超平面的有符号正交(垂直)距离

    考虑任意一点 x 和它在决策面上的投影 x ⊥ ,我们有

    将 这 个 等 式 的 两 侧 同 时 乘 以 w T , 然 后 加 上 w 0 , 并 且 使 用 y(x) = w T + w 0 以及 y(x ⊥ ) = w T x ⊥ + w 0 = 0 ,我们有


    二维线性判别函数的几何表示。决策面(红色)垂直与 w ,它距离原点的偏移量由偏置参数 w 0 控制。此外,一个一般的点 x 与决策面的有符号的正交距离为 y(x)/∥w∥ 。

    [PRML]

    [计算几何算法4. 关于平面以及点到平面的距离]


    两条平行线间的距离

    若直线分别为ax + by + c1 = 0,和ax + by + c2 = 0,则两者间的距离为:

    d = \frac{\left|c_1-c_2\right|}{\sqrt{a^2+b^2}}

    夹在两条平行线间公垂线段的长。可取其中任何一条直线上的一点作另一条平行线的垂线,再用点到直接的距离公式求出的距离,便是两条平行线间的距离。如何选取点? —— 选直线与x轴或y轴的交点, 这样可使(x0 ,y0)中的一个为0,计算更方便。


    两平行平面间的距离

    若两平行平面分别为 Ax + By + Cz + D1 = 0 和 Ax + By + Cz + D2 = 0,则两者间的距离为:

    d = \frac{\left|D_1-D_2\right|}{\sqrt{A^2+B^2+C^2}}
    [wikipedia 距离]
    [点间距离、点线距离、线间距离]
    皮皮blog



    立体几何

    球体积公式

    n维球体积公式

    Vn(r)=πn/2Γ(n2+1)rn

    D 维空间的半径为 r 的球体的体积一定是 r^D 的倍数,因此我们有VD (r) = K_D * r^D。其中常数 K D 值依赖于 D 。

    n维球表面积公式

    Sn(r)=2πn/2Γ(n2)rn1


    [鬼斧神工:求n维球的体积]

    3维球体积公式

    V = ⁴⁄₃πr³


    在三维空间中建立的几何直觉会在考虑高维空间时不起作用。即高维球体中质量并不是均匀分布的!

    示例

    考虑 D 维空间的一个半径 r = 1 的球体,请问,位于半径 r = 1 − ε 和半径 r = 1 之间的部分占球的总体积的百分比是多少?

    我们要求解的体积比就是
    (V D (1) − V D (1 − ε)) / V D (1) = 1 − (1 − ε) ^D
    我们看到,对于较大的 D ,这个体积比趋近于1,即使对于小的 ε 也是这样。因此,在高维空间中,一个球体的大部分体积都聚集在表面附近的薄球壳上!

    皮皮blog

    from: http://blog.csdn.net/pipisorry/article/details/73294222

    ref:


    展开全文
  • 几何为什么叫几何

    千次阅读 2017-03-16 22:37:17
    几何”名称的由来——科学家徐光启 学过数学的人,都知道它有一门分科叫作“几何学”,然而却不一定知道“几何”这个名称是怎么来的。在我国古代,这门数学分科并不叫“几何”,而是叫作“形学”。“几何”二字,...
  • 几何畸变

    千次阅读 2019-04-02 17:18:04
    几何畸变(geometric distortion):指遥感成像过程中,受多种因素的综合影响,原始图像上地物的几何位置、形状、大小、尺寸、方位等特征与其对应的地面地物的特征往往是不一致的,这种不一致就是几何变形,也称几何...
  • 计算几何

    千次阅读 2019-01-04 16:55:10
    2.深刻的认识到计算几何用向量而不用解析几何。 3.图形的记录 (1):点,向量。这两个是差不多的。 (2):线:直线上一点和直线的方向向量。 (3):线段:只需要记录左右端点即可。。。。 4.正弦定理: ...
  • 积水几何

    千次阅读 2021-03-03 09:21:11
    积水几何 将非负整数数组视为宽度为1的柱状图,编写函数,统计这样的柱状图能够积下的雨水有多少。注意,雨水只会存储于两边均更高的地方。 输入样例: 第一行是数组的长度,第二行是空格分隔的非负整数若干。 9 2 1...
  • 遥感图像——几何畸变和几何校正

    万次阅读 多人点赞 2018-03-23 20:06:38
    1 几何畸变 遥感成像过程中,传感器生成的图像像元相对于地面目标物的实际位置发生了挤压、拉伸、扭曲和偏移等问题。 几何畸变产生的原因:1)传感器内部因素;2)遥感平台因素;3)地球因素。 因为存在几何畸变...
  • 几何校正

    千次阅读 2017-11-14 16:58:10
    在 ENVI 中,提供了丰富的几何校正的工具,比如: 针对低空间分辨率影像,提供基于自带定位信息的几何校正工具 Georeference by GLT;针对中等空间分辨率影像,提供交互式的几何校正工具 Select GCPs: Image to ...
  • 代数几何

    2018-09-17 23:12:00
    饭高茂:《代数几何》第一章。几乎零起点的好书。最近好像贴吧里还是有些同志不知道学代数几何从哪开始,我是从这开始的,觉得不错。我一般很喜欢跟别人介绍经验,原因有二:一,智商较低,不会对苛求其他人。二,我...
  • 微分几何、黎曼几何思想

    千次阅读 2016-12-14 09:57:31
    微分几何、黎曼几何思想(1)物理规律与坐标选取无关尽管任何有用的实际计算都是在某个坐标系下进行的,但计算结果表达的物理规律却是独立于坐标系而存在的。这也是为什么要将描述的物理规律的方式式写成‘张量’...
  • 计算几何汇总

    2019-10-17 00:37:30
    计算几何系列汇总 计算几何——点、直线(线段)、向量、多边形、圆类 计算几何——向量的叉乘、点乘、夹角 计算几何——点到直线的距离、投影点 计算几何——判断点是否在线段上 计算几何——判断两线段是否相交 ...
  • 几何体类型

    2019-03-04 16:30:54
    立方几何体(BoxGeometry) 圆形几何体(CircleGeometry) 圆锥几何体(ConeGeometry) 圆柱几何体(CylinderGeometry) 十二面几何体(DodecahedronGeometry) 边缘几何体(EdgesGeometry) 挤压几何体...
  • 几何学包罗万象,分支众多,其分类其实并不是绝对的,我们从几何学的发展大致可以将它分为欧氏几何与非欧几何,非欧几何又分为罗氏几何和黎曼几何、仿影几何和拓扑几何等. 欧氏几何 欧氏几何开始研究的是直线和二...
  • 黎曼几何

    2014-01-12 19:43:31
    欧氏几何—罗式几何—黎曼几何    欧氏几何、罗氏几何、黎曼几何是三种各有区别的几何。这三中几何各自所有的命题都构成了一个严密的公理体系,各公理之间满足和谐性、完备性和独立性。因此这三种几何都是正确的...
  • 从球面几何到非欧几何

    千次阅读 2016-06-22 17:21:16
    1. 球面几何如果将球面上的大圆视为直线,那么球面上的几何就展现了一种椭圆几何。 在这种几何中,任何两条直线都相交,而且交于两个交点; 三角形内角和大于180°(两条经线分别与赤道交于A,B,和北极交于 C),两...
  • 04 Geometry几何

    千次阅读 2018-10-08 17:17:27
    前一节讲解了一下场景的结构和基类THREE.Object3D,对Three.js...Three.js内置了很多的几何体种类,如:立方体、三棱锥、球、八面体、十二面体、二十面体等等,这一节我们将介绍一下这些类型几何体的模型创建和几何...
  • 几何平均数

    2018-11-19 09:29:00
    几何平均数是n个变量值连乘积的n次方根。[2] 分为简单几何平均数与加权几何平均数。 1、简单几何平均数: 几何平均数示意图 2、加权几何平均数: 转载于:...
  • 几何对象定义空间位置和关联几何形状。 讨论 在许多地理处理工作流中,您可能需要使用坐标和几何信息运行特定操作,但不一定想经历创建新(临时)要素类、使用光标填充要素类、使用要素类,然后删除临时要素类的...
  • 计算几何VS解析几何

    千次阅读 2013-07-05 21:26:42
    解析几何是用代数的方法去解决问题,虽然不是为一种好的思路,但是很多时候需要付出昂贵的代价,比如精度! 而计算几何更多的是从几何角度,用向量的方法避免了这一尴尬的现象! 判断两线段相交,任一线段的端点在...
  • ACM计算几何

    万次阅读 多人点赞 2018-08-19 01:24:05
    1.1 计算几何算法 1.2 计算几何题目特点及要领 1.3 预备知识 2 凸包 2.1 定义 2.1.1 凸多边形 2.1.2 凸包 2.2 颜料配色问题 2.2.1 问题描述 2.2.2 问题简化 2.2.3 问题抽象 2.2.4 数学抽象 2.2....
  • 几何原本

    2016-03-12 11:49:26
    最近无聊,看了看几何原本,打算做一个长期直播,不喜勿喷。
  • 几何类库 Revit API 提供了一套完整的几何库。既然是几何库,那就逃不过这些概念:点、线、面、体。 那么,对于任意的几何库,实际上,你要关系的东西逃不过下面的表格,(点 / 线 / 面 / 体)与(点 / 线 / 面 / 体...
  • 图像几何变形一般分为两大类:系统性和非系统性。系统性一般有传感器本身引起的,有规律可循和可预测性,可以用传感器模型来校正,卫星地面接收站已经完成这项工作;非系统性几何变形是不规律的,它可以是传感器平台...
  • 几何分布和超几何分布

    千次阅读 2012-10-11 09:34:31
    1)超几何分布的模型是不放回抽样 2)超几何分布中的参数是M,N,n X ~ H (n,M,N) 例 N个球 有M个黑球 取 n个黑球  则 EX = nM/N 2. 有放回的期望也是 nM/N 3. 一个口袋里有5个白球
  • 什么是椭圆几何与双曲几何

    千次阅读 2015-06-30 07:07:08
    什么是椭圆几何与双曲几何? 平时我们所研究的几何,称欧几里得几何(欧氏几何),  随着数学的发展,建立了新的几何学,一般称非欧几里得几何,其中有两类,一类称双曲几何,也称罗巴切夫斯基几何;一类称...
  • 1.4 几何概率

    千次阅读 2020-01-20 13:21:27
    下面,我们简介一种可以解决一部分“有无限多结果而又具有某种等可能性”的概率问题的方法:几何概率。
  • 欧式几何与非欧式几何

    千次阅读 2012-02-28 15:15:16
    “欧氏几何”。几何学的一门分科。公元前3世纪,古希腊数学家欧几里得把人们公认的一些几何知识作为定义和公理,在此基础上研究图形的性质,推导出一系列定理,组成演绎体系,写出《几何原本》,形成了欧氏几何。在...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 83,915
精华内容 33,566
关键字:

几何