Skip to content
Snippets Groups Projects
Forked from gmsh / gmsh
20571 commits behind the upstream repository.
ExtrudeParams.cpp 3.09 KiB
// $Id: ExtrudeParams.cpp,v 1.7 2001-11-12 08:21:17 geuzaine Exp $

#include "Gmsh.h"
#include "Geo.h"
#include "CAD.h"
#include "ExtrudeParams.h"

void Projette (double p[3],double mat[3][3]) {
  double X, Y, Z ;

  X = p[0] * mat[0][0] + p[1] * mat[0][1] + p[2] * mat[0][2];
  Y = p[0] * mat[1][0] + p[1] * mat[1][1] + p[2] * mat[1][2];
  Z = p[0] * mat[2][0] + p[1] * mat[2][1] + p[2] * mat[2][2];
  p[0] = X;
  p[1] = Y;
  p[2] = Z;
}

ExtrudeParams :: ExtrudeParams (int ModeEx){
  geo.Mode = ModeEx;
  geo.Source = -1;
  mesh.ExtrudeMesh = false;
  mesh.Recombine = false;
}


void ExtrudeParams :: fill (int type ,
			    double T0, double T1, double T2,
			    double A0, double A1, double A2,
                            double X0, double X1, double X2, double angle){
  geo.trans[0] = T0;
  geo.trans[1] = T1;
  geo.trans[2] = T2;
  geo.axe[0] = A0;
  geo.axe[1] = A1;
  geo.axe[2] = A2;
  geo.pt[0] = X0;
  geo.pt[1] = X1;
  geo.pt[2] = X2;
  geo.angle = angle;
  geo.Type = type;
}

void ExtrudeParams :: Extrude ( int iLayer, int iElemLayer,
                                double &x, double &y, double &z){

  double dx0,dy0,dz0,dx1,dy1,dz1;
  double dx,dy,dz,angle;
  if(!iLayer){
    dx0=dy0=dz0=0.0;
    dx1 = mesh.hLayer[0];
    dy1 = mesh.hLayer[0];
    dz1 = mesh.hLayer[0];
  }
  else{
    dx0 = mesh.hLayer[iLayer-1];
    dy0 = mesh.hLayer[iLayer-1];
    dz0 = mesh.hLayer[iLayer-1];
    dx1 = mesh.hLayer[iLayer];
    dy1 = mesh.hLayer[iLayer];
    dz1 = mesh.hLayer[iLayer];
  }
  double t = (double) iElemLayer /(double)mesh.NbElmLayer[iLayer];
  switch(geo.Type){
  case TRANSLATE :
    dx = geo.trans[0]*(dx0 + t * (dx1-dx0));
    dy = geo.trans[1]*(dy0 + t * (dy1-dy0));
    dz = geo.trans[2]*(dz0 + t * (dz1-dz0));
    x+=dx;y+=dy;z+=dz;
    break;
  case ROTATE :
    angle = geo.angle;
    geo.angle = geo.angle*(dx0 + t * (dx1-dx0));
    ProtudeXYZ(x,y,z,this);
    geo.angle = angle;
    break;
  case TRANSLATE_ROTATE :
    angle = geo.angle;
    geo.angle = geo.angle*(dx0 + t * (dx1-dx0));
    ProtudeXYZ(x,y,z,this);
    geo.angle = angle;
    dx = geo.trans[0]*(dx0 + t * (dx1-dx0));
    dy = geo.trans[1]*(dy0 + t * (dy1-dy0));
    dz = geo.trans[2]*(dz0 + t * (dz1-dz0));
    x+=dx;y+=dy;z+=dz;
    break;
  default :
    Msg(GERROR, "Unknown extrusion type");
    break;
  }
}

void ExtrudeParams :: Rotate(double matr[3][3]){
  Projette(geo.trans,matr);
  Projette(geo.axe,matr);
  Projette(geo.pt,matr);
  geo.angle = -geo.angle;
}

void ExtrudeParams :: Extrude (double t, double &x, double &y, double &z){
  double dx,dy,dz,angle;

  switch(geo.Type){
  case TRANSLATE :
    dx = geo.trans[0]*t;
    dy = geo.trans[1]*t;
    dz = geo.trans[2]*t;
    x+=dx;y+=dy;z+=dz;
    break;
  case ROTATE :
    angle = geo.angle;
    geo.angle = geo.angle*t;
    ProtudeXYZ(x,y,z,this);
    geo.angle = angle;
    break;
  case TRANSLATE_ROTATE :
    angle = geo.angle;
    geo.angle = geo.angle*t;
    ProtudeXYZ(x,y,z,this);
    geo.angle = angle;
    dx = geo.trans[0]*t;
    dy = geo.trans[1]*t;
    dz = geo.trans[2]*t;
    x+=dx;y+=dy;z+=dz;
    break;
  default :
    Msg(GERROR, "Unknown extrusion type");
    break;
  }
}