Clipper 接受整数输入,但我想传递浮点值而不丢失精度。用于整数和双精度值的 Clipper 结构。
struct IntPoint {
cInt X;
cInt Y;
#ifdef use_xyz
cInt Z;
IntPoint(cInt x = 0, cInt y = 0, cInt z = 0): X(x), Y(y), Z(z) {};
#else
IntPoint(cInt x = 0, cInt y = 0): X(x), Y(y) {};
#endif
friend inline bool operator== (const IntPoint& a, const IntPoint& b)
{
return a.X == b.X && a.Y == b.Y;
}
friend inline bool operator!= (const IntPoint& a, const IntPoint& b)
{
return a.X != b.X || a.Y != b.Y;
}
};
struct DoublePoint
{
double X;
double Y;
DoublePoint(double x = 0, double y = 0) : X(x), Y(y) {}
DoublePoint(IntPoint ip) : X((double)ip.X), Y((double)ip.Y) {}
};
Run Code Online (Sandbox Code Playgroud)
为什么它不将双精度值作为输入。
Paths Polygon(2);
Polygon[0] << IntPoint(10, 10) << IntPoint(60, 10) << IntPoint(30, 100) ;
Polygon[1] << IntPoint(20, 20) << IntPoint(50, 20) << IntPoint(30, 80) ; //it Works
Paths Line(1);
line[0] << DoublePoint(40.2, 10.2) << DoublePoint(56.5, 85.45); //Not works
Run Code Online (Sandbox Code Playgroud)
Clipper 仅使用整数点类型。
IntPoint结构用于表示Clipper库中的所有顶点。我们特意选择了整数存储类型来保持数值稳健性。(该库的早期版本使用浮点坐标,但很明显,浮点不精确总是会导致偶尔的错误。)[src]
但是,您可以按所需的因子缩放输入坐标。
所以不要想要这个,(它不存在)
line[0] << DoublePoint(40.2, 10.2) << DoublePoint(56.5, 85.45); //Not works
Run Code Online (Sandbox Code Playgroud)
您可以缩放 100。
line[0] << IntPoint(4020, 1020) << IntPoint(5650, 8545); //works
Run Code Online (Sandbox Code Playgroud)
只需记住将输出坐标缩放 0.01 即可返回到您的坐标系。