EVS中的数字精度问题

注:该问题已在EVS 2021.4 及后续版本中通过“Application Origin”(应用原点)功能解决。

该数字精度问题在创建大坐标EVS模型时可能遇到,这里我们对产生这个问题的原因以及如何解决进行讨论。EVS中有几个和数字精度相关的功能或话题,其中以下两点是最重要也是最值得讨论的。

  1. 计算和生成结果的精度

  2. 图形显示的精度

以上两个话题都和计算机存储数字有关,所以我们首先讨论计算机是如何存储“Float”和“Double”类型的数字的。由于“Float”和“Double”是计算机领域的专业名词,有些人可能不熟悉。计算机可以将数字存储为多种类型(不同类型精度和范围不同),包括“Short”、“Integer”、“Half Float”、“Float”和“Double”。

在EVS中,Float是最常用的数字类型,因此理解Float的限制条件是最重要的。下表给出了Float和Double类型从1.0到1万亿不同范围内各个数字的精度。

111.png

我首先说明一下这张表告诉了我们什么。对于Float类型的精度,这张表告诉我们:

  • 对于范围1~2,数字的精度可以达到1000万分之一

  • 对于范围4~800万,数字的精度则降到了0.5

  • 对于范围1~20亿,数字的精度则只有128

这说明在不考虑数字大小的情况下,Float类型只有6~7位精度,Double类型只有15~16位精度。

当我从一个非程序员的角度看这张表时,有一个显而易见的问题就是“为什么不全部采用Double类型来处理EVS中的数字?”。我们的回答是我们尽量使用Double类型,但是所有的计算机显卡都采用的是Float类型进行图形渲染。

我们确实采用的Double类型进行所有的内部计算,包括所有的估值方法(例如克里金)、体积计算。但是,当把这个“Double精度”的模型发给显示器时,我们则会受到计算机显卡采用“Float精度”的限制。

这样导致的结果是:

          1. 你无需担心EVS中的计算结果精度。

        a. 体积和质量的计算结果是精确的。

    2. XY坐标很大,但是XY方向长宽很小的模型在显示器中的显示可能会产生一些问题。

如何定义XY坐标很大而长宽很小?利用上面的表格,你可以计算你的模型是否会有数字精度问题。以下是相关说明:

这里举例说明。

  • 取最大X和Y坐标中的较大值,并在上表中找到相应的“Float精度”。

  • 如果Y坐标大于X坐标,且Y坐标最大值为10,315,442,那么“Float精度”为1.0。

  • 使用file_statistics模块得到XY方向的长宽,假设X方向长度 = 65.2,Y方向长度 = 62.8,取小值长宽 = 62.8。

  • 使用XY方向长宽除以“Float精度”得到精度比:

    • 如果精度比小于400,那么很可能产生显示问题。在该例中,精度比小于63,所以问题会非常明显。

    • 如果需要放大到模型的一小块区域,那么精度比400可能也不够。

显示问题是什么意思?

  • 好消息是无论你的精度比是63还是1000,在EVS的显示窗口中,模型看上去都是一样的。

  • 只有当你旋转或缩放模型时问题才会出现

    • 旋转问题是最明显的,模型旋转时会出现卡顿现象。

    • 缩放只有在使用“shift+鼠标中键”操作时才明显。通常采用这种方式缩放会非常流畅,但是此时也会卡顿。

  • 如果你使用模型倾向倾角控制面板操作,则不会碰到上述问题。

  • 制作带旋转和缩放的动画时可能导致比较严重的问题。

    • 你的动画(例如.AVI文件)将清晰的显示出这些问题,通常是无法不可接受的。

可能遇到的其他问题?

  • 导出模型到其他软件(例如CAD软件)可能出现问题。

  • 在AutoCAD 2020中测试导入EVS中导出的低精度比模型时没有遇到问题,但是AutoCAD中也没有可以解决旋转卡顿现象的方法。

  • 在中望CAD 2020中测试导入EVS中导出的低精度比模型时遇到问题。

    • 当显示线框模型时,没有问题。

    • 当显示面渲染模型(高洛德着色或平面着色)时,出现了几个渲染问题。

  • 在ESRI ArcScene 10.7.1中测试时没有发现大的问题,但是模型旋转比较卡。

    如何为你的模型修正这个问题?

    • 如果你发现你的模型具有上述问题,那么有一个非常简单直接的解决办法:

      • 记住,该数字精度问题仅发生在当你的模型XY坐标很大,但是XY方向长宽很小时!

      • 平移你的模型数据坐标至合适的范围

        • 例如,如果你的模型:

          • X坐标在211,400至211,470之间(长度70),且

          • Y坐标在6,133,200至6,13320之间(长度60),因此

          • 该范围的精度为0.5,因此精度比为120(60/0.5)

        • 如果你平移Y坐标-6,000,000米,那么

          • 你的数字精度将提高至0.015625

          • 模型的精度比将提高至3,840

        • 这样做在EVS中引起的问题是什么?

          • 显示在窗口中的模型被平移了600万米

          • 拾取模型坐标信息时显示的坐标也被平移了600万米

          • 正常情况下,axes模型显示的坐标轴刻度也被平移了600万米

            • 但是,axes模块有一个叫做“Set Axes Origin”的复选框,勾选这个复选框,然后设置Y值为-6,000,000

    222.png

            • 这样就能修正坐标轴刻度的显示问题了

          • 对于非ASCII数据,采用如下方法:

            • 对于CAD和Shape文件,使用transform_filed模块来移动模型的坐标

            • 对地理参照照片(在overlay_aerial模块中使用),保存并转换该图片为带世界文件的格式,例如带PGW文件的PNG格式图片、带JGW的JPG格式图片。

              • 修改并移动世界文件中的坐标

    0 个评论

    要回答文章请先登录注册