boost::polygon::area计算多边形面积返回0异常问题咨询
Boost.Polygon area计算返回0异常问题
问题背景
调用boost::polygon::area计算多边形面积时得到不符合预期的0值结果,已在Boost官方代码仓库提交对应问题反馈,现梳理复现场景并寻求可行的解决、规避方案。
测试使用的Boost版本为1_78,传入的是一个尺寸极小的浮点坐标矩形,插入polygon_set_data<double>后调用面积计算接口,返回结果为0。
复现代码
#include <boost/polygon/polygon.hpp> #include <boost/polygon/rectangle_data.hpp> #include <boost/polygon/polygon_set_data.hpp> #include <boost/polygon/polygon_data.hpp> #include <boost/version.hpp> #include <boost/format.hpp> template<typename T> auto make_rect(T x1, T y1, T x2, T y2) { auto r = boost::polygon::rectangle_data(x1, y1, x2, y2); boost::polygon::polygon_data<T> p; boost::polygon::assign(p, r); return p; } int main(int argc, char **argv) { std::cout << BOOST_LIB_VERSION << std::endl; boost::polygon::polygon_set_data<double> poly, poly1; poly.insert(make_rect(0.003065, 0.0007, 0.0034, 0.0009525)); std::cout << boost::format("%e") % boost::polygon::area(poly) << std::endl; }
运行输出
1_78 0.000000e+00
可行解决/规避方案
问题根因是Boost.Polygon的核心设计最初面向整数坐标的VLSI设计场景,polygon_set相关的插入、运算逻辑默认带整数栅格对齐的量化步骤,直接传入数值极小的double类型坐标时,默认的量化容差会把坐标差小于阈值的边判定为退化边,最终计算得到零面积。可根据业务场景选择以下方案:
- 坐标缩放转整数计算:根据业务用到的坐标精度选足够大的缩放系数(比如示例里的千分位级坐标统一乘1e6转为long long整数),所有坐标用整数类型传入计算,得到面积结果后除以缩放系数的平方还原为实际面积。这是官方文档推荐的标准用法,稳定性最高。
- 自定义浮点坐标特性:特化Boost.Polygon的坐标类型traits,针对double类型调小栅格对齐的判定容差,让极小的浮点坐标差不会被误判为重合。
- 避开polygon_set的量化逻辑:如果只是计算单个简单多边形的面积,不需要做多边形布尔运算,直接对
polygon_data对象调用area接口即可,单多边形面积计算不会触发栅格量化步骤,当前示例直接对make_rect返回的多边形求面积就能得到正确结果。
内容的提问来源于stack exchange,提问作者David R.
相关产品推荐
相关产品推荐

