Files
create/src/Mod/Cam/App/routine.h
luz paz 108a80091e Cam: translate doxygen from DE/FR to EN
For the purpose of making the source documentation uniform, source comments in this file were translated to english.
2021-12-16 23:57:04 +01:00

115 lines
5.2 KiB
C++

/***************************************************************************
* Copyright (c) 2007 Joachim Zettler <Joachim.Zettler@gmx.de> *
* Copyright (c) 2007 Mohamad Najib Muhammad Noor <najib_bean@yahoo.co.uk>
* *
* This file is part of the FreeCAD CAx development system. *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Library General Public *
* License as published by the Free Software Foundation; either *
* version 2 of the License, or (at your option) any later version. *
* *
* This library is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Library General Public License for more details. *
* *
* You should have received a copy of the GNU Library General Public *
* License along with this library; see the file COPYING.LIB. If not, *
* write to the Free Software Foundation, Inc., 59 Temple Place, *
* Suite 330, Boston, MA 02111-1307, USA *
* *
***************************************************************************/
/*********ROUTINE.H**********/
#ifndef ROUTINE_H
#define ROUTINE_H
/******MAIN INCLUDE******/
#include <vector>
/********FREECAD MESH**********/
// Things from the Mesh module
#include <Mod/Mesh/App/Core/MeshKernel.h>
#include <Mod/Mesh/App/Core/TopoAlgorithm.h>
#include <Mod/Mesh/App/Core/Iterator.h>
#include <Mod/Mesh/App/MeshPy.h>
#include <Mod/Mesh/App/Mesh.h>
/******NURBS STRUCT*********/
/*! \brief This Nurbs struct will be used internally without any connections to the outside
program
*/
typedef struct
{
std::vector<double> CntrlArray;
std::vector<double> KnotU;
std::vector<double> KnotV;
int MaxKnotU;
int MaxKnotV;
int MaxU;
int MaxV;
int DegreeU;
int DegreeV;
}NURBS;
/*! \brief Some Mathematical Routines
This class will be inherited by the Approx class to reduce code bloat.
This class have all the self-written matrix and vector routines,
and some NURBS routines from the Nurbs Book or translated from the NURBS
Toolbox for MATLAB
*/
class CamExport Routines
{
public:
// Multi-dimensional Newton method with a fixed starting value of 0
static std::vector<double> NewtonStep(std::vector<double> &F,std::vector<std::vector<double> > &DF);
protected:
double TrapezoidIntergration(const std::vector<double> &WithRespectTo, const std::vector<double> &Intergral);
//Matrix and vectors
void CramerSolve(std::vector< std::vector<double> > &RHS1, std::vector<double>& RHS2, std::vector<double> &LHS);
double CalcAngle(Base::Vector3f a, Base::Vector3f b, Base::Vector3f c);
/*! Determinant of a 2x2 Matrix */
inline double det2(std::vector< std::vector<double> > &Matrix)
{
return ((Matrix[0][0] * Matrix[1][1]) - (Matrix[0][1] * Matrix[1][0]));
};
double AreaTriangle(Base::Vector3f &a, Base::Vector3f &b, Base::Vector3f &c);
//NURBS
int FindSpan(int n, int p, double u, std::vector<double> KnotSequence);
void DersBasisFuns(int i, double u, int p, int n,
std::vector<double> &KnotSequence, std::vector< std::vector<double> > &Derivate);
void Basisfun(int i, double u, int p, std::vector<double> &KnotSequence, std::vector<double> &output);
void NrbDEval(NURBS &MainNurb, std::vector<NURBS> &DerivNurb, std::vector<double> &Point,
std::vector<double> &EvalPoint, std::vector<std::vector<double> > &jac);
void PointNrbEval(std::vector<double> &p, std::vector<double> &CurPoint, NURBS &MainNurb);
void PointBSPEval(int DegreeU, std::vector< std::vector<double> > &Cntrl, std::vector<double> &KnotSequence,
std::vector< double > &Output, double CurEvalPoint);
void PointNrbDerivate(NURBS MainNurb, std::vector<NURBS> &OutNurbs);
void bspderiv(int d, std::vector< std::vector<double> > &c, std::vector<double> &k,
std::vector< std::vector<double> > &OutputC, std::vector<double> &Outputk);
void ExtendKnot(double ErrPnt, int NurbDegree, int MaxCntrl, std::vector<double> &KnotSequence);
void Extension(std::vector<double> &KnotSequence, int SmallerIndex, int LargerIndex, double SmallerIndNewValue,
double LargerIndNewValue);
void GenerateUniformKnot(int MaxCntrl, int NurbDegree, std::vector<double> &KnotSequence);
unsigned long FindCorner(float ParamX, float ParamY, std::vector<unsigned long> &v_neighbour, std::vector <Base::Vector3f> &v_pnts);
private:
//Variables in Use by Routine TrapezoidIntegration
double m_h, m_result;
int m_N;
};
#endif /*ROUTINE_H DEFINED*/