Skip to content
Snippets Groups Projects
gmshVertex.cpp 2.64 KiB
Newer Older
Christophe Geuzaine's avatar
Christophe Geuzaine committed
// Gmsh - Copyright (C) 1997-2009 C. Geuzaine, J.-F. Remacle
Christophe Geuzaine's avatar
Christophe Geuzaine committed
// See the LICENSE.txt file for license information. Please report all
// bugs and problems to <gmsh@geuz.org>.
#include "GEdge.h"
#include "gmshVertex.h"
#include "Geo.h"
#include "GeoInterpolation.h"
#include "MVertex.h"
#include "MElement.h"

gmshVertex::gmshVertex(GModel *m, Vertex *_v)
  : GVertex(m, _v->Num, _v->lc), v(_v)
{
  mesh_vertices.push_back(new MVertex(x(), y(), z(), this));
  points.push_back(new MPoint(mesh_vertices.back()));
}

void gmshVertex::setPosition(GPoint &p)
{
  v->Pos.X = p.x();
  v->Pos.Y = p.y();
  v->Pos.Z = p.z();
  if(mesh_vertices.size()){
    mesh_vertices[0]->x() = p.x();
    mesh_vertices[0]->y() = p.y();
    mesh_vertices[0]->z() = p.z();
  }
}

GEntity::GeomType gmshVertex::geomType() const
{
  if(v->Typ == MSH_POINT_BND_LAYER)
    return BoundaryLayerPoint;
  else
    return Point;
}
SPoint2 gmshVertex::reparamOnFace(const GFace *face, int dir) const
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
  Surface *s = (Surface*)face->getNativePtr();

  if(s->geometry){
    // It is not always right if it is periodic.
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
    if(l_edges.size() == 1 && 
       (*l_edges.begin())->getBeginVertex() ==
       (*l_edges.begin())->getEndVertex()){
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
      Range<double> bb = (*l_edges.begin())->parBounds(0);
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
      return (*l_edges.begin())->reparamOnFace(face, bb.low(), dir);
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
    } 
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
    return v->pntOnGeometry;
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
  }

  if(s->Typ ==  MSH_SURF_REGL){
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
    Curve *C[4];
    for(int i = 0; i < 4; i++)
      List_Read(s->Generatrices, i, &C[i]);

    double U, V;    
    if ((C[0]->beg == v && C[3]->beg == v) ||
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
        (C[0]->end == v && C[3]->beg == v) ||
        (C[0]->beg == v && C[3]->end == v) ||
        (C[0]->end == v && C[3]->end == v)){
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
      U = V = 0;
    }
    else if ((C[0]->beg == v && C[1]->beg == v) ||
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
             (C[0]->end == v && C[1]->beg == v) ||
             (C[0]->beg == v && C[1]->end == v) ||
             (C[0]->end == v && C[1]->end == v)){
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
      U = 1;
      V = 0;
    }
    else if ((C[2]->beg == v && C[1]->beg == v) ||
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
             (C[2]->end == v && C[1]->beg == v) ||
             (C[2]->beg == v && C[1]->end == v) ||
             (C[2]->end == v && C[1]->end == v)){
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
      U = 1;
      V = 1;
    }
    else if ((C[2]->beg == v && C[3]->beg == v) ||
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
             (C[2]->end == v && C[3]->beg == v) ||
             (C[2]->beg == v && C[3]->end == v) ||
             (C[2]->end == v && C[3]->end == v)){
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
      U = 0;
      V = 1;
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
    else{
      Msg::Info("Reparameterizing point %d on face %d", v->Num, s->Num);
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
      return GVertex::reparamOnFace(face, dir);
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
    return SPoint2(U, V);
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
  }
  else{
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
    return GVertex::reparamOnFace(face, dir);
Christophe Geuzaine's avatar
 
Christophe Geuzaine committed
  }