Возможно ли дать плавающие значения в Clipper Paths - PullRequest
0 голосов
/ 14 октября 2019

Clipper принимает целочисленный ввод, но я хочу передать плавающие значения без потери точности. Структура Clipper для Integer и двойного значения.

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) {}
};

почему он не принимает двойное значение в качестве входного.

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

1 Ответ

3 голосов
/ 14 октября 2019

Clipper использует только целочисленные типы точек .

Структура IntPoint используется для представления всех вершин в библиотеке Clipper. Целочисленный тип хранения был специально выбран для сохранения числовой устойчивости. (Ранние версии библиотеки использовали координаты с плавающей точкой, но стало очевидно, что неточность с плавающей точкой всегда будет вызывать случайные ошибки.) [src]

Однако вы можете масштабировать входные координаты желаемым фактором.

Так что вместо того, чтобы этого захотеть (которого не существует)

line[0] << DoublePoint(40.2, 10.2) << DoublePoint(56.5, 85.45); //Not works

Вы можете масштабировать до 100.

line[0] << IntPoint(4020, 1020) << IntPoint(5650, 8545); //works

Просто не забудьте масштабировать выходные координаты на 0,01, чтобы вернуться к вашей системе координат.

...