最近我试图玩几何几何结构.自从Boost Geometry(一个不同的图书馆也处理多边形)在Boost 1.58中没有任何工作,尽管我会尝试到Boost Polygon.
尝试了解库并没有得到预期的结果后,我发现该库仅适用于整数坐标.起初我虽然这是对输入的限制,但实际上所有的内部操作和输出都是整数,这使得所有的输出都很古怪,例如,多边形的交点稍微变形(因为顶点的坐标必须是整数).
主页的引用(强调我的):
The coordinate data type is a template parameter of all data types and
algorithms provided by the library,and is expected to be integral.
Floating point coordinate data types are not supported by the
algorithms implemented in the library due to the fact that the (sic)
achieving floating point robustness implies a different set of
algorithms and generally platform specific assumptions about floating
point representations.
起初我虽然在精确和不精确的表示之间是一个问题,但是我试图让它使用理性(Boost Rational)类型(我想出了一个包装器理性类来编译它),但实际上整数坐标是一个严格的要求(代码中有一些实际添加和减除一个构造中间结果的部分).
回到整数,我不得不使坐标很大(整数),使这个离散问题消失.换句话说,我必须对所有的东西进行归一化.那最后,最初我觉得不是很有用或方便.
我缺少使用这个图书馆的重要事项吗?
这个图书馆是为了“像素化”的问题吗?如果坐标被限制为整数,那么实用程序是什么?
将坐标缩放到非常大的数字,然后再重新归一化几何应用的结果?
我知道使用浮点数的计算几何是非常痛苦的,但是为什么这个库甚至不能与确切的理性兼容?
有真正的使用例子吗? (这个手册很不错,给出例子)有人真的使用这个库吗?
奖金问题:这是一个被遗弃的图书馆吗?
这是一个例子,说明库的整数坐标如何运行:
这里是一个整数多边形会发生什么的例子,如果我使用小数字来表示坐标,结果甚至不是几何一致的. (两个多边形是多边形(-2,0)(2,-2)(6,4)(0,2)和多边形(-5,0)( – 1,-2)(3,4)( – 3,2))
(注意一切如何变化.)
但是当我将多边形缩放到大的整数坐标时,结果会更准确(两个多边形是多边形(-200,0)(200,-200)(600,400)(0,200)和多边形(-500,0)( – 100,-200)(300,400)( – 300,200),上述两个缩放版本.):
编辑:我学到了更多的计算几何,显然计算几何的鲁棒性是一个非常困难的问题.其中一个策略是使用整数算术.看起来Boost.Polygon采用这种方法.连续空间中的问题应适当缩小.
解决方法
是的,(许多)人使用.
有一件事似乎有一个坚实的用户群是例如Voronoi图和相关算法.你也可以在这里找到很多有关这方面的问题,所以你可以去看看他们使用什么.
奖金回答
甚至可以通过使用组合库
#include <boost/geometry/geometries/adapted/boost_polygon.hpp>