-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDiskCirclePacking.h
78 lines (62 loc) · 2.38 KB
/
DiskCirclePacking.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#ifndef DISK_CIRCLE_PACKING_H
#define DISK_CIRCLE_PACKING_H
#include "boost/array.hpp"
#include <Eigen/Sparse>
#include "Triangulation.h"
#include "LinearAlgebra.h"
#include "Edge.h"
#include "Vertex.h"
#include "BabyUniverseDetector.h"
class DiskCirclePacking
{
public:
DiskCirclePacking(Triangulation * const triangulation);
~DiskCirclePacking() {}
bool FindEmbedding(const std::list<const Edge*> & boundary, const Edge * centerEdge=NULL);
void getCircles(std::vector<std::pair<Vertex*,std::pair<Vector2D,double> > > & circles);
void getHyperbolicCoordinates(std::vector<std::pair<Vertex*,Vector2D> > & coor) const;
void getBoundaryPositions(std::vector<double> & angles);
double getCenterRadius() const;
int getStepsUsed() const {
return steps_;
}
std::vector<Triangle *> getDiskTriangles()
{
return disk_triangles_;
}
private:
bool FindDiskRadii(const std::list<const Edge*> & boundary);
bool DiskLayout(const std::list<const Edge*> & boundary, const Edge * centerEdge);
bool FindFlatEmbedding();
void LayoutBoundary(std::vector<double> & radius, std::vector<Vector2D> & coordinate, int bLength);
void scaleRadii(std::vector<double> & radius, int bLength);
std::vector<Triangle *> disk_triangles_;
std::vector<Vertex *> disk_vertices_;
std::vector<Eigen::Triplet<double> > lapl_rules_;
std::vector<Eigen::Triplet<double> > boundary_rules_;
std::vector<double> vertex_weight_;
std::vector<boost::array<int,4> > edge_to_vert_;
double Angle(Edge * edge);
double AngleSum(int vertexId);
double Angle(Edge * edge, const std::vector<int> & vertexPos, const std::vector<double> & radius);
double boundaryAngle(std::vector<double> & radius, int bLength, double r);
double boundaryAngleDerivative(std::vector<double> & radius, int bLength, double r);
const Triangulation * const triangulation_;
BabyUniverseDetector babyuniversedetector_;
std::list<const Edge*> boundary_;
const Edge * center_edge_;
bool use_one_minus_radius_;
std::vector<int> degree_;
std::vector<double> radius_;
std::vector<boost::array<double,3> > angles_;
std::vector<double> euclidean_radius_;
std::vector<Vector2D> coordinate_;
std::vector<Vector2D> hyp_coordinate_;
std::vector<bool> circle_fixed_;
std::vector<int> circle_order_;
int max_iterations_;
double epsilon_, delta_;
bool reset_radius_;
int steps_;
};
#endif