The AreaCon Library  1.0
A C++ library for area-constrained partitioning operations
 All Classes Namespaces Files Functions Variables Pages
areacon.h
Go to the documentation of this file.
1 /********************************************/
31 #ifndef __AreaCon__areacon__
32 #define __AreaCon__areacon__
33 
34 #include <stdio.h>
35 #include <cmath>
36 #include <algorithm>
37 #include <iostream>
38 #include <fstream>
39 #include "clipper.hpp"
40 
41 
42 
43 
44 namespace AreaCon {
45  // Point Class-------------------------------------------------------------------------------------------------------
46  // ------------------------------------------------------------------------------------------------------------------
51  class Point
52  {
53  public:
55  double x;
56  double y;
58  static double Robustness_Constant;
65  Point(const double x = INFINITY, const double y = INFINITY);
67 
69 
73  double Norm() const;
78  Point AddPoint(const Point Test) const;
85  Point FindPerpDirection(const Point Test, const double Norm) const;
89  void FlipDirection(void);
96  double PerpDistanceToLine(const Point Test1, const Point Test2) const;
103  bool AreCollinear(const Point Test1, const Point Test2)const;
110  bool AreBetween(const Point Test1, const Point Test2) const;
115  void Mult(const double factor);
117 
119 
125  static bool IsEqual(const Point Test1, const Point Test2);
132  static double Distance(const Point Test1, const Point Test2);
140  static Point FindPointAlongLine(const Point Test1, const Point Test2, const double distance);
146  static double Norm(const Point Test);
153  static Point AddPoints(const Point Test1, const Point Test2);
161  static Point FindPerpDirection(const Point Test1, const Point Test2, const double Norm);
169  static double PerpDistanceToLine(const Point Test1, const Point Test2, const Point Test3);
177  static bool AreCollinear(const Point Test1, const Point Test2, const Point Test3);
185  static bool AreBetween(const Point Test1, const Point Test2, const Point Test3);
194  static std::vector<Point> FindCollinearIntersection(const Point p1, const Point p2, const Point p3, const Point p4);
195 
196  };
197  // Poly Class-------------------------------------------------------------------------------------------------------
198  // ------------------------------------------------------------------------------------------------------------------
203  class Poly
204  {
205  public:
207 
211  Poly(std::vector<Point> Vertices = {});
213 
218  void SetVertices(const std::vector<Point> Vertices, const bool GetExtrema = true);
222  std::vector<Point> GetVertices(void) const;
226  int GetNVertices(void) const;
232  bool pnpoly(const Point Test) const;
237  void GetExtrema(double &minx, double &miny, double &maxx, double &maxy) const;
238 
239  private:
240  double minx;
241  double miny;
242  double maxx;
243  double maxy;
244  std::vector<Point> Vertices;
245  int NPoly;
249  void InitializePoly(void);
250  };
251  // Mult_Array Class--------------------------------------------------------------------------------------------------
252  // ------------------------------------------------------------------------------------------------------------------
258  {
259  public:
261 
265  Mult_Array(const int N);
269  Mult_Array(const Mult_Array &obj);
273  Mult_Array& operator=(const Mult_Array &obj);
277  ~Mult_Array(void);
279  double **Array;
280  const int N;
281  };
282  // Delaunay Class--------------------------------------------------------------------------------------------------
283  // ------------------------------------------------------------------------------------------------------------------
289  {
290  public:
292 
296  DelaunayGraph(const int NRegions);
300  DelaunayGraph(const DelaunayGraph &obj);
308  ~DelaunayGraph();
310 
312  const int NRegions;
313  };
314  // Int_Params Class--------------------------------------------------------------------------------------------------
315  // ------------------------------------------------------------------------------------------------------------------
321  {
322  public:
325  std::vector<double> Int, Intx, Inty;
328 
330  /*
331  * Default Constructor.
332  * @param[in] Coefficient_a A coefficient used in quickly calculating area integrals
333  * @param[in] Coefficient_b A coefficient used in quickly calculating area integrals
334  * @param[in] Coefficient_c A coefficient used in quickly calculating area integrals
335  * @param[in] Coefficient_d A coefficient used in quickly calculating area integrals
336  * @param[in] Int Vector representing the total integral over individual grid squares
337  * @param[in] Intx Vector representing the integral of the function x*f(x,y) over individual grid squares
338  * @param[in] Inty Vector representing the integral of the function y*f(x,y) over individual grid squares
339  * @param[in] Unweighted_Area The overall area of some polygonal region
340  */
341  Int_Params(std::vector<double> Coefficient_a = {}, std::vector<double> Coefficient_b= {}, std::vector<double> Coefficient_c= {}, std::vector<double> Coefficient_d= {}, std::vector<double> Int = {}, std::vector<double> Intx = {}, std::vector<double> Inty = {}, double UnweightedArea = 0);
343 
346  void CheckParameters(void) const;
347  };
348  // Parameters Class--------------------------------------------------------------------------------------------------
349  // ------------------------------------------------------------------------------------------------------------------
351  {
352  public:
354 
366  Parameters(const double line_int_step = 0.1,const double weights_step = 0.1, const double centers_step = 1,const double volume_tolerance = 0.002, const double convergence_criterion = 0.02, const int max_iterations_volume = 200, const int max_iterations_centers = 500, const double Volume_Lower_Bound = 10e-6, const double Robustness_Constant = 10e-8);
368 
369  const double line_int_step;
370  const double weights_step;
371  const double centers_step;
372  const double volume_tolerance;
373  const double convergence_criterion;
377  const double Volume_Lower_Bound;
378  const double Robustness_Constant;
380  private:
384  void CheckParameters(void);
385  };
386 
387  // Density Class--------------------------------------------------------------------------------------------------
388  // ------------------------------------------------------------------------------------------------------------------
393  class Density
394  {
395  public:
397 
400  Density();
407  Density(const Poly Region, const int Nx = 0, const int Ny = 0, const std::vector<double> Values = {});
409 
415  void SetNewRegion(const Poly Region, const int Nx = 0, const int Ny = 0, const std::vector<double> Values = {});
422  void SetParameters(const int Nx,const int Ny,const std::vector<double> Values);
426  int GetNx(void) const {return Nx;};
430  int GetNy(void) const {return Ny;};;
434  Poly GetRegion(void) const {return Region;};;
438  std::vector<bool> GetGridInRegion(void) const {return GridInRegion;};
442  Int_Params GetIntegral(void) const {return Integral;};
447  void GetExtrema (double &minx, double &miny, double &maxx, double &maxy) const {minx = this->minx; miny = this->miny; maxx = this->maxx; maxy = this->maxy;}
454  double LineIntegral(double spacing, const Point &p1, const Point &p2) const;
460  double CalculateWeightedArea(const Poly Region) const;
467  Point CalculateCentroid(const Poly Region, const double &Volume) const;
472  void SetVolumeLowerBound(const double VolumeLowerBound);
477  double GetVolumeLowerBound(void);
478  private:
480  int Nx;
481  int Ny;
482  double dx;
483  double dy;
484  double minx;
485  double miny;
486  double maxx;
487  double maxy;
489  std::vector<double> Values;
490  std::vector<bool> GridInRegion;
496  void CheckParameterSizes(void);
500  void SetExtrema(void);
504  void Setdxy(void);
508  void PreprocessIntegral(void);
512  void CreateIntegralCoefficients(void);
517  double CreateIntegralVector(void);
522  void NormalizeIntegralVector(const double &Total);
523 
529  double InterpolateValue(const Point &Test) const;
530 
535  Point ConvertIndextoWorld(const int ii) const;
536  };
537  // Partition Class--------------------------------------------------------------------------------------------------
538  // ------------------------------------------------------------------------------------------------------------------
543  class Partition
544  {
545  public:
547 
556  Partition(int NRegions = 0, Density Prior = Density(), std::vector<double> desired_area = {}, Parameters Alg_Params = Parameters());
558 
559 
565  void SetPartitionVariables(int NRegions = 0, Density Prior = Density(), std::vector<double> desired_area = {});
571  void InitializePartition(std::vector<Point> Centers = {},std::vector<double> Weights = {});
575  std::vector<Poly> GetCovering(void){return Covering;}
579  std::vector<Point> GetCenters(void){return Centers;}
583  std::vector<double> GetWeights(void){return Weights;}
590  void CalculatePartition(bool WriteToFile, std::string filename_partition = "", std::string filename_centers = "" );
592  private:
594  std::vector<Point> Centers;
595  std::vector<Poly> Covering;
596  std::vector<double> Weights;
598 
600  std::vector<double> desired_area;
602  int NRegions;
604 
605 
608  void CheckParams(void);
615  bool CreateDefaultCenters(const Poly Region, const double multiplier);
622  void CreateDefaultCenters(const Poly Region, const double initial_multiplier, const int max_steps);
626  bool CreatePowerDiagram(void);
632  void CleanCovering(const double tolerance, const long int &mult);
637  void CreateDelaunayGraph(DelaunayGraph &Delaunay) const;
643  double GradientStepCenter(const std::vector<double> &volumes);
650  void GradientStepCenter(const double &temp_step, const std::vector<double> &volumes);
656  void GradientStepWeights(const std::vector<double> &volumes, const DelaunayGraph &SharedEdges);
662  double CalculateError(const std::vector<double> &volumes);
667  std::vector<double> CalculateVolumes(void);
668  };
669 
670 }//the AreaCon namespace
671 #endif /* defined(__AreaCon__areacon__) */
double GradientStepCenter(const std::vector< double > &volumes)
Definition: areacon.cpp:1024
std::vector< double > CalculateVolumes(void)
Definition: areacon.cpp:1101
void SetNewRegion(const Poly Region, const int Nx=0, const int Ny=0, const std::vector< double > Values={})
Definition: areacon.cpp:350
std::vector< bool > GridInRegion
Definition: areacon.h:490
std::vector< double > Coefficient_d
Definition: areacon.h:324
Poly GetRegion(void) const
Definition: areacon.h:434
void GradientStepWeights(const std::vector< double > &volumes, const DelaunayGraph &SharedEdges)
Definition: areacon.cpp:1057
bool AreBetween(const Point Test1, const Point Test2) const
Definition: areacon.cpp:43
std::vector< Poly > GetCovering(void)
Definition: areacon.h:575
double Unweighted_Area
Definition: areacon.h:326
void InitializePartition(std::vector< Point > Centers={}, std::vector< double > Weights={})
Definition: areacon.cpp:712
int Nx
Definition: areacon.h:480
std::vector< Point > GetVertices(void) const
Definition: areacon.cpp:133
const int max_iterations_centers
Definition: areacon.h:375
int Ny
Definition: areacon.h:481
void Setdxy(void)
Definition: areacon.cpp:375
static bool IsEqual(const Point Test1, const Point Test2)
Definition: areacon.cpp:45
int GetNVertices(void) const
Definition: areacon.cpp:134
const double weights_step
Definition: areacon.h:370
std::vector< double > Inty
Definition: areacon.h:325
const double volume_tolerance
Definition: areacon.h:372
double GetVolumeLowerBound(void)
Definition: areacon.cpp:370
Point *** Graph
Definition: areacon.h:311
double Volume_Lower_Bound
Definition: areacon.h:488
std::vector< double > Values
Definition: areacon.h:489
void CalculatePartition(bool WriteToFile, std::string filename_partition="", std::string filename_centers="")
Definition: areacon.cpp:1108
int GetNx(void) const
Definition: areacon.h:426
const double Robustness_Constant
Definition: areacon.h:378
Point(const double x=INFINITY, const double y=INFINITY)
Definition: areacon.cpp:36
static std::vector< Point > FindCollinearIntersection(const Point p1, const Point p2, const Point p3, const Point p4)
Definition: areacon.cpp:102
void CheckParameterSizes(void)
Definition: areacon.cpp:352
void CheckParameters(void) const
Definition: areacon.cpp:303
void Mult(const double factor)
Definition: areacon.cpp:44
std::vector< double > GetWeights(void)
Definition: areacon.h:583
const double centers_step
Definition: areacon.h:371
Definition: areacon.h:257
~Mult_Array(void)
Definition: areacon.cpp:242
static double Distance(const Point Test1, const Point Test2)
Definition: areacon.cpp:46
Definition: areacon.h:393
static Point AddPoints(const Point Test1, const Point Test2)
Definition: areacon.cpp:49
void SetVolumeLowerBound(const double VolumeLowerBound)
Definition: areacon.cpp:367
double CalculateError(const std::vector< double > &volumes)
Definition: areacon.cpp:1093
double maxx
Definition: areacon.h:486
void SetExtrema(void)
Definition: areacon.cpp:349
Poly(std::vector< Point > Vertices={})
Definition: areacon.cpp:132
double PerpDistanceToLine(const Point Test1, const Point Test2) const
Definition: areacon.cpp:41
Definition: areacon.h:543
std::vector< double > Coefficient_c
Definition: areacon.h:324
std::vector< Point > GetCenters(void)
Definition: areacon.h:579
int GetNy(void) const
Definition: areacon.h:430
double miny
Definition: areacon.h:485
const double convergence_criterion
Definition: areacon.h:373
Density Prior
Definition: areacon.h:601
void GetExtrema(double &minx, double &miny, double &maxx, double &maxy) const
Definition: areacon.cpp:135
void InitializePoly(void)
Definition: areacon.cpp:172
double InterpolateValue(const Point &Test) const
Definition: areacon.cpp:396
double minx
Definition: areacon.h:240
void CreateIntegralCoefficients(void)
Definition: areacon.cpp:431
double y
Definition: areacon.h:56
double dx
Definition: areacon.h:482
void SetVertices(const std::vector< Point > Vertices, const bool GetExtrema=true)
Definition: areacon.cpp:136
Definition: areacon.h:320
Int_Params Integral
Definition: areacon.h:491
Definition: areacon.h:350
double CreateIntegralVector(void)
Definition: areacon.cpp:472
DelaunayGraph(const int NRegions)
Definition: areacon.cpp:251
void FlipDirection(void)
Definition: areacon.cpp:40
Definition: areacon.h:51
double dy
Definition: areacon.h:483
bool CreateDefaultCenters(const Poly Region, const double multiplier)
Definition: areacon.cpp:681
std::vector< double > Coefficient_a
Definition: areacon.h:324
void SetPartitionVariables(int NRegions=0, Density Prior=Density(), std::vector< double > desired_area={})
Definition: areacon.cpp:646
int NRegions
Definition: areacon.h:602
void CleanCovering(const double tolerance, const long int &mult)
Definition: areacon.cpp:922
int NPoly
Definition: areacon.h:245
std::vector< double > desired_area
Definition: areacon.h:600
Point CalculateCentroid(const Poly Region, const double &Volume) const
Definition: areacon.cpp:596
std::vector< double > Coefficient_b
Definition: areacon.h:324
static double Robustness_Constant
Definition: areacon.h:58
Poly Region
Definition: areacon.h:479
Definition: areacon.h:203
static Point FindPointAlongLine(const Point Test1, const Point Test2, const double distance)
Definition: areacon.cpp:47
const int max_iterations_volume
Definition: areacon.h:374
void GetExtrema(double &minx, double &miny, double &maxx, double &maxy) const
Definition: areacon.h:447
const double line_int_step
Definition: areacon.h:369
double minx
Definition: areacon.h:484
std::vector< double > Weights
Definition: areacon.h:596
std::vector< double > Int
Definition: areacon.h:325
std::vector< double > Intx
Definition: areacon.h:325
Point FindPerpDirection(const Point Test, const double Norm) const
Definition: areacon.cpp:39
~DelaunayGraph()
Definition: areacon.cpp:260
const double Volume_Lower_Bound
Definition: areacon.h:377
Definition: areacon.h:288
void CheckParameters(void)
Definition: areacon.cpp:324
bool pnpoly(const Point Test) const
Definition: areacon.cpp:148
Parameters(const double line_int_step=0.1, const double weights_step=0.1, const double centers_step=1, const double volume_tolerance=0.002, const double convergence_criterion=0.02, const int max_iterations_volume=200, const int max_iterations_centers=500, const double Volume_Lower_Bound=10e-6, const double Robustness_Constant=10e-8)
Definition: areacon.cpp:323
double ** Array
Definition: areacon.h:279
void SetParameters(const int Nx, const int Ny, const std::vector< double > Values)
Definition: areacon.cpp:386
void CheckParams(void)
Definition: areacon.cpp:648
double LineIntegral(double spacing, const Point &p1, const Point &p2) const
Definition: areacon.cpp:529
void CreateDelaunayGraph(DelaunayGraph &Delaunay) const
Definition: areacon.cpp:959
Density()
Definition: areacon.cpp:347
const int N
Definition: areacon.h:280
Point AddPoint(const Point Test) const
Definition: areacon.cpp:38
Point ConvertIndextoWorld(const int ii) const
Definition: areacon.cpp:351
bool CreatePowerDiagram(void)
Definition: areacon.cpp:743
Int_Params GetIntegral(void) const
Definition: areacon.h:442
const Parameters Alg_Params
Definition: areacon.h:599
std::vector< Point > Centers
Definition: areacon.h:594
double maxx
Definition: areacon.h:242
double CalculateWeightedArea(const Poly Region) const
Definition: areacon.cpp:549
double Norm() const
Definition: areacon.cpp:37
void NormalizeIntegralVector(const double &Total)
Definition: areacon.cpp:505
Mult_Array(const int N)
Definition: areacon.cpp:214
std::vector< Poly > Covering
Definition: areacon.h:595
bool AreCollinear(const Point Test1, const Point Test2) const
Definition: areacon.cpp:42
Partition(int NRegions=0, Density Prior=Density(), std::vector< double > desired_area={}, Parameters Alg_Params=Parameters())
Definition: areacon.cpp:645
std::vector< bool > GetGridInRegion(void) const
Definition: areacon.h:438
const int NRegions
Definition: areacon.h:312
double x
Definition: areacon.h:55
std::vector< Point > Vertices
Definition: areacon.h:244
Mult_Array & operator=(const Mult_Array &obj)
Definition: areacon.cpp:229
double miny
Definition: areacon.h:241
void PreprocessIntegral(void)
Definition: areacon.cpp:523
double maxy
Definition: areacon.h:243
Int_Params(std::vector< double > Coefficient_a={}, std::vector< double > Coefficient_b={}, std::vector< double > Coefficient_c={}, std::vector< double > Coefficient_d={}, std::vector< double > Int={}, std::vector< double > Intx={}, std::vector< double > Inty={}, double UnweightedArea=0)
Definition: areacon.cpp:300
double maxy
Definition: areacon.h:487
DelaunayGraph & operator=(const DelaunayGraph &obj)
Definition: areacon.cpp:281