📄 ellipsoid_conv.cpp
字号:
#if !defined(__ellipsoid_conv_cpp)
#define __ellipsoid_conv_cpp
//Difinition of ellipsoid_conv class 19990318
#include <math.h>
#pragma hdrstop
#include "ellipsoid_conv.h"
////Construcor and destructor
ellipsoid_conv::ellipsoid_conv(){
cz=134.6465624; //[mm]
cy=134.6465624; //[mm]
cx=1009.024131; //[mm]
dx=925.; //[mm]
dy=0.; //[mm]
dz=53.7931; //[mm]
rx_design=13.; //rotation around x-axis(form) [deg]
rx_setup =0.;//ritation araound x-asis(setup) [deg]
h_plane=-50.;
z_top=100.;//=38.86-5;
};
ellipsoid_conv::~ellipsoid_conv(){
};
//equations for calcuration
inline bool ellipsoid_conv::InMirrorArea(double x,double y){
return InMirrorBody(x,y,PlaneZ(x,y));
};
inline bool ellipsoid_conv::InMirrorBody(double x,double y,double z){
double t=(rx_setup+rx_design)*M_PI/180.;
double xo=x*cos(t)+z*sin(t)+dx;
double yo=y+dy;
double zo=-x*sin(t)+z*cos(t)+dz;
return ((xo/cx)*(xo/cx)+(yo/cy)*(yo/cy)+(zo/cz)*(zo/cz)<=1);
};
inline int ellipsoid_conv::AreaJudgement(double x,double y, double &z){
//儚乕僋偺僄儕傾傪敾掕偟丄僄儕傾ID偲偦偺揰偱偺Z嵗昗傪曉偡
//AreaID= 0 :Mirror
// 1 :Plane
// 2 :ztop
int judge;
if(InMirrorArea(x,y)) {
z=MirrorZ(x,y);
judge=0;
}else{
z=PlaneZ(x,y);
judge=1;
};
if (z>=z_top) {
z=z_top;
judge=2;
};
return judge;
};
inline double ellipsoid_conv::PlaneZ(double x,double y){
//double b=rx_setup*M_PI/180.;
/*if (fabs(b)<1.e-6) {
return h_plane;
}else{
return ((h_plane-y*cos(b))/sin(b));
}; */
return h_plane;
};
inline double ellipsoid_conv::MirrorZ(double x,double y){
//2000.02.07 morishin
double t=(rx_setup+rx_design)*M_PI/180.;
double z=(-2*pow(cy,2)*(pow(cz,2)*dx*sin(t) +
cos(t)*(pow(cx,2)*dz - (pow(cx,2) - pow(cz,2))*x*sin(t))) +
sqrt(-4*pow(cy,2)*(pow(cx,2)*pow(cos(t),2) + pow(cz,2)*pow(sin(t),2))*
(-(pow(cx,2)*pow(cy,2)*pow(cz,2)) + pow(cy,2)*pow(cz,2)*pow(dx,2) +
pow(cx,2)*pow(cy,2)*pow(dz,2) + pow(cx,2)*pow(cz,2)*pow(y,2) +
2*pow(cy,2)*pow(cz,2)*dx*x*cos(t) +
pow(cy,2)*pow(cz,2)*pow(x,2)*pow(cos(t),2) -
2*pow(cx,2)*pow(cy,2)*dz*x*sin(t) +
pow(cx,2)*pow(cy,2)*pow(x,2)*pow(sin(t),2)) +
4*pow(cy,4)*pow(pow(cz,2)*dx*sin(t) +
cos(t)*(pow(cx,2)*dz - (pow(cx,2) - pow(cz,2))*x*sin(t)),2)))/
(2.*pow(cy,2)*(pow(cx,2)*pow(cos(t),2) + pow(cz,2)*pow(sin(t),2)));
return z;
};
inline double ellipsoid_conv::MirrorgradX(double x,double y){
//2000.02.07 morishin
double t=(rx_setup+rx_design)*M_PI/180.;
double z=(pow(cy,2)*(pow(cx,2) - pow(cz,2))*sin(2*t) -
(2*sqrt(2)*pow(cx,2)*pow(cy,4)*pow(cz,2)*(x + dx*cos(t) - dz*sin(t)))/
sqrt(pow(cx,2)*pow(cy,2)*pow(cz,2)*
(pow(cx,2)*pow(cy,2) + pow(cy,2)*pow(cz,2) - pow(cy,2)*pow(dx,2) -
pow(cy,2)*pow(dz,2) - 2*pow(cy,2)*pow(x,2) - pow(cx,2)*pow(y,2) -
pow(cz,2)*pow(y,2) - 4*pow(cy,2)*dx*x*cos(t) +
(pow(cx,2)*pow(cy,2) - pow(cy,2)*pow(cz,2) - pow(cy,2)*pow(dx,2) +
pow(cy,2)*pow(dz,2) - pow(cx,2)*pow(y,2) + pow(cz,2)*pow(y,2))*
cos(2*t) + 4*pow(cy,2)*dz*x*sin(t) + 2*pow(cy,2)*dx*dz*sin(2*t))))/
(2.*pow(cy,2)*(pow(cx,2)*pow(cos(t),2) + pow(cz,2)*pow(sin(t),2)));
return z;
};
inline double ellipsoid_conv::MirrorgradY(double x,double y){
//2000.02.07 morishin
double t=(rx_setup+rx_design)*M_PI/180.;
double z=(-2*pow(cx,2)*pow(cz,2)*y)/
sqrt(-4*pow(cy,2)*(pow(cx,2)*pow(cos(t),2) + pow(cz,2)*pow(sin(t),2))*
(-(pow(cx,2)*pow(cy,2)*pow(cz,2)) + pow(cy,2)*pow(cz,2)*pow(dx,2) +
pow(cx,2)*pow(cy,2)*pow(dz,2) + pow(cx,2)*pow(cz,2)*pow(y,2) +
2*pow(cy,2)*pow(cz,2)*dx*x*cos(t) +
pow(cy,2)*pow(cz,2)*pow(x,2)*pow(cos(t),2) -
2*pow(cx,2)*pow(cy,2)*dz*x*sin(t) +
pow(cx,2)*pow(cy,2)*pow(x,2)*pow(sin(t),2)) +
4*pow(cy,4)*pow(pow(cz,2)*dx*sin(t) +
cos(t)*(pow(cx,2)*dz - (pow(cx,2) - pow(cz,2))*x*sin(t)),2));
return z;
};
inline double ellipsoid_conv::MirrorgradXX(double x,double y){
//2000.02.07 morishin
double t=(rx_setup+rx_design)*M_PI/180.;
double z=(-2*sqrt(2)*pow(cx,4)*pow(cy,4)*pow(cz,4)*(pow(cy,2) - pow(y,2)))/
pow(pow(cx,2)*pow(cy,2)*pow(cz,2)*
(pow(cx,2)*pow(cy,2) + pow(cy,2)*pow(cz,2) - pow(cy,2)*pow(dx,2) -
pow(cy,2)*pow(dz,2) - 2*pow(cy,2)*pow(x,2) - pow(cx,2)*pow(y,2) -
pow(cz,2)*pow(y,2) - 4*pow(cy,2)*dx*x*cos(t) +
(pow(cx,2)*pow(cy,2) - pow(cy,2)*pow(cz,2) - pow(cy,2)*pow(dx,2) +
pow(cy,2)*pow(dz,2) - pow(cx,2)*pow(y,2) + pow(cz,2)*pow(y,2))*
cos(2*t) + 4*pow(cy,2)*dz*x*sin(t) + 2*pow(cy,2)*dx*dz*sin(2*t)),1.5);
return z;
};
inline double ellipsoid_conv::MirrorgradYY(double x,double y){
//2000.02.07 morishin
double t=(rx_setup+rx_design)*M_PI/180.;
double z=-((sqrt(2)*pow(cx,4)*pow(cy,4)*pow(cz,4)*
(pow(cx,2) + pow(cz,2) - pow(dx,2) - pow(dz,2) - 2*pow(x,2) -
4*dx*x*cos(t) + (pow(cx,2) - pow(cz,2) - pow(dx,2) + pow(dz,2))*
cos(2*t) + 4*dz*x*sin(t) + 2*dx*dz*sin(2*t)))/
pow(pow(cx,2)*pow(cy,2)*pow(cz,2)*
(pow(cx,2)*pow(cy,2) + pow(cy,2)*pow(cz,2) - pow(cy,2)*pow(dx,2) -
pow(cy,2)*pow(dz,2) - 2*pow(cy,2)*pow(x,2) - pow(cx,2)*pow(y,2) -
pow(cz,2)*pow(y,2) - 4*pow(cy,2)*dx*x*cos(t) +
(pow(cx,2)*pow(cy,2) - pow(cy,2)*pow(cz,2) - pow(cy,2)*pow(dx,2) +
pow(cy,2)*pow(dz,2) - pow(cx,2)*pow(y,2) + pow(cz,2)*pow(y,2))*
cos(2*t) + 4*pow(cy,2)*dz*x*sin(t) + 2*pow(cy,2)*dx*dz*sin(2*t)),1.5));
return z;
};
inline double ellipsoid_conv::GetZ( double x, double y){
double z;
AreaJudgement(x,y,z);
return z;
//z=0 ,when x=y=0.
};
inline vector ellipsoid_conv::GetPosition( double x, double y){
return ( vector( x, y, GetZ(x,y) ) );
};
inline double ellipsoid_conv::gradX(double x, double y){
double z;
double value;
switch (AreaJudgement(x,y,z)){
case 0: //Mirror
value = MirrorgradX(x,y);
break;
case 1: //Plane
value = 0;
break ;
case 2: //ztop
value = 0;
break ;
default:
value = 0;
};
return value;
};
inline double ellipsoid_conv::gradY(double x, double y){
double z;
double value;
double b;
switch (AreaJudgement(x,y,z)){
case 0:
value = MirrorgradY(x,y);
break;
case 1:
b=rx_setup*M_PI/180.;
if (tan(b)!=0){
value= -1./tan(b); //PlanegradY
}else{
value= 0;
};
break ;
case 2:
value = 0; //ztop
break ;
default:
value = 0;
};
return value;
};
inline double ellipsoid_conv::gradXX(double x, double y){
double z;
double value;
switch (AreaJudgement(x,y,z)){
case 0: //Mirror
value = MirrorgradXX(x,y);
break;
case 1: //Plane
value = 0;
break ;
case 2: //ztop
value = 0;
break ;
default:
value = 0;
};
return value;
};
inline double ellipsoid_conv::gradYY(double x, double y){
double z;
double value;
switch (AreaJudgement(x,y,z)){
case 0: //Mirror
value = MirrorgradYY(x,y);
break;
case 1: //Plane
value = 0;
break ;
case 2: //ztop
value = 0;
break ;
default:
value = 0;
};
return value;
};
// This is the normal vector of surface on the point(x,y).
// This is toward the inside of ellipsoid_conv.
// This.length is 1.
vector ellipsoid_conv::NormalVector ( double x, double y){
return ( vector( -gradX(x,y), -gradY(x,y), 1).normalize() ); //OK 980520
};
vector ellipsoid_conv::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 ellipsoid_conv::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 ellipsoid_conv::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 ellipsoid_conv::NoGradientVector(double x,double y){
return( NormalVector(x,y)%GradientVector(x,y) );
};
vector ellipsoid_conv::NoGradientVector(vector position){
return( NormalVector(position)%GradientVector(position) );
};
int ellipsoid_conv::WriteFaceName(ofstream& fout){
fout << "(Face name is : ellipsoid_conv);" << endl;
return(1);
};
int ellipsoid_conv::WriteParameters(ofstream& fout){
fout << "(cx[mm] is :" << cx <<");" << endl;
fout << "(cy[mm] is :" << cy <<");" << endl;
fout << "(cz[mm] is :" << cz <<");" << endl;
fout << "(dx[mm] is :" << dx <<");" << endl;
fout << "(dy[mm] is :" << dy <<");" << endl;
fout << "(dz[mm] is :" << dz <<");" << endl;
fout << "(rx_design is[deg] :" << rx_design <<");" << endl;
fout << "(rx_setup[deg] is :" << rx_setup <<");" << endl;
fout << "(h_plane[mm] is :" << h_plane <<");" << endl;
fout << "(z_top[mm] is :" << z_top <<");" << endl;
return(1);
};
void ellipsoid_conv::SetParameter(TStringList *str)
{
for (int i=0; i<str->Count; i++){
AnsiString temp;
temp = "cx";
if (str->Names[i]==temp){
cx = str->Values[str->Names[i]].ToDouble();
};
temp = "cy";
if (str->Names[i]==temp){
cy = str->Values[str->Names[i]].ToDouble();
};
temp = "cz";
if (str->Names[i]==temp){
cz = str->Values[str->Names[i]].ToDouble();
};
temp = "dx";
if (str->Names[i]==temp){
dx = str->Values[str->Names[i]].ToDouble();
};
temp = "dy";
if (str->Names[i]==temp){
dy = str->Values[str->Names[i]].ToDouble();
};
temp = "dz";
if (str->Names[i]==temp){
dz = str->Values[str->Names[i]].ToDouble();
};
temp = "rx_design";
if (str->Names[i]==temp){
rx_design = str->Values[str->Names[i]].ToDouble();
};
temp = "rx_setup";
if (str->Names[i]==temp){
rx_setup = str->Values[str->Names[i]].ToDouble();
};
temp = "h_plane";
if (str->Names[i]==temp){
h_plane = str->Values[str->Names[i]].ToDouble();
};
temp = "z_top";
if (str->Names[i]==temp){
z_top = str->Values[str->Names[i]].ToDouble();
};
//isConcave
};
face::SetFaceParameter(str);
};
void ellipsoid_conv::GetParameter(TStringList *str)
{
str->Add(AnsiString("---ellipsoid_conv parameter(s)---"));
str->Add(AnsiString("FaceType=ellipsoid_conv"));
str->Add(AnsiString("---(x/cx)^2+(y/cy)^2+(z/cz)^2=1---"));
str->Add(AnsiString("cx=")+ cx);
str->Add(AnsiString("cy=")+ cy);
str->Add(AnsiString("cz=")+ cz);
str->Add(AnsiString("dx=")+ dx);
str->Add(AnsiString("dy=")+ dy);
str->Add(AnsiString("dz=")+ dz);
str->Add(AnsiString("rx_design=")+ rx_design);
str->Add(AnsiString("rx_setup=")+ rx_setup);
str->Add(AnsiString("h_plane=")+ h_plane);
str->Add(AnsiString("z_top=")+ z_top);
face::GetFaceParameter(str);
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -