Пример #1
0
int longestedge(int t)
{
  int LE;
  int e;
  double len;
  double maxlen;
  
  if (t==0)
    {
      return 0;
    }
  else
    {
      maxlen=0.0;
      
      for (e=0; e<3; e++)
	{
	  len = edgelen(t,e);
	  if (maxlen < len)
	    {
	      maxlen = len;
	      LE = e;
	    }
	}
      return LE;
    }	    

}
Пример #2
0
void LEPPdivide(int t, int *NumDiv)
{
  int t1;
  int t2;
  int t3;
  int t4;
  int e1[3];
  int e2[3];
  int P;
  int i;

  t1 = t;

  e1[0] = longestedge(t1);
  
  t2 = E[ 3*(t1-1)+e1[0] ];

  e2[0] = longestedge(t2);

/*  while (t2!=0 && E[ 3*(t2-1)+e2[0] ]!=t1) */
  while (t2!=0 && edgelen(t1, e1[0])<edgelen(t2,e2[0]))
    {
      t1    = t2;
      e1[0] = e2[0];
      t2    = E[ 3*(t1-1)+e1[0] ];
      e2[0] = longestedge(t2);
    }

  if (t2!=0 && edgelen(t1, e1[0])==edgelen(t2,e2[0]))
    {
      for (i=0; i<3; i++)
	{
	  if (E[3*(t2-1)+i]==t1)
	    {
	      e2[0] = i;
	      break;
	    }
	}
    }

  /* ************************************************************************************** */
  /* At this point, the following should be true:                                           */
  /*                                                                                        */
  /*   (1)  t2 = E[ 3*(t1-1)+e1[0] ]; i.e., t2 is the id of the triangle adjacent to        */
  /*        the longest edge (e1[0] = 0, 1, or 2, whichever is longest) of the triangle     */
  /*   	    with id t1;                                                                     */
  /*	                                                                                    */
  /*  and                                                                                   */
  /*                                                                                        */
  /*   (2)  either:                                                                         */
  /*                                                                                        */
  /*       (a) t1 = E[ 3*(t2-1)+e2[0] ]; i.e, t1 is the triangle adjacent to the            */
  /*	       longest edge of t2 (t1 and t2 share a common longest edge)                   */
  /*                                                                                        */
  /*	    or                                                                              */
  /*                                                                                        */
  /*	   (b) t2=0, i.e., the longest edge of t1 is along a boundary                       */
  /* ************************************************************************************** */
  
  if (t2==0)
    {
      printf("\n\n  Dividing boundary triangle %d.\n", t1);
      RefineList[t1-1]=-1;
    }
  else
    {
	  printf("\n\n  Dividing adjacent triangles %d and %d.\n", t1, t2);
	  RefineList[t1-1]=-1;
	  RefineList[t2-1]=-1;
    }
  
  for (i=1; i<3; i++)
    {
      if (e1[0]+i>2)
	{
	  e1[i]=e1[0]+i-3;
	}
      else
	{
	  e1[i]=e1[0]+i;
	}
      if (e2[0]+i>2)
	{
	  e2[i]=e2[0]+i-3;
	}
      else
	{
	  e2[i]=e2[0]+i;
	}
    }

  /* insert P at middle of e1[0] */

  X = realloc(X, 2*(NUMPTS+1)*sizeof(double));
  NUMPTS++;
  P = NUMPTS;

  X[2*(P-1)+0] = (0.5)*( X[ 2*(V[ 3*(t1-1)+e1[0] ] - 1)     ]
			+X[ 2*(V[ 3*(t1-1)+e1[1] ] - 1)     ] );
  X[2*(P-1)+1] = (0.5)*( X[ 2*(V[ 3*(t1-1)+e1[0] ] - 1) + 1 ]
			+X[ 2*(V[ 3*(t1-1)+e1[1] ] - 1) + 1 ] );

  /* Add triangle t3 */

  V = realloc(V, 3*(NUMTRI+1)*sizeof(int));
  E = realloc(E, 3*(NUMTRI+1)*sizeof(int));
  RefineList = realloc(RefineList, (NUMTRI+1)*sizeof(int));

  
  NUMTRI++;
  t3 = NUMTRI;

  RefineList[t3-1]=-1;

  printf("\n\n  Creating triangle %d.\n", t3);

  /* Connect vertices of t1 and t3 */

  V[3*(t3-1)+0] = P;
  V[3*(t3-1)+1] = V[ 3*(t1-1)+e1[1] ];
  V[3*(t3-1)+2] = V[ 3*(t1-1)+e1[2] ];

  V[3*(t1-1)+e1[1]] = P;

  if (t2 == 0)
    {
      t4=0;
    }
  else
    {
      /* Add triangle t4 */

      V = realloc(V, 3*(NUMTRI+1)*sizeof(int));
      E = realloc(E, 3*(NUMTRI+1)*sizeof(int));
      RefineList = realloc(RefineList, (NUMTRI+1)*sizeof(int));
 
      NUMTRI++;
      t4 = NUMTRI;
      
      RefineList[t4-1]=-1;

      printf("\n\n  Creating triangle %d.\n", t4);

      /* Connect vertices of t2 and t4 */
      
      V[3*(t4-1)+0] = P;
      V[3*(t4-1)+1] = V[ 3*(t2-1)+e2[1] ];
      V[3*(t4-1)+2] = V[ 3*(t2-1)+e2[2] ];
      
      V[3*(t2-1)+e2[1]] = P;
    }

  /* Fix adjacency for t1 and t3 */

  E[3*(t3-1)+0] = t2;
  E[3*(t3-1)+1] = E[3*(t1-1)+e1[1]];
  E[3*(t3-1)+2] = t1;

  E[3*(t1-1)+e1[0]] = t4;
  E[3*(t1-1)+e1[1]] = t3;

  if (t2!=0)
    {
      E[3*(t4-1)+0] = t1;
      E[3*(t4-1)+1] = E[3*(t2-1)+e2[1]];
      E[3*(t4-1)+2] = t2;
      
      E[3*(t2-1)+e2[0]] = t3;
      E[3*(t2-1)+e2[1]] = t4;
    }

  /* Fix adjacency for element that was adjacent to t1 and is now adjacent to t3
               and for element that was adjacent to t2 and is now adjacent to t4  */

  for (i=0; i<3; i++)
    {
      if ( E[3*( E[3*(t3-1)+1] - 1 ) + i] == t1 )
	{
	  E[3*( E[3*(t3-1)+1] - 1 ) + i] = t3;
	}

      if (t2!=0)
	{
	  if ( E[3*( E[3*(t4-1)+1] - 1 ) + i] == t2 )
	    {
	      E[3*( E[3*(t4-1)+1] - 1 ) + i] = t4;
	    }
	}
    }

  if (t2==0)
    {
      *NumDiv++;
    }
  else
    {
      *NumDiv = *NumDiv + 2;
    }

}
Пример #3
0
//==========================================================================
bool Path::estimateHoleInfo(vector<ftEdge*> edges, Point& centre, 
			    Point& axis, double& radius)
//==========================================================================
{
  centre.resize(edges[0]->geomCurve()->dimension());
  centre.setValue(0.0);

  // Select four points
  // First make parameterization
  vector<double> parval(edges.size()+1);
  vector<double> edgelen(edges.size()+1);
  parval[0] = 0.0;
  edgelen[0] = 0.0;
  size_t ki;
  for (ki=0; ki<edges.size(); ++ki)
    {
      double tdel = edges[ki]->tMax() - edges[ki]->tMin();
      double len = edges[ki]->estimatedCurveLength();
      parval[ki+1] = parval[ki]+tdel;
      edgelen[ki+1] = edgelen[ki] + len;
      centre += edges[ki]->point(edges[ki]->tMin());
    }
  int nmb_vx = (int)edges.size();
  if (edges[edges.size()-1]->next() != edges[0])
    {
      centre += edges[edges.size()-1]->point(edges[edges.size()-1]->tMax());
      nmb_vx++;
    }
  centre /= nmb_vx;

  vector<Point> pnt(4);
  int kj;
  //double tdel = (parval[parval.size()-1] - parval[0])/(double)4;
  double del = (edgelen[edgelen.size()-1] - edgelen[0])/(double)4;
  double tpar, len;
  for (kj=0, len=edgelen[0]+0.5*del; kj<4; ++kj, len+=del)
    {
      for (ki=0; ki<edgelen.size()-1; ++ki)
	if (len < edgelen[ki+1])
	  break;

      double frac = (len - edgelen[ki])/(edgelen[ki+1] - edgelen[ki]);
      tpar = parval[ki] + frac*(parval[ki+1]-parval[ki]);

      pnt[kj] = edges[ki]->point(edges[ki]->tMin() + tpar - parval[ki]);
    }

  Point centre2 = 0.25*(pnt[0] + pnt[1] + pnt[2] + pnt[3]);

  // std::ofstream of("hole_pts.g2");
  // of << "400 1 0 4 0 155 100 255" << std::endl;
  // of << pnt.size() << std::endl;
  // for (ki=0; ki<pnt.size(); ++ki)
  //   of << pnt[ki] << std::endl;
  // of << "400 1 0 4 255 0 0 255" << std::endl;
  // of << "1" << std::endl;
  // of << centre << std::endl;
  // of << "400 1 0 4 0 255 0 255" << std::endl;
  // of << "1" << std::endl;
  // of << centre2 << std::endl;

  centre = centre2;
  //axis = (pnt[1] - pnt[0]).cross(pnt[3] - pnt[2]);
  axis = (pnt[2] - pnt[0]).cross(pnt[3] - pnt[1]);
  double axlen = axis.length();
  double lentol = 1.0e-10;
  if (axlen < lentol)
    return false;

  axis.normalize();
  
  Point x1 = 0.5*(pnt[0] + pnt[1]);
  Point x2 = 0.5*(pnt[1] + pnt[2]);

  Point d1 = (pnt[1]-pnt[0]).cross(axis);
  d1.normalize();
  Point d2 = (pnt[2]-pnt[1]).cross(axis);
  d2.normalize();

  Point tmp1 = x1 + d1;
  Point tmp2 = x2 + d2;

  //double d1d2 = d1*d2;
  //double tdiv = 1.0 - d1d2*d1d2;
  //double t1 = (-x1*d1 + x2*d1 + d1d2*x1*d2 - d1d2*x2*d2)/tdiv;

  //centre = x1 + t1*d1;
  radius = (centre - pnt[0]).length();

//   // Adjust radius relative to bounding box
//   vector<Point> pos;
//   pos.insert(pos.end(), pnt.begin(), pnt.end());
//   for (ki=0; ki<edges.size(); ++ki)
//     {
//       pos.push_back(edges[ki]->point(edges[ki]->tMin()));
//       pos.push_back(edges[ki]->point(edges[ki]->tMax()));
//     }

//   BoundingBox box;
//   box.setFromPoints(pos);
//   double len = box.high().dist(box.low());
//   radius = std::min(radius, 0.5*len);
  return true;
}