精华内容
下载资源
问答
  • 坐标系和坐标转换

    2014-02-18 20:27:00
    一:坐标系、基准、坐标参照系之间的关系 1. 坐标参照系包括坐标系和基准两部分 ...若我们从维数上看又分为二维、三维、多维坐标系等。 3. 坐标系的选择仅仅决定了表示空间任一点时我们是用...

    一:坐标系、基准、坐标参照系之间的关系

    1. 坐标参照系包括坐标系和基准两部分

    2. 坐标系包括空间直角坐标系、空间大地坐标系、站心直角和极坐标系、曲面坐标系等。若我们从维数上看又分为二维、三维、多维坐标系等。

    3. 坐标系的选择仅仅决定了表示空间任一点时我们是用(X,Y)还是用(X,Y,Z)还是用(B,L,H)还是用(N,E,U)还是用(R,A,EL)等其中的某一特定的形式来表示。但是,需要特别指出的是-------选择了一种特定的坐标系,仅仅只能说明我们确定了用何种形式来表示点;我们还无法对点的坐标用具体的数值来量化。因为我们还没有确定我们选择的坐标系的原点在哪儿即通常所谓的定位工作还没做;同时,该坐标系的X轴,Z轴指向何方即通常所谓的定向工作也没有做。

    4. 根据上面的分析可以清楚地看到,在大地测量中基准主要就是指特定的参考椭球(其属性主要包括a,GM, f,J2等)、椭球定位(参心还是地心------一般坐标系原点位于椭球中心即椭球定位直接决定了坐标系的原点),定向(一般X轴就是-----椭球中心至赤道和格林尼治天文台平均子午线的交点-----的连线;Z轴一般平行地球自转轴;从而X,Y,Z形成右手正交坐标系)

    5. 当特定的基准和坐标系一旦确定后,一个特定的--------坐标参照系--------就确立了。

     

    二:坐标参照系和坐标参考框架之间的关系

    1. 坐标参照系定义明确且严密,然而非常抽象,很难把握

    2. 因而人们就想通过一些具体的比较直观的点来描述或者说来反应某一特定的坐标参照系,这些满足特定坐标参照系的点就是人们通常所谓的------坐标参考框架

    3. 通常人们之所以说参考框架是坐标参照系的实现是因为:在一组------都满足某种特定坐标参照系------的已知点之间,实际上隐含了定义一个坐标参照系所必须的--------坐标系和基准------信息。

    4. 一般而言,只要涉及与空间位置有关的问题,就会涉及坐标参照系;而涉及坐标参照系就必将会涉及参考框架。

     

    三:椭球的定位和定向

    1. 地球椭球:旋转椭球体与地球形体非常接近,旋转椭球面是一个形状规则的数学表面,在其上可以做严密的计算,而且所推算的元素(如长度、角度)同大地水准面上的相应元素非常接近。我们就把这种用来代表地球形状的椭球称为地球椭球

    2. 椭球定位:就是确定椭球中心的位置。分为两类:局部定位和地心定位。

    3. 局部定位:要求在一定范围内椭球面与大地水准面有最佳符合,而对椭球中心位置无特殊要求

    4. 地心定位:要求在全球范围内椭球面和大地水准面有最佳符合,同时要求椭球中心与地心重合或最为接近

    5. 椭球定向:实质上是指椭球旋转轴的指向

    6. 无论是局部还是地心定位,都必须满足两个平行条件:

    a. 椭球短半轴平行于地球自转轴

    b. 大地起始子午面必须平行于天文起始子午面。这两个条件是认为规定的,目的在于简化大地坐标、大地方位角同天文坐标、天文方位角之间的换算。

    7. 参考椭球:经过局部定位和定向后,同特定地区大地水准面有最佳符合的地球椭球称为参考椭球

    8. 参心坐标系:以参考椭球为基准的坐标系

    9. 总地球椭球:除了满足地心定位和双平行条件外,在确定椭球参数时能使它在全球范围内与大地体最为密合的椭球

    10. 地心坐标系:以总地球椭球为基准的坐标系

    11. 特别提醒:无论是参心坐标系还是地心坐标系都可分为空间直角坐标系和大地坐标系两种,并且这两种坐标系都与地球体固连在一起,与地球同步运动,因而都是地固坐标系。另外,它们若还是地心坐标系的话就称地心地固坐标系。与地固系相对应的--------与地球自转无关的空间固定的坐标系是天球坐标系/惯性坐标系。

    12. 参考椭球定位定向的实现:选择椭球、确定椭球中心位置、确定椭球指向、建立大地原点。定位又分为一点定位和多点定位。

    13. 大地原点和大地起算数据:原点一般选在特定范围的中心位置;其坐标通过各种方法综合确定,一般精度较高-------特别提醒:大地原点坐标决不是(0、0、0),而是和大地原点在椭球上所处的具体位置密切相关的(Bk,Lk,Hk),另外还要给出大地原点至另外一点的大地方位角Ak

    一:需要用到的几个基本概念-------- 球面坐标系

    1. 几个常涉及到的名词的中英文对照:地形面(Topography);大地水准面(Geoid);参考椭球面(Reference Ellipsoid);基准(Datum);

    2. 基准:就是一组用于描述其他量的量,比如,描述空间位置的基准为位置基准;描述时间的基准为时间基准。具体的例子如:位置基准-----椭球有原点、尺度、定向;时间基准-----起点、尺度等。

    3. 坐标系转换:首先坐标参照系是由基准和坐标系两部分构成的,坐标系转换实质上是在基准相同的情况下,坐标系之间的相互转换。比如:在同一基准下(即地球椭球的参数、定位、定向等不变),同一个点既可以用空间直角坐标表示,也可以用大地坐标表示;或者在站心坐标系中,同一个点级可以用站心地平坐标表示,也可以用站心极坐标法表示。(从这我们也就很容易地明白了:基准转换实质上是基准发生了变化即椭球及其定位定向发生了改变)(无论基准和坐标系哪一个发生了变化就会导致坐标参照系的改变)

    4. 基准转换:实质上是将同一点从某一个基准或坐标参照系下的坐标转换到另一种坐标基准或者坐标参照系下去,即两种基准(椭球参数、定位、定向)之间的转换。比如:旧BJ54坐标系下的坐标和CGCS2000大地坐标系之间的转换(因为前者是参心坐标系,后者是地心坐标系)

    5. 大地基准:是指用于定义地球参考椭球的一系列参数,主要包括:

    椭球的大小和形状-----只要有长半轴a(Semo--major Axis)和扁率 f (Flattening)即可(注意扁率和偏心率不是一个概念),其他参数均可由他们两个推导得出;

    椭球短半轴(Semi--minor Axis)指向(Orientation):通常与地球的自转轴平行;(另外它还和极移和章动有联系)

    椭球中心的位置:根据需要确定,若为地心则称为地心椭球,否则称为参心椭球;(注意参考和参心的不同含义)

    本初子午线(Prime Meridian):通过固定平极和经度原点的天文子午线,通常称为格林尼治子午线。

    6. 大地坐标系:以大地基准为基础建立的坐标系称为大地坐标系,也称为椭球坐标系,用(B,L,H)来表示空间任一点的位置。其中,H是该点沿该点处法线至参考椭球面的距离即是我们通常所说的大地高。一般在工程测量当中我们很少使用大地高,而是使用正高或者正常高:

    正高:是空间任一点沿该点处垂线至大地水准面的距离(与大地高的基准面不一样)。

    正常高:由于高程方向上的重力值很难精确表达出来,所以引入距离方向上的重力平均值来进行确定高程值,相应的基准面就是似大地水准面,因为它与大地水准面十分接近。

    大地水准面差距(N):指的就是空间任一点大地高与正高的差值-------H(大地高)=H(正高)+N;

    高程异常(sita): 指的就是空间任一点大地高与正常高的差值-------H(大地高)=H(正常高)+sita

    问题:工程测量当中,平面位置与高程位置的控制分开的主要原因是-------我们虽然可以通过GPS精密单点定位或者差分方法得到精度相当高的(X,Y,Z)或者(B,L,H),但是他们都是以椭球参考面为基准的,然而我们却无法精确确定大地水准面差距或者高程异常,因而高程方向的精度一般通过GPS等方法获得的比较低,从而导致我们工程测量当中常常还是采用精密水准测量的方法进行高程控制。

    7. 空间直角坐标系/笛卡尔坐标系:实质上点的空间直角坐标就是该点到坐标系原点形成的向径在三个坐标轴上的投影;一般坐标系原点选在参考椭球的中心(参考椭球分为地心椭球和参心椭球),X轴指向本初子午线与赤道的交点,Z轴与地球自转轴平行并指向参考椭球的北极,最终与Y轴形成右手直角坐标系。一般用(X,Y,Z)来表示任一点的空间位置。

    8. 站心坐标系:分为站心地平坐标系(又称直角坐标系并且是左手系)和站心极坐标系:

    站心地平坐标系:它是以测站标石中心为坐标系原点;

    以该点出椭球法方向为U轴(uppering);

    以与U轴垂直并且指向Z轴的方向为N轴(northing);

    以东方向为E轴(easting);

    从而形成左手系。

    站心地平极坐标系:以测站标石中心为原点;NU轴所在平面为起始平面;顺时针为正方向,空间任一点到原点为向径;从而形成的的坐标系。

    二:需要用到的几个基本概念-------- 平面坐标系/格网坐标

    前言:虽然空间任一点我们都可以在球面坐标系下描述其具体位置,但是在实际应用当中,我们还是习惯于在一个平面二维坐标系中来确定一个点的位置。由球面坐标系转换到平面二维坐标系是通过所谓的“投影(Projection)”方法实现的,其投影函数的数学表达方式为:

    x=f1(B,L)

    y=f2(B,L)

    其中x,y为平面系下的坐标;B, L为任一点的大地坐标系的经纬度;f1,f2为单值、连续、有界的投影函数。在一些文献和软件中也称平面坐标为格网坐标。

    1. 横轴墨卡托投影:也称为高斯正形投影、高斯--克吕格投影或者高斯投影,我国统一采用高斯投影,一般在工程测量当中采用3度带或6度带投影法,为尽可能减少由球面坐标系转换到平面坐标系时带来的变形影响,在精密程度要求较高的工程项目当中一般采用3度带法。

    6度带中央子午线经度L=6n-3;其中n是带数标号,起始编号为1,即第一带的中央子午线的经度为3度。我国的经度为69度至135度共跨12带。

    3度带的中央子午线一般与6度带的重合,一般和6度带的边沿重合,其中央子午线经度的计算公式为:L=3n;

    其中n=1,2,3,。。。

    按照目前我的测绘法规规定:在国内进行测量工作时,在需要进行球面坐标系到平面坐标系的转换时,统一采用高斯投影法。

    2. 通用横轴墨卡托投影(UTM):有些西方国家为了控制投影带边沿的变形,采用之。它的显著特点是:投影后中央子午线的长度发生变化,与原来的比值为0.9996.它与高斯投影坐标之间的关系用公式表示如下:

    x(U)=0.9996 x(G)

    y(U)=0.9996 y(G)

    三:常用的地球参照系和参考框架

    1. 地球参照系:是一种地固系,一种固定在地球上随地球一同旋转的坐标系。同样根据地球参照系原点选取的不同分为地心系和参心系。

    2. 协议地球参照系(CTRS):是一种相对地球固定的地心系

    目的:主要是为了解决全球坐标参照系不统一带来的各种问题和不便。

    协议地球参照系:Conventional Terrestrial Reference System(英文名称)

    原点:地球质心

    Z轴:指向协议地极CTP(Conventional Terrestrial Pole),即是1900----1905年间地极的平均位置

    X轴:指向协议赤道与格林威治子午圈的交点,最终与Y轴一起形成右手坐标系

    3. 协议地球框架(CTRF):是一组-------具有指定协议的地球参照系下的-------具有精确坐标的点。这些点即协议地球框架是刚述及的协议地球参考系的实现。CTRF(Conventional Terrestrial Reference )

    4. GPS测量定位中的地球参照系和参考框架

    在卫星导航定位系统中,轨道数据通常是地心地固系(ECEF----Earth-Centered Earth-Fixed)下的数据,只有这样才能保证最终的定位结果和轨道数据同属于相同的坐标参照系,以方便进行相关计算。

    目前,较为常用的GPS卫星轨道数据主要有两种:基于WGS-84的广播星历和基于国际地球参考框架(ITRF)的IGS精密星历。

    WGS-84地球参照系:若测量定位时采用的是广播星历,则结果属于WGS-84系。

    WGS-84地球参照系是一个协议地球参照系,是一个地心地固右手正交坐标系。其定义的准则如下:

    a. 为地心系,原点位于包括海洋和大气在内的整个地球的质心

    b. 尺度在局部地球框架下,遵守相对论原理

    c. 初始定向由国际时间局(BIH)1984.0的定向给定

    d. 定向中的时变不会使地壳产生残余的全球性旋转

    根据上述准则,WGS-84协议地球参照系的定义如下:

    a. 原点位于地球质心(Earth's Center of Mass)

    b. Z轴与IERS(国际地球自转及参照系服务-----International Earth Rotation and Reference System Service)参考极(IRP---IERS Reference Pole)指向相同,该指向与1984.0历元的BIH协议地极(CTP-----Conventional Terrestrial Pole)一致

    c. X轴指向IERS参考子午线(IRM)与过原点且垂直于Z轴平面的交点

    d. Y轴最终完成右手地心地固正交系

    国际地球参照系(ITRS-----International Terrestrial Reference System)是由IERS所定义的一个协议地球参照系,其定义满足如下条件:

    a. 原点位于地球质心,地球质心为包括海洋和大气在内的整个地球的质心

    b. 长度尺度为国际单位制米

    c. 初始定向为国际时间局(BIH)所给出的1984.0定向

    d. 定向的时变通过一个关于全球水平运动构造运动的非净旋转条件

    国际地球参考框架:是ITRS的实现,是由一组具有ITRS下坐标和速度估值的IERS观测站组成,并由IERS中心局的地球参考框架部负责建立和维护。下面仅以ITRF2000的基准定义为例说明:

    a. 尺度:通过将ITRF2000与VLBI 和所有可靠SLR解的加权平均值之间的尺度和尺度扁率设为0来实现

    b. 原点:(略)

    c. 定向:(略)

    5. 我国常用坐标参照系

    A. 旧1954北京坐标系(参心坐标系)

    1954北京坐标系是我国目前广泛采用的大地测量坐标系。该坐标系源自于前苏联1942年普尔科夫坐标系。

    椭球:克拉索夫斯基椭球

    长半轴a:6378245m

    扁率f:1/298.3

    高程:以1956年青岛验潮站的黄海平均海水面为基准

    缺点:(包括3个方面,后续)

    B. 1980西安大地坐标系(参心坐标系)

    原因:a. 1954坐标系椭球参数长半轴有108m的差距与现在的精确值

    b. 参考椭球面与我国大地水准面之间存在自西向东的系统性倾斜,东部差距达68m

    c. 几何大地测量和物理大地测量应用的参考面不统一。重力数据处理时采用的是赫尔默特正常重力公式,与其相应的椭球为赫尔默特椭球,这与克拉索夫斯基椭球不一致。

    d. 定向不明确:克拉索夫斯基椭球短半轴既不指向CIO也不指向我国地极原点JYD1968.0;同时其起始子午面也不是国际时间局所定义的格林尼治平均天文台子午面。这给坐标换算带来了很多麻烦。

    e. 1954坐标系还是按局部平差逐步提供大地点成果的,因此不可避免地会出现一些矛盾和不够合理的地方。

    原则:a. 全国天文大地网整体平差要在新的坐标系的参考椭球面上进行。为此首先需要建立一个新的大地坐标系,并名之为1980国家大地坐标系;

    b. 1980国家大地坐标系的大地原点定在我国中部。具体选在陕西泾阳县永乐镇

    c. 采用国际大地测量和地球物理联合会1975年推荐的四个地球椭球参数(a,J2,GM,omega),并根据这四个参数求解椭球扁率和其它参数。(a=6378140m;GM=3.986005*pow(10,14);J2=1.08263*pow(10,-8);omega=7.292115*pow(10,-5))

    d. 1980年国家大地坐标系的椭圆短半轴平行于地球质心指向我国地极原点JYD1968.0方向;大地起始子午面平行于格林尼治天文台的平均子午面

    e. 高程方向的约束条件:椭球定位参数以我国范围内----高程异常值平方和------最小。

    优点:a. 参心坐标系是在1954北京坐标系的基础上建立起来的(参见《大地测量学》162页(20-8)式)

    b. 椭球面同似大地水准面在我国境内最为密合,并且是多点定位

    c. 定向明确

    d. 大地原点位置居中,比较适当

    e. 大地高程基准采用1956黄海高程系

    C. 新1954北京坐标系

    原因:由于1954旧坐标系存在时间较长,而它又与GDZ80两者之间的差距较大,所以给成果的使用带来了很大的不便。促使人们建立一个介于两者之间的新1954坐标系。

    特点:a. 新BJ54是-------在GDZ80的基础上,改变GDZ80的IUGG1975椭球几何参数为克拉索夫斯基椭球参数;并将GDZ80坐标原点进行平移-------从而建立起来的。

    b. 综合GDZ80和旧BJ54建立起来的

    c. 采用多点定位,但椭球面与大地水准面在我国境内不是最佳拟合

    d. 定向明确。与GDZ80平行

    e. 大地原点与GDZ80相同,但是大地起算数据不同(注意区分参考椭球中心或者坐标系原点与大地原点的区别)

    f. 与旧BJ54相比,所采用的椭球参数相同,定位相近,但是定向不同。

    g. 旧BJ54是局部平差,新BJ54是GDZ80整体平差结果的转换值,因此,新旧BJ54之间并无全国范围内统一的转换参数,只能进行局部转换。

    D. 2000国家大地坐标系

    原因:a. 目前,我国实际使用的1954BJ坐标系和GDZ80坐标系,实质上都只是“参心”坐标系。

    b. 随着科学技术的进步,越来越多的实际应用要求建立和采用“地心”坐标系

    c. 空间定位技术的发展,使得建立高精度的“地心”坐标系称为可能

    顺应时代的潮流和要求,我国提出并建立了2000国家大地坐标系CGCS2000(China Geodetic Coordinate System 2000)。

    地心系CGCS2000的定义如下:

    a. 原点:包括海洋和大气在内的整个地球的质心

    b. 长度单位:国际单位制m,与局部地心框架下的地心坐标时一致,通过适当的相对论模型获得

    c. 定向:初始定向由1984.0时的BIH 定向给出

    d. 定向的时变:定向的时变不产生相对于地壳的残余全球旋转

    e. CGCS2000大地坐标系是右手地固直角坐标系(直角坐标系包括笛卡尔空间直角坐标系(X、Y、Z)和空间大地直角坐标系(B、L、H))。原点位于地球质心;Z轴与IERS参考极(IRP)方向一致,X轴为IERS参考子午面(IRM)与垂直于Z轴的赤道面的交线,Y轴与Z轴、X轴垂直并最终形成右手正交系。

    参考椭球采用2000参考椭球,其相应参数为:

    a=6378137m

    GM=3.986004418*pow(10,14)

    J2=0.001082629832258

    omega=7.292115*pow(10,-5)

    四、.坐标转换

    易混淆的两点:“坐标参照系和基准”、“坐标参照系和坐标系”

    a. 首先,前面已经述及:坐标参照系包括基准和坐标系两部分。

    b. 任一特定的基准和任一特定的坐标系的组合都形成特定地一个坐标参照系。

    c. 坐标系包括空间直角(X,Y,Z)、大地坐标系(B,L,H)、站心直角(N,E,U)和站心极坐标系(R,A,EL)等,但是我们这里说的坐标系没有指定其原点位置和坐标轴指向即它只是“无根的浮萍”。

    d. 基准的作用就是给特定的坐标系进行特定的定位和定向。因此,一个坐标参照系必须同时包括基准和坐标系两个部分才完整。

    原因:主要是由于不同坐标系、不同基准和不同坐标系的存在,导致常常需要在他们之间进行相互转换。转换分为两个基本类型:1. 坐标系转换 2. 基准转换

    一:坐标系转换

    定义:指的是同一点的坐标------在相同基准--------由一种坐标系下的坐标转换为另一种坐标系下的坐标。比如,同一坐标参照系下空间直角坐标与大地坐标之间的转换;站心地平到站心极坐标之间的转换-----共同的特点是:1. 坐标系转换不涉及基准转换(即不涉及椭球参数及其定位和定向的转换,也即它们不变) 2. 坐标系转换中的两种坐标实际上是同一点不同坐标表达方式间的变换,具有一一对应的关系。

    二、基准转换

    定义:就是两种坐标系由于采用的椭球参数、定位、定向或者由于尺度设置不同等原因导致两种基准之间的变换。基准变换和坐标系变换是本质上的区别。基准变换常见的是地心系与参心系之间的变换。

    基准变换常见的使用方法有:布尔沙-沃尔夫模型和莫洛金斯基模型

    转载于:https://www.cnblogs.com/haba/p/3554865.html

    展开全文
  • 多维张量的几何理解

    2021-02-13 20:24:32
    运行结果: Tensor("Const_3:0", shape=(3, 4, 2), dtype=float16) 几何表示: 4、四维张量(图像仅用于理解,坐标系axis已经不再适用) #四维张量 const4 = tf.constant([ #第一个3行4列深度为2的三维张量 [[[1, 2],...

    张量理解

    Tensor是Tensorflow中最基础的数据结构,常常翻译为张量,可以理解为n维数组或矩阵,相关函数:

    constant(value, dtype=None, shape=None, name='Const', verify_shape=False)
    

    在这里插入图片描述

    0、零维张量

    import tensorflow as tf
    
    #零维张量
    const0 = tf.constant(1, tf.float16)
    print(const0)
    

    运行结果:

    Tensor("Const:0", shape=(), dtype=float16)
    

    1、一维张量

    #一维张量,长度为4
    const1 = tf.constant([1, 2, 3, 4], tf.float16)
    print(const1)
    

    运行结果:

    Tensor("Const_1:0", shape=(4,), dtype=float16)
    

    几何表示:
    在这里插入图片描述

    一维张量没有行和列的概念,只有长度的概念。上述的const1就是长度为4的一维张量,或者称为向量。
    上面的图仅为示意,代表一维张量只有axis=0这个方向,并不是指这是一个4行的向量。事实上,tensorflow在做一些运算时,反而经常把1行N列的二维张量简化成一个长度为N的一维向量。

    2、二维张量

    #二维张量,3行4列
    const2 = tf.constant([
                         [1, 2, 3, 4],
                         [5, 6, 7, 8],
                         [9, 10, 11, 12]
                         ], tf.float16)
    print(const2)
    

    运行结果:

    Tensor("Const_2:0", shape=(3, 4), dtype=float16)
    

    几何表示:
    在这里插入图片描述
    3、三维张量

    #三维张量,3行4列深度为2的张量
    const3 = tf.constant([
                         [[ 1,  2], [ 3,  4], [ 5,  6], [ 7,  8]],
                         [[11, 12], [13, 14], [15, 16], [17, 18]],
                         [[21, 22], [23, 24], [25, 26], [27, 28]]
                         ], tf.float16)
    print(const3)
    

    运行结果:

    Tensor("Const_3:0", shape=(3, 4, 2), dtype=float16)
    

    几何表示:
    在这里插入图片描述

    4、四维张量(图像仅用于理解,坐标系axis已经不再适用)

    #四维张量
    const4 = tf.constant([
                         #第一个3行4列深度为2的三维张量
                         [[[1,  2], [ 3,  4], [ 5,  6], [ 7,  8]],
                         [[11, 12], [13, 14], [15, 16], [17, 18]],
                         [[21, 22], [23, 24], [25, 26], [27, 28]]
                         ],
                         #第二个3行4列深度为2的三维张量
                         [[[1,  2], [ 3,  4], [ 5,  6], [ 7,  8]],
                         [[11, 12], [13, 14], [15, 16], [17, 18]],
                         [[21, 22], [23, 24], [25, 26], [27, 28]]]
                         ], tf.float16)
    print(const4)
    

    运行结果:

    Tensor("Const_4:0", shape=(2, 3, 4, 2), dtype=float16)
    

    几何表示:
    在这里插入图片描述

    如何判断一个张量的batch数、行、列、深度:

    const4 = tf.constant([
                         #第一个3行4列深度为2的三维张量
                         [[[1,  2], [ 3,  4], [ 5,  6], [ 7,  8]],
                         [[11, 12], [13, 14], [15, 16], [17, 18]],
                         [[21, 22], [23, 24], [25, 26], [27, 28]]
                         ],
                         #第二个3行4列深度为2的三维张量
                         [[[1,  2], [ 3,  4], [ 5,  6], [ 7,  8]],
                         [[11, 12], [13, 14], [15, 16], [17, 18]],
                         [[21, 22], [23, 24], [25, 26], [27, 28]]]
                         ], tf.float16)
    

    从左边开始数连续[的数量,最多有X个[说明是X维张量。上面的例子就是4维张量。
    以三维以上的张量为例:
    从左边开始数连续的[,最后一个[对应的]中一共两个元素,分别为1, 2,说明深度为2。
    接下来向左边数上一级[对应的]中一共有4个元素[1, 2], [ 3, 4], [ 5, 6], [ 7, 8],说明列为4。
    同理继续数上一级,得到3行,2个batch。

    小结:

    shape属性中的元素大于等于3时,可以用3维空间来理解。
    shape=(3, 4, 2`)时,表示3行4列深度为2的张量
    shape=(2, 3, 4, 2)时,表示有2个 3行4列深度为2的张量
    shape=(6, 2, 3, 4, 2)时,表示有6个四维张量,这个四维张量又可以表示为2个 3行4列深度为2的张量。

    shape中的属性分别与axis=0axis=1axis=2axis=3……对应,以此类推。当维度超过3时,上图几何中的坐标系表示就已经错误了。但是对于理解多维是有帮助的。


    作者:X_xxieRiemann 链接:https://www.jianshu.com/p/f34457c222c5 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    展开全文
  • 多维空间可视化Recently, I was working on a project where I was trying to build a model that could predict housing prices in King County, Washington — the area that surrounds Seattle. After looking at...

    多维空间可视化

    Recently, I was working on a project where I was trying to build a model that could predict housing prices in King County, Washington — the area that surrounds Seattle. After looking at the features, I wanted a way to determine the houses’ worth based on location.

    最近,我在一个项目中尝试建立一个可以预测华盛顿金县(西雅图周边地区)房价的模型。 在查看了这些功能之后,我想找到一种根据位置确定房屋价值的方法。

    The dataset included latitude and longitude and it was easy to google them to take a look at the houses, their neighborhoods, their distance from the water, etc. But with over 17000 observations, that was a fool’s task. I had to find an easier way.

    数据集包括纬度和经度,可以很容易地用谷歌浏览一下房屋,附近,距水的距离等。但是,通过17000多个观察,这是一个傻瓜的任务。 我必须找到一种更简单的方法。

    I had used Geographic Information Systems (GIS) only once before but not in Python. So I did what I do best: I googled, and ran into this amazing package called GeoPandas. I am going to let the GeoPandas team sum up what they do because they can say much better than I can.

    我以前只使用过一次地理信息系统(GIS),而没有在Python中使用过。 因此,我做了我最擅长的事情:我搜索了Google,并遇到了一个名为GeoPandas的惊人软件包。 我要让GeoPandas团队总结他们所做的事情,因为他们的发言能力比我更好。

    GeoPandas is an open source project to make working with geospatial data in python easier. GeoPandas extends the datatypes used by pandas to allow spatial operations on geometric types. Geometric operations are performed by shapely. GeoPandas further depends on fiona for file access and descartes and matplotlib for plotting. — Description from GeoPandas Website (2020)

    GeoPandas是一个开源项目,可简化使用python中的地理空间数据的工作。 GeoPandas扩展了熊猫使用的数据类型,以允许对几何类型进行空间操作。 几何运算是通过匀称进行的。 GeoPandas进一步依赖于fiona进行文件访问,并依赖笛卡尔matplotlib进行绘图。 — GeoPandas网站(2020)的说明

    This blew my mind, and what I wanted was really just the most basic of the features. I am going to show you how to run this code and do what I did — plotting accurate points on a map.

    这让我大吃一惊,而我想要的实际上只是最基本的功能。 我将向您展示如何运行此代码并完成我的工作-在地图上绘制准确的点。

    You are going to need several packages and some files in addition to the basic pandas and matplotlib. They include:

    除了基本的pandasmatplotlib外,您还需要几个软件包和一些文件 它们包括:

    • geopandas — the package that makes all of this possible

      geopandas-使所有这些成为可能的软件包
    • shapely — package for manipulation and analysis of planar geometric objects

      匀称 —用于处理和分析平面几何对象的程序包

    • descartes — provides a nicer integration of Shapely geometry objects with Matplotlib. It’s not needed every time but I import it just to be safe

      笛卡尔(笛卡尔) -将Shapely几何对象与Matplotlib更好地集成。 并非每次都需要它,但为了安全起见我将其导入

    • Any .shp file — this is going to be the backdrop of the plot. Mine is going to have King County, but you should be able to find one from any city’s data department. Don’t delete any files from the .zip file it comes in. Something always breaks.

      任何.shp文件-这将是情节的背景。 我的将有金县,但您应该可以从任何城市的数据部门中找到一个。 不要从它所包含的.zip文件中删除任何文件。总有东西会中断。

    More information about shapefiles can be found here, but the long and short of it is that these aren’t normal images. They are a vector data storage format that has information linking to locations — coordinates and the rest.

    关于shapefile的更多信息可以在这里找到,但总的来说,它们不是正常图像。 它们是矢量数据存储格式,具有链接到位置(坐标和其余位置)的信息。

    First I imported the basic packages that I needed and then the new packages:

    首先,我导入了所需的基本软件包,然后导入了新软件包:

    import matplotlib.pyplot as plt
    import numpy as np 
    
    
    
    
    from shapely.geometry import Point,Polygon
    import geopandas as gpd
    import descartes

    The Point and Polygon features are what help me match my data to the map I make.

    多边形功能可以帮助我将数据与我制作的地图进行匹配。

    Next, I load in my data. This is basic pandas but for those that are new, everything in quotations is the name of the file I had to access the housing records.

    接下来,我加载我的数据。 这是基本的大熊猫,但对于新熊猫,引号中的所有内容都是我必须访问房屋记录的文件的名称。

    df = pd.read_csv('kc_house_data_train.csv')

    With all of the packages imported and the data ready to go, I wanted to take a look at the map I was going to be plotting. I did this by finding a shape file made by the King County government website. They have done all the hard work of surveying and cataloging the land — it would be rude to not use their freely offered services. Loading in the shape file is easy and comparable to loading in a csv file with pandas.

    导入了所有软件包并准备好数据后,我想看一下我要绘制的地图。 我通过查找金县政府网站制作的形状文件来完成此操作。 他们已经完成了土地测量和分类的所有艰苦工作-不使用免费提供的服务是不礼貌的。 加载到shape文件中很容易,并且与使用pandas加载到csv文件中相当。

    kings_county = gpd.read_file('*file_path_here*/School_Districts_in_King_County___schdst_area.shp')

    You can open this up if you want to take a look at the data. The King County shape file was just a dataframe of locations matched with their school districts, geometry coordinates, and area. But the best part is when we plot it and yes, we have to plot it. This isn’t an image you can just call — it will have the coordinates built in so our data can be placed down like a point on a 5th grade (x,y) graph.

    如果要查看数据,可以打开此窗口。 金县形状文件只是与他们的学区,几何坐标和面积相匹配的位置的数据框。 但是最好的部分是当我们绘制它时,是的,我们必须绘制它。 这不是您只能调用的图像-它具有内置的坐标,因此我们的数据可以像5级(x,y)图上的点一样放置。

    Using the below code (notice how I edited it the same way I would edit a graph):

    使用下面的代码(注意,我以与编辑图形相同的方式对其进行编辑):

    fig, ax = plt.subplots(figsize = (15,15))
    kings_county.plot(ax=ax)
    ax.set_title('King County',fontdict = {'fontsize': 30})
    ax.set_ylabel('Latitude',fontdict = {'fontsize': 20})
    ax.set_xlabel('Longitude',fontdict = {'fontsize': 20})

    My output looked like this:

    我的输出看起来像这样:

    Image for post
    Graphic by Author
    图形作者

    Before we start adding our housing data we should look at utilizing the shape file to the fullest. Let’s take a look at the file.

    在开始添加房屋数据之前,我们应该充分利用形状文件。 让我们看一下文件。

    OID  D#  NAME                              geometry
    0   1   1   Seattle           MULTIPOLYGON (((-122.40324 47.66637...
    1   2   210 Federal Way       POLYGON ((-122.29057 47.39374...
    2   3   216 Enumclaw          POLYGON ((-121.84898 47.34708...
    3   4   400 Mercer Island     POLYGON ((-122.24475 47.59601...
    4   5   401 Highline          POLYGON ((-122.35853 47.51553...
     - Truncated for clarity

    As you can see, the county is divided on school districts — each with a shape used as boundaries. We will now try to plot the shape file and annotate the districts using the data provided like so:

    如您所见,该县分为多个学区-每个学区的形状都用作边界。 现在,我们将尝试绘制形状文件并使用提供的数据对区域进行注释,如下所示:

    left = ['Riverview','Snoqualmie Valley']
    center = ['Skykomish','Kent','Auburn','Tahoma','Vashon
              Island','Northshore','Shoreline','Renton','Highline',
             'Issaquah','Enumclaw','Seattle','Federal
             Way','Bellevue','Mercer Island','Lake
             Washington','Tukwila']
    right = ['Fife']
    kings_county.plot(figsize = (15,15),cmap = 'gist_earth')
    for idx, row in kings_county.iterrows():
        if row['NAME'] in left:
            plt.annotate(s=row['NAME'], xy=row['coords'],
                     ha='left', color = 'red')
        elif row['NAME'] in center:
            plt.annotate(s=row['NAME'], xy=row['coords'],
                     ha='center', color = 'red')
        elif row['NAME'] in right:
            plt.annotate(s=row['NAME'], xy=row['coords'],
                     ha='right', color = 'red')
    plt.title('School Districts in Kings County, WA', fontdict = {'fontsize': 20})
    plt.ylabel('Latitude',fontdict = {'fontsize': 20})
    plt.xlabel('Longitude',fontdict = {'fontsize': 20})

    The lists — left, right, center — are from trial and error with the placement of the district names. Some overlapped or needed to be manipulated so that they did not stray too far from their actual district.

    列表(左,右,中心)来自地区名称的放置,反复尝试。 有些重叠或需要进行操纵,以使它们不会偏离实际区域。

    I’ve changed the color map to gist_earth for clarity. Next, I iterated through each row using the entry in the NAME series, and placing the title at a point that was definitely in the polygon. I aligned the names based on the lists I had made earlier. And this was out output:

    为了清楚起见,我将颜色映射更改为gist_earth 。 接下来,我使用NAME系列中的条目遍历每一行,并将标题放置在肯定位于多边形中的点上。 我根据之前的清单排列了名称。 这是输出:

    Image for post
    School Districts of King County. Graphic by Author
    金县学区。 图形作者

    Each of the regions signifies a school district in King County. This matches the data I found about the twenty school districts in the county. I never really thought about the size and shape of a county, so I googled it just to be sure.

    每个地区都代表金县的学区。 这与我发现的有关该县二十个学区的数据相匹配。 我从来没有真正考虑过一个县的大小和形状,所以我用谷歌搜索只是为了确定。

    Image of Washington State with King County highlighted. From Google Maps
    Source: Google Maps
    资料来源:Google地图

    It seemed like the Google Maps image was the perfect hole for my puzzle piece. From here, it was just a matter of formatting my data to fit the shape file. I did that by initiating my coordinate system and creating applicable points using the latitude and longitude of my houses.

    似乎Google Maps图像是我的拼图的完美选择。 从这里开始,只需要格式化我的数据以适合形状文件即可。 我通过启动坐标系并使用房屋的纬度和经度来创建适用的点来完成此操作。

    crs = {'init': 'epsg:4326'} # initiating my coordinate system
    geometry = [Point(x,y) 
               for x,y in zip(df.long,df.lat)] # creating points

    If you were to look at an entry in geometry, you only get back that they are shapely objects. They need to be applied to our original dataframe. Below, you can see as I make a brand new dataframe that has the coordinate system built in, the old dataframe, and the addition of the points created by the intersection of the Latitude and Longitude of the houses.

    如果要查看几何图形中的条目,您只会发现它们是匀称的对象。 它们需要应用于我们的原始数据框。 在下面,您可以看到当我制作一个全新的数据框时,该数据框内置了坐标系,旧的数据框,并添加了房屋的经度和纬度相交点。

    geo_df = gpd.GeoDataFrame(df, # the dataframe
                              crs = crs, # coordinate system
                              geometry = geometry) # geometric points

    That was the last step before we can plot the houses. Now, we put it all together.

    那是我们绘制房屋之前的最后一步。 现在,我们将所有内容放在一起。

    fig, ax = plt.subplots(figsize = (15,16))
    kings_county.plot(ax=ax, alpha = 0.8, color = 'black')
    geo_df.plot(ax = ax , markersize = 2, color = 'blue',marker =
                'o',label = 'House', aspect = 1)
    plt.legend(prop = {'size':10} )
    ax.set_title('Houses in Kings County, WA', fontdict = {'fontsize':
                    20})
    ax.set_ylabel('Latitude',fontdict = {'fontsize': 20})
    ax.set_xlabel('Longitude',fontdict = {'fontsize': 20})

    在上面的代码中,步骤包括: (In the code above, the steps include:)

    1. Calling an object to plot.

      调用对象进行绘图。
    2. Plotting the King County shape file.

      绘制金县形状文件。
    3. Plotting the data I made that includes the geometry point.

      绘制我制作的包括几何点的数据。

      This includes making markers, choosing the aspect, and adding the label for the legend.

      这包括制作标记,选择外观以及为图例添加标签。

    4. Adding a legend, title, and axis labels.

      添加图例,标题和轴标签。

    These steps were done for each of the graphs.

    对每个图形都完成了这些步骤。

    Our output:

    我们的输出:

    Image for post

    This is a great product but our goal is to learn something from this visualization. While this gives some information, like the outliers far to the eastern part of the county, it doesn’t give much else. We have to play with parameters. Let’s try splitting the data by price. These are the houses that are listed for less than $750,000.

    这是一个很棒的产品,但是我们的目标是从可视化中学习一些东西。 尽管这提供了一些信息,例如该县东部的离群值,但它并没有提供其他信息。 我们必须使用参数。 让我们尝试按价格划分数据。 这些房屋的标价低于750,000美元。

    fig, ax = plt.subplots(figsize = (15,25))
    kings_county.plot(ax=ax, alpha = 0.8, color = 'black')
    geo_df[geo_df['price'] < 750000].plot(ax = ax , markersize = 2,
                    color = 'red',marker = 's',label = 'Price < 750k',
                    aspect = 1.5)
    plt.legend(prop = {'size':15} )
    ax.set_title('Houses by Price in Kings County, WA', fontdict =
                  {'fontsize': 20})
    ax.set_ylabel('Latitude',fontdict = {'fontsize': 20})
    ax.set_xlabel('Longitude',fontdict = {'fontsize': 20})
    Image for post
    Houses priced below $750,000. Graphic by Author
    价格低于750,000美元的房屋。 图形作者

    Now we graph the houses greater than or equal to $750,000.

    现在我们绘制大于或等于750,000美元的房子的图。

    fig, ax = plt.subplots(figsize = (15,25))
    kings_county.plot(ax=ax, alpha = 0.8, color = 'black')
    geo_df[geo_df['price'] >= 750000].plot(ax = ax , markersize = 2,
                       color = 'yellow',marker = 'v',label = 'Price >=
                       750k', aspect = 1.5)
    plt.legend(prop = {'size':15})
    ax.set_title('Houses by Price in Kings County, WA', fontdict =
                 {'fontsize': 20})
    ax.set_ylabel('Latitude',fontdict = {'fontsize': 20})
    ax.set_xlabel('Longitude',fontdict = {'fontsize': 20})
    Image for post
    Houses priced above $750,000. Graphic by Author
    价格在750,000美元以上的房屋。 图形作者

    There is a big difference in terms of both location and quantity. But that is not the end, we can also layer them one on top of the other. We will be doing the expensive on top of the cheap because it is scarcer.

    在位置和数量上都存在很大差异。 但这还没有结束,我们也可以将它们一个接一个地放置。 我们将在便宜的基础上再做昂贵的,因为它稀缺。

    fig, ax = plt.subplots(figsize = (15,25))
    kings_county.plot(ax=ax, alpha = 0.8, color = 'black')
    geo_df[geo_df['price'] < 750000].plot(ax = ax , markersize = 1,
                          color = 'red',marker = 's',label = 'Price <
                          750k = Red', aspect = 1.5)
    geo_df[geo_df['price'] >= 750000].plot(ax = ax , markersize = 1,
                          color = 'yellow',marker = 'v',label = 'Price
                          >= 750k = Yellow',aspect = 1.5)
    plt.legend(prop = {'size':12})
    ax.set_title('Houses by Price in Kings County, WA', fontdict =
                {'fontsize': 20})
    ax.set_ylabel('Latitude',fontdict = {'fontsize': 20})
    ax.set_xlabel('Longitude',fontdict = {'fontsize': 20})
    Image for post
    Side by side comparison. Graphic by Author
    并排比较。 图形作者

    The picture painted by this map is interesting. There is a plethora of housing in King County that falls below the bar we’ve set. Most of the houses on the lower end of the price scale falls more inland than the more expensive classes.

    该地图绘制的图片很有趣。 金县的住房过多,低于我们设定的标准。 价格范围较低端的大多数房屋比昂贵的房屋价格下跌的地区更多。

    If you zoom in, the more expensive houses dot the waterside. They also are more centrally located around the Seattle city center. There are several physical outliers but the trend is clear.

    如果放大,则较贵的房屋将点缀在水边。 它们还位于西雅图市中心附近的中心位置。 有几个物理异常值,但趋势很明显。

    Overall, the visualization has done its job. We have made several determinations from the houses on the map. Pricier houses are collected around the downtown area and spread around Puget Sound. They are also a minority in the data, which could be telling for predicting housing prices. The houses priced on the cheaper side are much more numerous and have a varied location. This will be useful for further EDA.

    总体而言,可视化已完成工作。 我们已经从地图上的房屋中做出了一些决定。 价格较高的房屋在市区周围收集,并分布在普吉特海湾附近。 他们也是数据中的少数,这可能有助于预测房价。 价格便宜的房屋数量更多,并且位置各异。 这对于进一步的EDA很有用。

    If you want to connect to talk more about this technique, you can find me on LinkedIn. If you would like to check out the code, take a look at my Github.

    如果您想联系以更多地谈论这种技术,可以在LinkedIn上找到我。 如果您想查看代码,请查看我的Github

    资料来源 (Sources)

    翻译自: https://towardsdatascience.com/using-geopandas-for-spatial-visualization-21e78984dc37

    多维空间可视化

    展开全文
  • 依次有:物体坐标系,世界坐标系,相机坐标系,投影坐标系以及屏幕坐标系.我要讨论的就是这些坐标系间的转换。 这些坐标系不是凭空而来,他们都是为了完成计算机3D图形学最最最基本的目标而出现. 计算机3D图形学最最...

         要谈坐标系变换,那么坐标系有哪些呢?依次有:物体坐标系,世界坐标系,相机坐标系,投影坐标系以及屏幕坐标系.我要讨论的就是这些坐标系间的转换。
         这些坐标系不是凭空而来,他们都是为了完成计算机3D图形学最最最基本的目标而出现.
          计算机3D图形学最最最基本的目标就是:将构建好的3D物体显示在2D屏幕坐标上.
          初看好像就是将最初的物体坐标系转换到屏幕坐标系就可以了呀,为什么多出了世界坐标系,相机坐标系,投影坐标 系。这是因为:在一个大世界里有多个物体,而每个物体都有自己的坐标系,如何表述这些物体间相对的关系,这个多出了世界坐标系;如果只需要看到这个世界其 中一部分,这里就多出了相机坐标系;至于投影坐标系那是因为直接将3D坐标转换为屏幕坐标是非常复杂的(因为它们不仅维度不同,度量不同(屏幕坐标一般都 是像素为单位,3D空间中我们可以现实世界的米,厘米为单位),XY的方向也不同,在2D空间时还要进行坐标系变换),所以先将3D坐标降维到2D坐标, 然后2D坐标转换到屏幕坐标。
    理解3D图形学的第一步:理解左手坐标系与右手坐标系
          为什么会有左手坐标系与右手坐标系之分?
          在3D空间(没错!就是3D)中,所有2D坐标系是等价的(就是通过一系列的仿射变换,可以互相转换)
          而3D坐标系不是等价的,通过仿射变换,是无法将左手坐标系转换到右手坐标系;也就是说,物体坐标系用的就是左手坐标系,世界坐标系用的是右手 坐标系,那么物体可能就是不会是我们所希望的样子了,可能是倒立的,也可能是背对着我们的,所以我们要区分左手坐标系与右手坐标系。也许在4D空间,左右 手坐标系就可以互相变换了吧。
          进入正题吧:
         首先讨论的是物体坐标系->世界坐标系
          前面说了为了描述多个物体间相对的关系,这里引进了世界坐标系,所以世界坐标系是个参考坐标系。
          这一步的目的将所有的物体的点都转移到世界坐标系,这里主要涉及的是旋转,缩放,平移等。
          不过我将详细说明为何及如何用矩阵来描述这些变换。
          例:如果有两个坐标系C与C`, C`是C绕Z轴旋转θ得到的。下面是各坐标轴的变换:
                 
         如果是C坐标系的点P(x, y, z),而在C`的表示就是
       
         这时该如何建立矩阵呢? 答案就是区分你用的是行向量还是列向量.也许有人会问为什么不区分是左手坐标系还是右手坐标系呢?因为C可以变换到C`,那么他们一定是同在左手坐标系或右手坐标系,变换只能在可以互相转换的坐标系之间进行。
          如果你用的是行向量:由于行向量只能左乘矩阵(注意乘与乘以的区别)
          所以矩阵形式应该是这样
        
         只有这样,在左乘矩阵时才能得到上面P`的形式。
        
         如果你用的是列向量: 由于列向量只能右乘矩阵(注意乘与乘以的区别)
         所以矩阵形式应该是这样
        
         只有这样,在右乘矩阵时才能得到上面P`的形式。
      
         至于如何旋转,缩放,平移我不在多说。
         …………………………………觉得自己好像跑题了.还好这两个坐标系变换很简单。
         我们再讨论世界坐标系->相机坐标系
         引进相机的目的就是只需看到世界的一部分,而哪些是可以在相机里看到的,就需要进行筛选。将物体转换到相机坐标系,这样相机坐标系进行筛选时就会简单很多。这里的重点是构建相机坐标系。
         物体坐标系,世界坐标系是美工在绘制时就定义好了的。而相机坐标系是需要程序实时构建的。(当然这是通常情况下,如果你要建立一个世界,这个世界都是围绕 你转,要实时改变所有物体坐标系,固定相机坐标系(其实这时候相机坐标系就是世界坐标系),建立一个地心说的世界,我也没办法,你的思维也太不一样了。)
         如何构建相机坐标系呢?首先我们要明确目标:我们是要构建3D坐标系(好像是废话),三个坐标轴要互相垂直(也好像是废话).
          我们一般用UVN相机。例如:D3D的D3DXMatrixLookAtLH,D3DXMatrixLookAtRH,OGL的gluLookAt(右手坐标系).
          如何建立呢UVN相机呢? 我们就要利用叉积这个工具了:两个不平行,不重叠的向量的叉积可以得到与这两个向量互相垂直的向量。
          如果有了相机的位置与目标的位置那么我们可以确定一个Z轴(有人问为什么是Z轴,因为物体的远与近我们就习惯用Z值来表示的)。求Z轴时要注意 是左手坐标系还是右手坐标系,左右手坐标系XY轴方向相同时,Z轴的方向相反。所以左手坐标系是目标位置减去相机位置,而右手坐标系则是相机位置减去目标 位置。记得normalize
         这是我们要得到X与Y轴了。如何求X,Y轴呢?
         一般方法是:
         1、选择一个临时Y轴,
         2、对临时Y 与Z 轴进行叉积求得一个X轴
         3、X轴再与Z轴进行叉积,得到一个Y轴。
         有了XYZ就可以求出旋转的相机矩阵了。
         如何选择一个Y轴呢?大多数情况下是(0,1,0),但是如果是相机位置E与目标位置T垂直,即(E-T=(0,+/-1,0)时),这时就不能用(0,1,0)了, 因为两个平行向量的叉积是零向量,所以我们就要另选一个Y轴。
         但是我觉得我们可以改变方法。
          如果不能选Y轴,我们就选择一个临时X轴,这个临时X轴就是(1,0,0)。
         然后再对临时X轴与Z轴进行叉积求得一个Y轴。
         最后Y轴再与Z轴进行叉积,得到X轴。
          这样可以得到XYZ轴。
          最后再根据行向量与列向量建立相机矩阵,再进行平移。

         相机坐标系->投影坐标系.
         投影的目的就是:降维.
          两种投影方式:正交投影与透视投影.
          在我们TEAM中易颖已经写了,我就不多说了,大家去看他的文章。

         投影坐标系->屏幕坐标系
          这是最简单的。2D坐标变换。也不多说。

    转载文章2:http://www.xingousi.com/computer/computergraphics.htm

    计算机图形学笔记(Part 1 ):计算机图形学透视投影变换原理及一点和两点透视

     

    一、平行互分法

    吴英凡所写的《透视作图的新方法——交点法体系》,其中谈到的平行互分法,还是有道理的。

    其实简单点说,就是透视图上的两条“原来空间中的平行线”(在画面上透视投影为相交于灭点),通过其中一条透视投影直线的端点画另一条透视投影直线的平行线,必平行于画面;这第三条线在画面的透视投影的灭点必然在另一条透视投影线上。

     

     

     

    二、透视投影变换学习总结

    1、用多维数列表示低维空间坐标,加深理解齐次坐标表示法。

        齐次坐标表示法可以方便地运算,同时形状不变。[x,y,z,0]表示一个无穷的点。

       

    2、透视投影变换公式可以看成两个矩阵的乘积,其中一个做透视变换,另外一个作正投影

       保留的z'值的确切含义:指的是在完全作完透视投影变换之前,仅作透视投影之后的一条线.

       它的几何意义见李建平《计算机图形学原理教程》44页。

    3、左手和右手坐标系的坐标转换

       “视点坐标系与一般的物体所在的世界坐标系不同,它遵循左手法则,即左手大拇指指向Z正轴,与之垂直的四个手指指向X正轴,四指弯曲90度的方向是Y正轴。而世界坐标系遵循右手法则的。”

    4、视点坐标系的透视变换公式很重要!!王飞著计算机图形学书65

    5z'值的确切含义:指的是在完全作完透视投影变换之前,仅作透视投影之后的一条线

     

     

     

    三、两点透视的变换矩阵:

    王飞编著《计算机图形学基础》的道理是:

    从平面图形的平移、旋转、错切开始推导,两点透视的变换矩阵可以看成是:

    物体本身有一个物体坐标系——xw,yw,zw,视点作为原点又构成一个视点坐标系——xeyeze,物体坐标系z轴朝上,y轴朝向远处;而视点坐标系y轴朝上,z轴朝向远处。

    这样,最终的二点透视状态可以这样取得,首先把物体的位置的物体坐标系表示法转化为视点坐标系的表示法(第一个矩阵),然后围绕视点坐标系的y轴旋转(第二个矩阵),然后在xyz方向上平移(第三个矩阵),最后做透视变换(第四个矩阵),它的原文是把平移放在第二步,我在平移之前转动,目的是保证了物体旋转的轴在离它不远的地方:

    我使用的矩阵变换如下,原文是是把平移放在第二步:

    [xw,yw,zw,1]* ***

     

    最后所得结果是一个新的矩阵,

    [xe ye ze 1]=[cos*xw-sin*yw+l   zw+m   2sin*xw+2cos*yw+2n-d   (sin*xw+cos*yw+n/d]

    把最后一项变成1,可得

    =[(cos*xw-sin*yw+l)*d/(sin*xw+cos*yw+n   (zw+m)*d/(sin*xw+cos*yw+n)   2sin*xw+2cos*yw+2n-d*d/(sin*xw+cos*yw+n)    1 ]

     

    即:

    Xe= (cos*xw-sin*yw+l)*d/(sin*xw+cos*yw+n)

    Ye=(zw+m)*d/(sin*xw+cos*yw+n)

    Ze=(2sin*xw+2cos*yw+2*n-d)*d/(sin*xw+cos*yw+n)

     

    实际上我的delphi程序里面是这样的:

    xe:=trunc((cos(angle)*eee[ii][k].X-sin(angle)*eee[ii][k].Y+l)*d/(sin(angle)*eee[ii][k].X+cos(angle)*eee[ii][k].Y+n));

            ye:=trunc((hhh[ii][k]+m)*d/(sin(angle)*eee[ii][k].X+cos(angle)*eee[ii][k].Y+n)); //透视变换

            //ze可以考虑使用作为消隐

    Ze:=trunc((2*sin(angle)*xw+2*cos(angle)*yw+2*n-d)*d/(sin(angle)*xw+cos(angle)*yw+n));

     

     

    四、通过变换过的两点透视的结果xe,yezw*,反求原来的物体坐标xw,yw

    即:xe,yezw已知,求出xw,yw

    根据:

    Xe= (cos*xw-sin*yw+l)*d/(sin*xw+cos*yw+n)          1

    Ye=(zw+m)*d/(sin*xw+cos*yw+n)                         2

    Ze=2sin*xw+2cos*yw+2n-d*d/(sin*xw+cos*yw+n) 3

    1)除以(2)得

    Xe/Ye= (cos*xw-sin*yw+l)/ (zw+m)

    (Xe*(zw+m))/Ye=cos*xw-sin*yw+l

    (Xe*(zw+m))/(Ye* cos)=xw-tan*yw+l/cos

    Xw=(Xe*(zw+m))/ (Ye* cos) - (ye*l)/(Ye* cos)+( sin*yw*ye)/ (Ye* cos)

     

    Xw=(Xe*(zw+m)+ sin*yw*ye- ye*l)/ (Ye* cos)            (4)

     

    由(2)得

    Ye*(sin*xw+cos*yw+n)= (zw+m)*d

    Ye*(sin*xw)+ye* cos*yw+n*ye=(zw+m)*d

    把(4)代入上式得

    Ye* sin*(Xe*(zw+m)+ sin*yw*ye- ye*l)/ (Ye* cos)+ye* cos*yw+n*ye=(zw+m)*d

    约去ye,得

    sin*(Xe*(zw+m)+ sin*yw*ye- ye*l)/ cos+ye* cos*yw+n*ye=(zw+m)*d

    tan*(Xe*zw+xe*m+ sin*yw*ye- ye*l) +ye* cos*yw+n*ye=(zw+m)*d

    tan*Xe*zw+xe*m *tan- ye*l*tan+ sin*tan*yw*ye+ye* cos*yw+n*ye=(zw+m)*d

    (sin*tan*ye+ye* cos)*yw+ tan*Xe*zw+xe*m *tan- ye*l*tan+n*ye=(zw+m)*d

     

    最后得

    Yw=[(zw+m)*d- tan*Xe*zw- xe*m *tan+ ye*l*tan- n*ye]/ (sin*tan*ye+ye* cos) 5

    而前面已经得到

    Xw=(Xe*(zw+m)+ sin*yw*ye- ye*l)/ (Ye* cos)            (4)

     

    实际上相当于opengl里面的逆变换,从鼠标选中的屏幕位置来确定对应的三维空间中位置,opengl使用gluUnProjectgluUnProject4来计算。

    再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

    转载于:https://www.cnblogs.com/skiwnchiwns/p/10345110.html

    展开全文
  • 为什么叫齐次坐标系?  齐次坐标系,英文名称Homogeneous coordinate system。也就是说Homogeneous国内翻译为“齐次”,查询“齐次”的解释,谷歌翻译Homogeneous是“同质”的意思,百度翻译结果是“均匀的;同性质...
  • 计算机3D图形学中的坐标系变换

    千次阅读 2011-09-07 09:41:03
    依次有:物体坐标系,世界坐标系,相机坐标系,投影坐标系以及屏幕坐标系.我要讨论的就是这些坐标系间的转换。  这些坐标系不是凭空而来,他们都是为了完成计算机3D图形学最最最基本的目标而出现.  计算机3D图形...
  • 平行坐标是可视化高维几何和分析多元数据的常用方法。 为了在n维空间中显示一组点,绘制由n条平行线组成的背景,通常是垂直且等距的。所述的点N 维空间被表示为折线与顶点在平行的轴线; 第i 轴上顶点的位置对应于该...
  • 可能有人会说可以设置维度的优先级,比如拼接一个联合键,那在三维空间中,x,y,z 谁的优先级高呢?设置优先级好像并不是很合理。 本篇文章就来介绍2种比较通用的空间点索引算法。 一. GeoHash 算法 1. Genhash ...
  • SLAM 坐标系变换 (包含CoreSLAM)

    千次阅读 2018-05-16 17:47:54
    则激光点N在世界坐标系中的坐标为 (xw,yw)(x_w, y_w)(xw​,yw​)( 注:无论在哪个坐标系中,点N在空间中的位置始终保持不变\color{red}{注:无论在哪个坐标系中,点N在空间中的位置始终保持不变}注:无论在哪个坐标...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,463
精华内容 985
关键字:

多维空间几何坐标系