如何获取几何对象外接斜矩形 
[ 2007-7-28 23:23:00 | By: v2sky ]
 

SuperMap Objects中提供了获取几何对象外接矩形的接口(soGeometry.Bounds),通过这个接口我们可以方便地实现圈定几何对象范围、根据范围空间查询等功能。可是在很多行业,尤其是在城市规划、设计部门的应用中,这个矩形往往不能满足需求,人们更多的是希望使用几何对象的最小外接斜矩形。

我们想象一下,有这么一个多边形(见图1中绿色部分)

1 多边形图

其中红色边框为该多边形的外接矩形。对于图示中的多边形,它的外接斜矩形应该如图2中紫红色边框所示。

2 多边形的斜矩形

可是目前SuperMap Objects中并没有一个直接的接口来获取这个斜矩形,这个是实现获取斜矩形功能中最关键的问题。遇到这种问题可以先观察一下,我们先试着将整个图形旋转一个角度以将紫色边框旋正(旋转后的图形见图3)。

3 旋转后的多边形以及外接矩形

从旋转后的图形来看,我们发现如果这个多边形就是以旋转后的这个样子保存在记录集中,那么这个旋转后的紫色边框就是其最小外接矩形了。

关键问题是应该旋转多少角度合适呢。我们不妨先观察一下,结合几何学的知识来分析,这个旋正后的最小外接矩形应该为该多边形的所有外接斜矩形中面积最小的多边形。

通过上面的观察和分析,我们总结出了一个规律(面积最小),带着这个线索我们可以很快归纳出大体的实现思路。

1,   获取几何对象的最小外接矩形,并得到其面积值赋给变量AreaMin

2,   对几何对象进行旋转一个角度Φ,并求旋转后的几何对象的最小外接矩形,获得其面积值赋给变量AreaTmp

3,   比较AreaTmpAreaMin的大小,将小面积值赋给AreaMin,此时的角度值赋给一个公共变量;

4,   循环执行第23步的过程,最终获取一个最小的面积值以及与之相对应的旋转角度;

5,   得到了最合适的旋转角度β后,我们可以将旋转后的矩形反旋转一个β角度,这样就可以获得我们需要的斜矩形了。

有了这个思路,编写程序也就不是什么困难的事了,下面图片展示的是利用上面思路在VB环境中实现的效果。

4 未获得斜矩形的地图

5 获得斜矩形后的效果

本文由卫图天下原创,转载请注明出处。
 
 
Re:如何获取几何对象外接斜矩形
[ 2007-8-2 8:35:37 | By: 游客(游客) ]
 
游客(游客)巧妙,你太有才了。
 
个人主页 | 引用 | 返回 | 删除 | 回复
发表评论:
Powered by Oblog.