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

标签 c++ casting polygon data-conversion clipperlib

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

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

我不太清楚该怎么做。

最佳答案

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

/* 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);
    }
}

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

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

关于c++ - 将多边形坐标从 Double 转换为 Long 以用于 Clipper 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17712121/

相关文章:

android - 创建自定义表单 java android

python - 使用 Voronoi 图查找多边形的中线

vb.net - 将自相交多边形拆分为非自相交多边形

没有 JNI 的 Java C++

c++ - 最小异或值 : Given an integer array A of N integers, 找出数组中具有最小异或值的整数对

java - Gson -> 导入带有对象的 JSON

java - 如何在运行时将 Class<T> 转换为类似于 Class<T extends Foo> 的对象?

c++ - 二维数组中的指针

javascript - 如何使用 C++ 使用 Emscripten 在 JavaScript 中分配变量并将它们保留在范围内?

Objective-C 将父类(super class)转换为子类