• 齐次坐标(Homogeneous Coordinate)介绍


    1、前言

    “齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换。”—— F.S. Hill, JR。

    2、介绍

    2.1 为何引入齐次坐标

    对于一个向量v以及基oabc,可以找到一组坐标(v1,v2,v3),使得v = v1 a + v2 b + v3 c (1)

    而对于一个点p,则可以找到一组坐标(p1,p2,p3),使得 po = p1 a + p2 b + p3 c (2)

    从上面对向量和点的表达,我们可以看出为了在坐标系中表示一个点(如p),我们把点的位置看作是对这个基的原点o所进行的一个位移,即一个向量:po(有的书中把这样的向量叫做位置向量——起始于坐标原点的特殊向量),我们在表达这个向量的同时用等价的方式表达出了点p:p = o + p1 a + p2 b + p3 c (3)

    公式(1)(3)是坐标系下表达一个向量和点的不同表达方式。这里可以看出,虽然都是用代数分量的形式表达向量和点,但表达一个点比一个向量需要额外的信息。如果我写出一个代数分量表达(1, 4, 7),谁知道它是个向量还是个点!
    我们现在把(1)(3)写成矩阵的形式:
    v = (v1 v2 v3 0) X (a b c o)T
    p = (p1 p2 p3 1) X (a b c o)T,

    这里(a,b,c,o)是坐标基矩阵,右边的列向量分别是向量v和点p在基下的坐标。这样,向量和点在同一个基下就有了不同的表达:3D向量的第4个代数分量是0,而3D点的第4个代数分量是1。像这种这种用4个代数分量表示3D几何概念的方式是一种齐次坐标表示。

    这样,上面的(1, 4, 7)如果写成(1,4,7,0),它就是个向量;如果是(1,4,7,1),它就是个点。下面是如何在普通坐标(Ordinary Coordinate)和齐次坐标(Homogeneous Coordinate)之间进行转换:
    (1)从普通坐标转换成齐次坐标时
    如果(x,y,z)是个点,则变为(x,y,z,1);
    如果(x,y,z)是个向量,则变为(x,y,z,0)
    (2)从齐次坐标转换成普通坐标时
    如果是(x,y,z,1),则知道它是个点,变成(x,y,z);
    如果是(x,y,z,0),则知道它是个向量,仍然变成(x,y,z)

    2.2 齐次坐标的性质

    1)对于一个普通坐标的点P=(Px, Py, Pz),有对应的一族齐次坐标(wPx, wPy, wPz, w),其中w不等于零。比如,P(1, 4, 7)的齐次坐标有(1, 4, 7, 1)、(2, 8, 14, 2)、(-0.1, -0.4, -0.7, -0.1)等等。即:如果把一个点从普通坐标变成齐次坐标,给x,y,z乘上同一个非零数w,然后增加第4个分量w;如果把一个齐次坐标转换成普通坐标,把前三个坐标同时除以第4个坐标,然后去掉第4个分量。
    2)当w不为零时,齐次点坐标(x, y, z, w)即三维空间点坐标(x/w, y/w, z/w);当w为零时,齐次点(x, y, z, 0.0)表示此点位于某方向的无穷远处。如:对于齐次坐标[a,b,h],保持a,b不变,h趋向于0,表示点沿直线 ax+by=0 逐渐走向无穷远处的过程。

  • 相关阅读:
    JavaScript【立即调用的函数(IIFE)、eval 命令、函数的应用、对象概述、对象属性、对象方法、函数应用注意事项、Math对象_静态属性、Math对象_静态方法一】(八)
    C++ realloc()用法及代码示例
    归并排序含非递归版
    Java基础——final关键字
    【深度学习】实验11 使用Keras预训练模型完成猫狗识别
    计数&桶&基数排序算法
    Android中activity详解
    VM16中安装CentOS7.4保姆级教程
    ARM GNU汇编代码分析
    基于JAVA排课系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
  • 原文地址:https://blog.csdn.net/wonengguwozai/article/details/126123349