⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 toric_spline.cpp

📁 曲面加工程序源码,用C++编写的加工曲线曲面的程序
💻 CPP
字号:
#if !defined(__toric_spline_cpp)
#define __toric_spline_cpp

//Difinition of toric_spline class    980818

#include <math.h>
#pragma hdrstop

#include "toric_spline.h"
#include "recipe_sp2.h"

////Construcor and destructor
toric_spline::toric_spline(){
	Radius1=153.;
        Radius2=47.13;
        aaa=3.019e-7;
        bbb=1.27e-6;

        initial();
        splie2(data_x,data_y,data_z,nx,ny,data_z2a);

};
toric_spline::toric_spline( double r1,double r2, double a,double b){
	Radius1=r1;
        Radius2=r2;
        aaa=a;
        bbb=b;

        initial();
        splie2(data_x,data_y,data_z,nx,ny,data_z2a);
};

toric_spline::~toric_spline(){

        final();
};

inline void toric_spline::SetRadius1(double r ){Radius1=r;};
inline double toric_spline::GetRadius1(){return(Radius1);} ;

inline void toric_spline::SetRadius2(double r ){Radius2=r;};
inline double toric_spline::GetRadius2() {return(Radius2);};

inline void toric_spline::SetCoeffA(double a ){aaa=a;};
inline double toric_spline::GetCoeffA() {return(aaa);};

inline void toric_spline::SetCoeffB(double b ){bbb=b;};
inline double toric_spline::GetCoeffB(){return(bbb);};

inline double toric_spline::GetZ( double x, double y){

    double t;

    double r1 = Radius1;
    double r2 = Radius2;

    double a = aaa;
    double b = bbb;

    double c;
    splin2(data_x,data_y,data_z,data_z2a,nx,ny,x,y,&c);

    double ta= sqrt(1-y*y/r2/r2);
    double tb= sqrt((r1-y*y/(r2*(1+ta)))*(r1-y*y/(r2*(1+ta)))-x*x);

    t = c+r1+(a*x*x+b*y*y)*y*y-tb;
    //t= r1+(a*x*x+b*y*y)*y*y-tb;
    //t=c;
    return t;
    //z=0 ,when x=y=0.

};

inline vector toric_spline::GetPosition( double x, double y){
	return ( vector( x, y, GetZ(x,y) ) );
};

inline double toric_spline::gradX(double x, double y){

    double t;

    double r1 = Radius1;
    double r2 = Radius2;

    double a = aaa;
    double b = bbb;

    double c;
    dx_splin2(data_x,data_y, data_z,data_z2a, nx, ny, x, y,&c);

    double ta= sqrt(1-y*y/r2/r2);
    double tb= sqrt((r1-y*y/(r2*(1+ta)))*(r1-y*y/(r2*(1+ta)))-x*x);
    t = c+2*a*x*y*y+x/tb;
    //t = 2*a*x*y*y+x/tb;
    //t=c;

    //z=0 ,when x=y=0.
    return t;

};

inline double toric_spline::gradY(double x, double y){

    double t;

    double r1 = Radius1;
    double r2 = Radius2;

    double a = aaa;
    double b = bbb;

    double c;
    dy_splin2(data_x,data_y, data_z,data_z2a, nx, ny, x, y,&c);

    double ta= sqrt(1-y*y/r2/r2);
    double tb= sqrt((r1-y*y/(r2*(1+ta)))*(r1-y*y/(r2*(1+ta)))-x*x);
    t = c+2*a*x*x*y+4*b*y*y*y+y*(-y*y+r1*r2*(1+ta))*(-y*y+2*r2*r2*(1+ta))/(r2*r2*r2*r2*ta*(1+ta)*(1+ta)*(1+ta)*tb);
    //t = 2*a*x*x*y+4*b*y*y*y+y*(-y*y+r1*r2*(1+ta))*(-y*y+2*r2*r2*(1+ta))/(r2*r2*r2*r2*ta*(1+ta)*(1+ta)*(1+ta)*tb);
    //t=c;

    //z=0 ,when x=y=0.
    return t;

};

inline double toric_spline::gradXX(double x, double y){

    return 0.00001;
};

inline double toric_spline::gradYY(double x, double y){

    return 0.00001;
};

// This is the normal vector of surface on the point(x,y).
// This is toward the inside of toric_spline.
// This.length is 1.
vector toric_spline::NormalVector ( double x, double y){
	return ( vector( -gradX(x,y), -gradY(x,y), 1).normalize() );  //OK 980520
};
vector toric_spline::NormalVector ( vector position){
	return ( NormalVector( position.getX(), position.getY() ) );
};

////GradientVector////////////////////////////////////////////
// This is one of tangential vactors on the tangential plane.
// This is toward direction which has the largest gradient.
// This length is 1.
vector toric_spline::GradientVector(double x, double y){
	double gx = gradX( x,y);
	double gy = gradY( x,y);

	return ( vector( gx, gy, gx*gx+gy*gy ).normalize() );
};
vector toric_spline::GradientVector( vector position){
	return( GradientVector( position.getX(), position.getY() ) );
};

////NoGradientVector///////////////////////////////////////////
// This is one of tangential vactors on the tangential plane.
// This is toward direction which has no gradient.
//// This length will be 1,
//// and this Z-coordinate will be Zero.
vector toric_spline::NoGradientVector(double x,double y){
	return( NormalVector(x,y)%GradientVector(x,y) );
};
vector toric_spline::NoGradientVector(vector position){
	return( NormalVector(position)%GradientVector(position) );
};


int toric_spline::WriteFaceName(ofstream& fout){

	fout << "(Face name is : toric_spline);" << endl;
	return(1);
};
int toric_spline::WriteParameters(ofstream& fout){

	fout << "(Radius1[mm] is :" << Radius1 <<");" << endl;
	fout << "(Radius2[mm] is :" << Radius2 <<");" << endl;
	fout << "(A is :" << aaa <<");" << endl;
	fout << "(B is :" << bbb <<");" << endl;

	return(1);
};


void toric_spline::SetParameter(TStringList *str)
{
   for (int i=0; i<str->Count; i++){

         AnsiString temp;

         temp = "Radius1";
         if (str->Names[i]==temp){
              Radius1 = str->Values[str->Names[i]].ToDouble();
         };
         temp = "Radius2";
         if (str->Names[i]==temp){
              Radius2 = str->Values[str->Names[i]].ToDouble();
         };
         temp = "aaa";
         if (str->Names[i]==temp){
              aaa = str->Values[str->Names[i]].ToDouble();
         };
         temp = "bbb";
         if (str->Names[i]==temp){
              bbb = str->Values[str->Names[i]].ToDouble();
         };

         //isConcave
   };
   face::SetFaceParameter(str);
};

void toric_spline::GetParameter(TStringList *str)
{

   str->Add(AnsiString("---toric_spline parameter(s)---"));
   str->Add(AnsiString("FaceType=toric_spline"));

   str->Add(AnsiString("Radius1=")+ Radius1);
   str->Add(AnsiString("Radius2=")+ Radius2);

   str->Add(AnsiString("aaa=")+ AnsiString(aaa) );
   str->Add(AnsiString("bbb=")+ AnsiString(bbb) );

   str->Add(AnsiString("+Spline") );

   face::GetFaceParameter(str);
};

#endif



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -