shape_doc 0.1
|
#include <cell2d_algebraic_curve.hpp>
Kernel for cell2d_algebraic_curve Polynomial : the type of polynomial associated to this class. subdivisor : the function which subdivides the representation.
Definition at line 45 of file cell2d_algebraic_curve.hpp.
void subdivide | ( | CELL & | cl, |
CELL *& | left, | ||
CELL *& | right, | ||
int | v, | ||
double | s | ||
) | [static] |
Definition at line 59 of file cell2d_algebraic_curve.hpp.
References Solver.
Referenced by cell2d_voronoi_site2d< C, V >::subdivide(), and cell2d_algebraic_curve< C, V >::subdivide().
{ typedef typename topology<C,V>::Point Point; typedef solver_implicit<C,V> Solver; double eps =Approximate().eps; if(v==0) {//direction v=0 left = new CELL(cl); left ->set_xmax(s); right= new CELL(cl); right->set_xmin(s); // left = new CELL(cl.m_polynomial, BoundingBox(cl.xmin(),s, cl.ymin(), cl.ymax(), cl.zmin(), cl.zmax())); // right= new CELL(cl.m_polynomial, BoundingBox(s,cl.xmax(), cl.ymin(), cl.ymax(), cl.zmin(), cl.zmax())); tensor::split(left->m_polynomial, right->m_polynomial, v); Solver::edge_point(left->e_intersections, left->m_polynomial, Solver::east_edge, left->boundingBox()); right->w_intersections=left->e_intersections; left ->w_intersections=cl.w_intersections; right->e_intersections=cl.e_intersections; foreach(Point* p,cl.n_intersections) { if(p->x() < s) left ->n_intersections << p ; else right->n_intersections << p ; } foreach(Point* p,cl.s_intersections) { if(p->x() < s) left ->s_intersections<< p ; else right->s_intersections<< p ; } foreach(Point* p,cl.m_singular) { if(p->x() < s+eps) left ->m_singular << p ; // else if(p->x() > s-eps) right->m_singular << p ; } /* Update neighbors */ cl.connect0(left, right); left->join0(right); } else {//direction v==1 left = new CELL(cl); left->set_ymax(s); right= new CELL(cl); right->set_ymin(s); //left = new CELL(cl.m_polynomial, BoundingBox(cl.xmin(),cl.xmax(), cl.ymin(), s, cl.zmin(), cl.zmax())); //right= new CELL(cl.m_polynomial, BoundingBox(cl.xmin(),cl.xmax(), s, cl.ymax(), cl.zmin(), cl.zmax())); tensor::split(left->m_polynomial, right->m_polynomial, v); Solver::edge_point(left->n_intersections, left->m_polynomial, Solver::north_edge, left->boundingBox()); right->s_intersections=left->n_intersections; left ->s_intersections=cl.s_intersections; right->n_intersections=cl.n_intersections; foreach(Point* p,cl.w_intersections) { if(p->y() < s) left ->w_intersections << p ; else right->w_intersections << p ; } foreach(Point* p,cl.e_intersections) { if(p->y() < s) left ->e_intersections << p ; else right->e_intersections << p ; } foreach(Point* p,cl.m_singular) { if(p->y() < s+eps) left->m_singular << p ; // else if(p->y() > s-eps) right->m_singular << p ; } foreach(Point* p,cl.m_xcritical) { if(p->y() < s+eps) left->m_xcritical << p ; // else if(p->y() > s-eps) right->m_xcritical << p ; } foreach(Point* p,cl.m_ycritical) { if(p->y() < s+eps) left->m_ycritical << p ; // else if(p->y() > s-eps) right->m_ycritical << p ; } /* Update neighbors */ cl.connect1(left, right); left->join1(right); } /* disconnect parent */ cl.disconnect( ); }