RCS Computation Toolkit This repository provides C++ and Python tools for computing radar cross section (RCS) from surface currents or analytical models
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

241 lines
5.7 KiB

// MESH3D.H
// Definitions for common three dimensional geometric classes.
// They are: node3d, edge3d, tri3d, and tetra
#ifndef MESH3D_H
#define MESH3D_H
class vtr;
template <class T>
void ReArrange(int, T **, int);
#define NOT_ID_YET -100
#define VOLUME_NODE 0
#define SURFACE_NODE 1
#define EDGE_NODE 2
#define VERTEX_NODE 3
// types for triangles and edges
#define NONE 0
#define PEC 1
#define ABC 2
#define PMC 3
#define ZERO 1.0e-20
#define ASCENDING 1
#define DECENDING 0
#define PORIENT 0
#define NORIENT 1
class node3d {
friend double Distance(node3d, node3d);
friend double Distance(node3d *, node3d *);
friend double Distance(node3d *, double, double, double);
friend void ReArrangeNd(int, node3d **, int );
friend double DistanceSquare(node3d *);
private:
double x, y, z;
int id, type;
char valid;
public:
node3d(double = 0.0, double = 0.0, double = 0.0); // constructor
// set up procedures
void SetCoord(double = 0.0, double = 0.0, double = 0.0);
void SetId(int = 0);
void SetType(int = 0);
void SetValid(char cc) { valid = cc; };
// get functions
int GetId();
int GetType();
double GetX(), GetY(), GetZ();
char GetValid() { return valid; }
// overload operators
const node3d &operator=(const node3d &);
int operator != (const node3d &) const;
int operator == (const node3d &) const;
int operator > (const node3d &) const;
int operator < (const node3d &) const;
int operator >= (const node3d &) const;
int operator <= (const node3d &) const;
// print command
void print();
};
// forward class declaration
class tri3d;
class edge3d {
friend double Length(edge3d);
friend double Length(edge3d *);
friend int SameEdge(edge3d *, node3d *, node3d *);
private:
node3d *node[2];
int n, id;
int type;
int nTri; // number of triangles that connect to this edge
tri3d **triPtr; // pointers to the connecting triangles
public:
edge3d(); // constructor
// set up procedures
void SetEdge(node3d *, node3d *);
void SetEdge_no_arrange(node3d *nd0, node3d *nd1)
{ node[0] = nd0; node[1] = nd1; };
void SetN(int = 0);
void SetId(int, int);
void SetId(int );
void SetType(int = 0);
void InsertTriPtr(tri3d *);
void SetTriPtr(int = 0, tri3d * = 0);
void ResetTriNumber();
void ReArrange();
// get functions
double GetX(), GetY(), GetZ();
double GetLength();
node3d *GetNodePtr(int = 0);
int GetTriNumber();
tri3d *GetTriPtr(int );
int GetN();
int GetId(int = 0);
// overload operators
const edge3d &operator=(const edge3d &);
int operator == (const edge3d &) const;
int operator > (const edge3d &) const;
int operator < (const edge3d &) const;
int operator >= (const edge3d &) const;
int operator <= (const edge3d &) const;
// print command
void print();
};
//
// The node numbering in tri3d is as follows
// 0
// + +
// + +
// + +
// + +
// 1 + + + + + 2
// eg[0] = {1, 2}, eg[1] = {2, 0}, and eg[2] = {0, 1}
// Make a note of it and make sure in the implementation of the code, this convention is preserved.
//
class tri3d {
friend double Area(tri3d);
friend double Area(tri3d *);
friend class edge3d;
friend tri3d *GetNeighborTriPtr(tri3d *, int);
friend int NodeInTri(node3d *, tri3d *);
friend void GetCartesian(tri3d *, double, double, double, double *, double *, double *);
friend void GetCartesian(tri3d *, double [], double *, double *, double *);
friend double Distance(tri3d *, tri3d *);
private:
edge3d *eg[3];
int n, id;
int type;
int num;
char done, orient;
float nx, ny, nz;
float cx, cy, cz;
public:
tri3d(); // constructor
// set up procedures
void SetTri(edge3d *, edge3d *, edge3d *);
void ReArrange();
void SetN(int = 0);
void SetId(int = 0, int = 0);
void SetType(int = 0);
void ComputeNormal();
void NormalReverse();
void setNum(int inputNum) { num = inputNum; }
// get functions
int GetId(int = 0);
int GetType();
node3d *GetNodePtr(int = 0);
edge3d *GetEdgePtr(int = 0);
void ResetDone();
void SetDone();
void GetValidEdges(int *);
char IsDone();
char GetOrient();
void GetNormal(double *, double *, double *);
void GetNormal(double *, double *, double *, vtr &);
void GetGradVtr(int, double *, double *, double *);
void GetGradVtr(int, double, double *, double *, double *);
void ComputeCenter(double *, double *, double *);
double ComputeRadius();
int getNum() { return num; }
void SetCenter(float x, float y, float z) {
cx = x;
cy = y;
cz = z;
}
void SetCenter(double x, double y, double z) {
cx = (float)x;
cy = (float)y;
cz = (float)z;
}
void GetCenter(double &x, double &y, double &z) {
x = (double)cx;
y = (double)cy;
z = (double)cz;
}
// overload operators
const tri3d &operator=(const tri3d &);
int operator == (const tri3d &) const;
int operator > (const tri3d &) const;
int operator < (const tri3d &) const;
int operator >= (const tri3d &) const;
int operator <= (const tri3d &) const;
// print command
void print();
};
class tetra {
friend double Volume(tetra);
friend double Volume(tetra *);
private:
node3d *node[4];
int n, *id;
public:
tetra(); // constructor
// set up procedures
void SetTetra(node3d *, node3d *, node3d *, node3d *);
void SetN(int = 0);
void SetId(int = 0, int = 0);
// get functions
node3d *GetNodePtr(int = 0);
int GetId(int = 0);
// overload operators
const tetra &operator=(const tetra &);
};
#endif