examples/ar-vineyard/ar-simplex3d.h
 author Dmitriy Morozov Wed, 15 Aug 2007 11:25:35 -0400 changeset 21 565a3e60eb7e parent 16 examples/alphashapes/alphashapes3d.h@626e2b875d21 child 22 c42734397d62 permissions -rw-r--r--
Initial AR vineyard commit (CGAL based, and not working)
```
/**
* Author: Dmitriy Morozov
* Department of Computer Science, Duke University, 2007
*/

#ifndef __ARSIMPLEX3D_H__
#define __ARSIMPLEX3D_H__

#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
#include <CGAL/Delaunay_triangulation_3.h>
//#include <CGAL/Kernel/global_functions_3.h>			// FIXME: what do we include for circumcenter?
#include <CGAL/squared_distance_3.h>

#include <simplex.h>
#include <types.h>

#include <vector>
#include <set>
#include <iostream>

struct K: CGAL::Exact_predicates_exact_constructions_kernel {};

typedef CGAL::Delaunay_triangulation_3<K>    		Delaunay;
typedef Delaunay::Point                				Point;
typedef Delaunay::Vertex            				Vertex;
typedef Delaunay::Vertex_handle            			Vertex_handle;
typedef Delaunay::Edge								Edge;
typedef Delaunay::Facet								Facet;
typedef Delaunay::Cell								Cell;
typedef Delaunay::Cell_handle						Cell_handle;
typedef K::FT										RealValue;

typedef Delaunay::Finite_vertices_iterator    		Vertex_iterator;
typedef Delaunay::Finite_edges_iterator        		Edge_iterator;
typedef Delaunay::Finite_facets_iterator        	Facet_iterator;
typedef Delaunay::Finite_cells_iterator        		Cell_iterator;
typedef Delaunay::Facet_circulator					Facet_circulator;

class ARSimplex3D: public SimplexWithVertices<Vertex_handle>
{
public:
typedef 	std::map<ARSimplex3D, RealValue>					SimplexPhiMap;
typedef		SimplexWithVertices<Vertex_handle>					Parent;
typedef		Parent::VertexContainer								VertexSet;
typedef		std::list<ARSimplex3D>								Cycle;

public:
ARSimplex3D()						{}
ARSimplex3D(const Parent& p):
Parent(p) 					{}
ARSimplex3D(const ARSimplex3D& s);

ARSimplex3D(const Parent::Vertex& v);
ARSimplex3D(const ::Vertex& v, const Point& z);

ARSimplex3D(const Edge& e);
ARSimplex3D(const Edge& e, const Point& z, SimplexPhiMap& simplices,
Facet_circulator facet_bg);

ARSimplex3D(const Facet& f);
ARSimplex3D(const Facet& f, const Point& z, const SimplexPhiMap& simplices);

ARSimplex3D(const Cell& c, const Point& z);

RealType					value() const						{ return CGAL::to_double(alpha_); }
RealValue					alpha() const						{ return alpha_; }
RealValue					phi_const() const					{ return phi_const_; }
RealValue					rho() const							{ return rho_; }
RealValue					s() const							{ return s_; }
RealValue					v() const							{ return v_; }

bool						attached() const					{ return attached_; }
Cycle						boundary() const;

void						set_phi_const(RealValue phi_const)	{ phi_const_ = phi_const; }

// Ordering
struct AlphaOrder
{ bool operator()(const ARSimplex3D& first, const ARSimplex3D& second) const; };

std::ostream& 				operator<<(std::ostream& out) const;

private:
RealValue 					alpha_;		// alpha_ 	is the squared radius of the smallest _empty_ circumsphere
RealValue					rho_;		// rho_ 	is the squared radius of the smallest circumsphere
RealValue					s_;			// s_ 		is the squared distance from z to the affine hull of the simplex
RealValue					v_;			// v_ 		is the squared distance from z to the affine hull of the dual Voronoi cell
RealValue					phi_const_;	// see LHI paper, Appendix 1
bool 						attached_;

};

typedef 			std::vector<ARSimplex3D>								ARSimplex3DVector;

void				update_simplex_phi_map(const ARSimplex3D& s, ARSimplex3D::SimplexPhiMap& simplices);
void 				fill_alpha_order(const Delaunay& Dt, const Point& z, ARSimplex3DVector& alpha_order);

std::ostream& 		operator<<(std::ostream& out, const ARSimplex3D& s)	{ return s.operator<<(out); }

#include "ar-simplex3d.hpp"

#endif // __ARSIMPLEX3D_H__
```