C++ 将多边形坐标从Double转换为Long以用于Clipper库

C++ 将多边形坐标从Double转换为Long以用于Clipper库,c++,casting,polygon,data-conversion,clipperlib,C++,Casting,Polygon,Data Conversion,Clipperlib,我有两个多边形,它们的顶点存储为双坐标。我想找到这些多边形的相交区域,所以我在看(C++版本)。问题是,Clipper只适用于整数数学(它使用Long类型) 是否有一种方法可以安全地使用相同的比例因子变换两个多边形,将它们的坐标转换为长坐标,使用Clipper执行求交算法,并使用相同的因子将生成的求交多边形向下缩放,并将其转换为双精度,而不会造成太多精度损失 我不知道该怎么做。你可以用一个简单的乘数在两者之间转换: /* Using power-of-two because it is exac

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

是否有一种方法可以安全地使用相同的比例因子变换两个多边形,将它们的坐标转换为长坐标,使用Clipper执行求交算法,并使用相同的因子将生成的求交多边形向下缩放,并将其转换为双精度,而不会造成太多精度损失


我不知道该怎么做。

你可以用一个简单的乘数在两者之间转换:

/* 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);
    }
}
/*使用二的幂,因为它是完全可表示的,并且
缩放操作(不是舍入!)是无损的。值为1024
保留大约三个十进制数字*/
双常数标度=1024.0;
//代表范围
双常数最小值=标准::数值极限::最小()/刻度;
双常量最大值=标准::数值限制::最大值()/刻度;
长的
至长(双v)
{
if(v<0)
{
如果(v<最小值)
将_抛出_范围();
返回静态投影(v*刻度-0.5);
}
其他的
{
如果(v>最大值)
将_抛出_范围();
返回静态投影(v*刻度+0.5);
}
}
请注意,刻度越大,精度越高,但也会降低范围。实际上,这将浮点数转换为固定点数


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

我需要将两个多边形的相交区域作为新多边形。在某些情况下,这些多边形可能有“孔”或凹面。Clipper应该处理所有这些边缘情况。谢谢你的帮助!“缩放”-它似乎不用于缩放双精度?是否也有向后转换?\是的,@NSDawg,它非常简单,因为您没有溢出问题(可能只有舍入/转换不准确),这种转换是微不足道的。我发现我的方法只是不确定,因为我没有加/减0.5,所以我认为我错了。