又是被网课支配的一周呢。空间分析课程中遇到了一个作业,设计程序实现点面距离的计算,不限语言,我选择了JAVA,其实相差不大,Python也可以,有时间的话试着用Python实现一下。。
思路
数据结构
点面距离计算,那么这两类对象的组织方式应该如何表达?
对于空间数据来说分矢量数据和栅格数据,这里明显是属于矢量数据的,空间矢量数据具有多种几何属性,时空属性,且是海量的,但是这里并不需要显示一个面要素的具体属性,完全可以把他们抽象为简单数学问题(完全不用考虑空间参考系的)。
那么可以用最简单的方式:
- 点要素就是一个简单的由坐标构建起来的类
- 面要素则是由首尾相同的坐标串表示
我们在求最值距离时涉及到比较,需要遍历坐标串,并不需要删除与插入操作,因此选择了数组的方式来存储坐标串。
问题转化
这个程序目的是为了计算点面间距离,点面距离分三类:
- 中心距离:点到面几何中心的距离
- 最远距离:点到面最远的距离
- 最近距离:点到面最近的距离
之前说到了点面的数据结构,几何中心可以通过计算得到其坐标,最值距离一定在边界的拐点处,那么问题就可以转化为两坐标间的距离。
代码
Point类
Point类设计了两个属性:x和y坐标;两个构造方法;一个静态方法计算两个坐标间距离。
Polygon类
Polygon类继承了Point类,设计了两个属性:Point类型的数组、起始点;两个构造函数;getCenter方法封装了计算面要素几何中心的算法;getCenterDistance方法,专门计算中心距离(后来在测试的时候发现是多余的,不过也是一种方式);getMaxDistance方法和getMiniDistance方法用来计算最值距离,涉及到遍历数组,考虑到面要素的坐标串具有意义,不可改变顺序,因而引入了距离数组进行比较和排序,详见注释;show方法将构成面要素的坐标串输出
主类测试
只设计了一个测试样例,个人觉得应该再多一些,不过没有再继续设计了。此外,测试最可观的应该是点和圆面之间的距离,但是圆面的坐标串可以想象是无法靠人工输入的,一是数量巨大,二是一个哲学问题——“任何人都画不出标准的圆”,对测试影响或许会比较大,所以我设计了一个比较简单的矩形情况。
测试结果
以上仅为个人的设计思路,不一定是最高效的,还请多指教