У меня есть два многоугольника с их вершинами, хранящимися как двойные координаты. Я хотел бы найти пересекающуюся область этих многоугольников, поэтому я смотрю на Библиотека Clipper (Версия 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);
}
}
Обратите внимание, что чем больше вы сделаете масштаб, тем выше будет ваша точность, но это также уменьшит диапазон. По сути, это преобразует число с плавающей запятой в число с фиксированной запятой.
Наконец, вы должны быть в состоянии найти код для вычисления пересечений между отрезками, используя математику с плавающей точкой, поэтому мне интересно, почему вы хотите использовать именно Clipper.
Других решений пока нет …