【问题标题】:Converting polygon coordinates from Double to Long for use with Clipper library将多边形坐标从 Double 转换为 Long 以用于 Clipper 库
【发布时间】:2013-07-16 17:37:05
【问题描述】:

我有两个多边形,它们的顶点存储为双坐标。我想找到这些多边形的相交区域,所以我正在查看Clipper library(C++ 版本)。问题是,Clipper 仅适用于整数数学(它使用 Long 类型)。

有没有一种方法可以安全地使用相同的比例因子转换两个多边形,将它们的坐标转换为 Longs,使用 Clipper 执行交叉算法,并使用相同的因子将生成的交叉多边形缩小,然后将其转换回来到一个 Double 没有太多的精度损失?

我不知道该怎么做。

【问题讨论】:

    标签: c++ casting polygon data-conversion clipperlib


    【解决方案1】:

    您可以使用简单的乘数在两者之间进行转换:

    /* Using power-of-two because it is exactly representable and makes
    the scaling operation (not the rounding!) lossless. The value 1024
    preserves roughly three decimal digits. */
    double const scale = 1024.0;
    
    // representable range
    double const min_value = std::numeric_limits<long>::min() / scale;
    double const max_value = std::numeric_limits<long>::max() / scale;
    
    long
    to_long(double v)
    {
        if(v < 0)
        {
            if(v < min_value)
                throw out_of_range();
            return static_cast<long>(v * scale - 0.5);
        }
        else
        {
            if(v > max_value)
                throw out_of_range();
            return static_cast<long>(v * scale + 0.5);
        }
    }
    

    请注意,刻度越大,精度越高,但也会降低范围。实际上,这会将浮点数转换为定点数。

    最后,您应该能够使用浮点数学轻松定位代码以计算线段之间的交点,所以我想知道您为什么要使用 Clipper。

    【讨论】:

    • 我需要将两个多边形的相交区域作为一个新的多边形。在某些情况下,这些多边形可能有“洞”或可能是凹的。 Clipper 应该处理所有这些边缘情况。感谢您的帮助!
    • "scale" - 好像不是用来缩放双倍的?
    • 是否也有后向转换?\
    • 是的,@NSDawg,它非常简单,因为您没有溢出问题(可能只是舍入/转换不准确),转换是微不足道的。
    • 我发现我的方法只是不确定,因为我没有添加/减去 0.5,所以我认为我错了。
    猜你喜欢
    • 2013-02-21
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多