rendered paste body#include <fstream>
#include <vector>
#include <cmath>
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Delaunay_triangulation_2.h>
#include <CGAL/Triangulation_2.h>
#include <CGAL/ch_graham_andrew.h>
#include <CGAL/Delaunay_triangulation_adaptation_traits_2.h>
#include <CGAL/Voronoi_diagram_2.h>
#include <CGAL/Interpolation_traits_2.h>
#include <CGAL/natural_neighbor_coordinates_2.h>
#include <CGAL/interpolation_functions.h>
#include <CGAL/point_generators_2.h>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef K::Point_2 Point_2;
typedef K::Point_3 Point_3;
typedef CGAL::Segment_2<K> Segment_2;
typedef K::FT Coord_type;
typedef CGAL::Interpolation_traits_2<K> Traits;
typedef K::Iso_rectangle_2 Iso_rectangle_2;
typedef CGAL::Delaunay_triangulation_2<K> Delaunay;
typedef CGAL::Delaunay_triangulation_2<K>::Finite_edges_iterator Finite_edges_iterator;
#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QtDebug>
using namespace std;
class Widget : public QWidget
{
private:
double X;
double Y;
double Width;
double Height;
QImage ColorBar;
Delaunay dt;
std::vector<K::Point_3> DataPoints;
std::vector<K::Point_2> EdgePoints;
std::vector<K::Point_2> ConvexHull;
double Min;
double Max;
typedef CGAL::Data_access< std::map<Point_2, Coord_type, K::Less_xy_2 > > ValueAccess;
std::map<Point_2, Coord_type, K::Less_xy_2> FunctionValues;
public:
void Widget(
std::vector<K::Point_3> Data_Points,
std::vector<K::Point_2> Edge_Points,
std::vector<K::Point_2> Convex_Hull,
double ColorBarMin,
double ColorBarMax,
char *colorbarfile)
{
DataPoints = Data_Points;
EdgePoints = Edge_Points;
ConvexHull = Convex_Hull;
Min = ColorBarMin;
Max = ColorBarMax;
ColorBar("Colorbar.png");
X = 0;
Y = 66;
Width = 35;
Height = -13;
}
void SetInterpolation()
{
for (unsigned int i = 0; i < DataPoints.size(); i++)
{
//TODO: Once file stuff worked out switch 1 and 0 around
K::Point_2 tempXY(DataPoints[i].cartesian(1), DataPoints[i].cartesian(0));
double tempValue = DataPoints[i].cartesian(2);
FunctionValues.insert(std::make_pair(tempXY,tempValue));
}
}
double LinearInterpolation(double X,double Y)
{
K::Point_2 p(X,Y);
std::vector< std::pair< Point_2, Coord_type > > coords;
Coord_type norm = CGAL::natural_neighbor_coordinates_2(dt,p,std::back_inserter(coords)).second;
Coord_type res = CGAL::linear_interpolation(coords.begin(),
coords.end(), norm, ValueAccess(FunctionValues));
return res;
}
void DrawInterpolation(QPainter painter)
{
for(int x = 0; x < width()+100; x++)
{
for(int y = 0; y < height()+100; y++)
{
double tempX = X + Width*(double)x/(double)(width()+100);
double tempY = Y + Height*(double)y/(double)(height()+100);
double InterpolResult = LinearInterpolation(tempX,tempY);
double Scale = Max - Min;
//Check if defined
if(InterpolResult > 0.01 )
{
double HeightPixel = (InterpolResult -Min) / Scale *ColorBar.height() ;
if(HeightPixel > ColorBar.height()-1)
{
HeightPixel = ColorBar.height()-1;
}
else if(HeightPixel < 1)
{
HeightPixel = 1;
}
painter.setPen( QColor( ColorBar.pixel(0,HeightPixel) ) );
painter.drawPoint(QPointF (tempX,tempY));
}
}
}
}
void DrawDataPoints(QPainter painter)
{
painter.setPen(Qt::red);
for(unsigned int i = 0; i < DataPoints.size(); i++)
{
//TODO: Once file stuff worked out switch 1 and 0 around
painter.drawPoint(QPointF (DataPoints[i].cartesian(1),DataPoints[i].cartesian(0)));
}
}
void DrawTriangulation(QPainter painter)
{
painter.setPen(Qt::blue);
for(Finite_edges_iterator eit = dt.finite_edges_begin();
eit != dt.finite_edges_end(); eit++)
{
painter.drawLine(QLineF(
dt.segment(eit).source().cartesian(0), dt.segment(eit).source().cartesian(1),
dt.segment(eit).target().cartesian(0), dt.segment(eit).target().cartesian(1)
));
}
}
void DrawEdgesOfMap(QPainter painter)
{
painter.setPen(Qt::black);
for(unsigned int i = 1; i < EdgePoints.size(); i++)
{
if(EdgePoints[i].cartesian(0) == 999 || EdgePoints[i-1].cartesian(0) == 999)
i++;
else
painter.drawLine(QLineF(
EdgePoints[i-1].cartesian(0), EdgePoints[i-1].cartesian(1),
EdgePoints[i ].cartesian(0), EdgePoints[i ].cartesian(1))
);
}
}
public:
void paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setWindow(X,Y,Width,Height);
SetInterpolation();
DrawInterpolation(painter);
DrawDataPoints(painter);
DrawTriangulation(painter);
DrawEdgesOfMap(painter);
}
};