|
|
int TDube::Get_TwoCmpValue(const float Temp_f1 , const float Temp_f2)
{
float T_f1,T_f2;
int Ret_Value;
T_f1=Temp_f1;
T_f2=Temp_f2;
if ((T_f1==0)&&(T_f2>0))
Ret_Value=0;
else if ((T_f1==0)&&(T_f2==0))
Ret_Value=1;
else if ((T_f1==0)&&(T_f2<0))
Ret_Value=2;
else if ((T_f1>0)&&(T_f2>0))
Ret_Value=3;
else if ((T_f1>0)&&(T_f2==0))
Ret_Value=4;
else if ((T_f1>0)&&(T_f2>0))
Ret_Value=5;
else if ((T_f1<0)&&(T_f2>0))
Ret_Value=6;
else if ((T_f1<0)&&(T_f2==0))
Ret_Value=7;
else if ((T_f1<0)&&(T_f2<0))
Ret_Value=8;
return Ret_Value;
}
//把AB直线旋转到OX轴上
RotateAngle TDube::Get_LineRotateAngle(VtxPoint Point_A , VtxPoint Point_B)
{
RotateAngle RetRotateAngle;
VtxPoint C,B;
float TempAngle;
int Temp_Swt;
C.x=Point_B.x - Point_A.x;
C.y=Point_B.y - Point_A.y;
C.z=Point_B.z - Point_A.z;
C.r=Point_B.r;
B.x=B.y=B.z=0.0f;
B.r=Point_B.r;
if (C.x!=0)
TempAngle = atan(fabs(C.y)/fabs(C.x))*180.0f/PIE;
Temp_Swt=Get_TwoCmpValue(C.x,C.y); //把BC旋转到OXZ平面
switch(Temp_Swt)
{
case 0: RetRotateAngle.Z_Offset=270; break;
case 1: RetRotateAngle.Z_Offset=0; break;
case 2: RetRotateAngle.Z_Offset=90; break;
case 3: RetRotateAngle.Z_Offset=360-TempAngle; break;
case 4: RetRotateAngle.Z_Offset=0; break;
case 5: RetRotateAngle.Z_Offset=TempAngle; break;
case 6: RetRotateAngle.Z_Offset=180+TempAngle; break;
case 7: RetRotateAngle.Z_Offset=180; break;
case 8: RetRotateAngle.Z_Offset=180-TempAngle; break;
default : break;
}
C=RotaZ(C,RetRotateAngle.Z_Offset);
if (C.x!=0)
TempAngle = atan(fabs(C.z)/fabs(C.x))*180.0f/PIE;
Temp_Swt=Get_TwoCmpValue(C.x,C.z);
switch(Temp_Swt)
{
case 0: RetRotateAngle.Y_Offset=90; break;
case 1: RetRotateAngle.Y_Offset=0; break;
case 2: RetRotateAngle.Y_Offset=270; break;
case 3: RetRotateAngle.Y_Offset=TempAngle; break;
case 4: RetRotateAngle.Y_Offset=0; break;
case 5: RetRotateAngle.Y_Offset=360-TempAngle; break;
case 6: RetRotateAngle.Y_Offset=180-TempAngle; break;
case 7: RetRotateAngle.Y_Offset=180; break;
case 8: RetRotateAngle.Y_Offset=180+TempAngle; break;
/*
case 3: RetRotateAngle.Y_Offset=360-TempAngle; break;
case 4: RetRotateAngle.Y_Offset=0; break;
case 5: RetRotateAngle.Y_Offset=TempAngle; break;
case 6: RetRotateAngle.Y_Offset=180+TempAngle; break;
case 7: RetRotateAngle.Y_Offset=180; break;
case 8: RetRotateAngle.Y_Offset=180-TempAngle; break;*/
default : break;
}
RetRotateAngle.X_Offset = 0.0f ; //atan(C.z/C.y)*180/PIE;
return RetRotateAngle;
}
//把ABC 旋转到OXY平面,把AB直线旋转到OX轴上 ,A为坐标原点,C点在AB的逆时针方向
// 圆心 切点 切点
RotateAngle TDube::Get_ArcRotateAngle(VtxPoint Point_A , VtxPoint Point_B , VtxPoint Point_C)
{
RotateAngle RetRotateAngle;
VtxPoint B,C,D;
float TempAngle;
int Temp_Swt;
C.x=Point_B.x - Point_A.x;
C.y=Point_B.y - Point_A.y;
C.z=Point_B.z - Point_A.z;
C.r=Point_B.r;
D.x=Point_C.x - Point_A.x;
D.y=Point_C.y - Point_A.y;
D.z=Point_C.z - Point_A.z;
D.r=Point_C.r;
B.x=B.y=B.z=0;
B.r=Point_A.r;
if (C.x!=0)
TempAngle = atan(fabs(C.y)/fabs(C.x))*180.0f/PIE;
Temp_Swt=Get_TwoCmpValue(C.x,C.y); //把BC旋转到OXZ平面 B为圆心
switch(Temp_Swt)
{
case 0: RetRotateAngle.Z_Offset=270; break;
case 1: RetRotateAngle.Z_Offset=0; break;
case 2: RetRotateAngle.Z_Offset=90; break;
case 3: RetRotateAngle.Z_Offset=360-TempAngle; break;
case 4: RetRotateAngle.Z_Offset=0; break;
case 5: RetRotateAngle.Z_Offset=TempAngle; break; case 6: RetRotateAngle.Z_Offset=180+TempAngle; break;
case 7: RetRotateAngle.Z_Offset=180; break;
case 8: RetRotateAngle.Z_Offset=180-TempAngle; break;
default : break;
}
// C=RotaZ(C,RetRotateAngle.Z_Offset);
// D=RotaZ(D,RetRotateAngle.Z_Offset);
if (C.x!=0) //把BC旋转到OX轴的正向 B为圆心
TempAngle = atan(fabs(C.z)/fabs(C.x))*180.0f/PIE;
Temp_Swt=Get_TwoCmpValue(C.x,C.z);
switch(Temp_Swt)
{
case 0: RetRotateAngle.Y_Offset=90; break;
case 1: RetRotateAngle.Y_Offset=0; break;
case 2: RetRotateAngle.Y_Offset=270; break;
case 3: RetRotateAngle.Y_Offset=TempAngle; break;
case 4: RetRotateAngle.Y_Offset=0; break;
case 5: RetRotateAngle.Y_Offset=360-TempAngle; break;
case 6: RetRotateAngle.Y_Offset=180-TempAngle; break;
case 7: RetRotateAngle.Y_Offset=180; break;
case 8: RetRotateAngle.Y_Offset=180+TempAngle; break;
}
RetRotateAngle.Y_Offset=RetRotateAngle.Y_Offset;
// C=RotaY(C,RetRotateAngle.Y_Offset);
// D=RotaY(D,RetRotateAngle.Y_Offset);
if (D.y!=0) //把D点旋转到BC 的逆时针方向 //OXY
TempAngle = atan(fabs(D.z)/fabs(D.y))*180.0f/PIE;
Temp_Swt=Get_TwoCmpValue(D.y,D.z);
switch(Temp_Swt)
{
case 0: RetRotateAngle.X_Offset=270; break;
case 1: RetRotateAngle.X_Offset=0; break;
case 2: RetRotateAngle.X_Offset=90; break;
case 3: RetRotateAngle.X_Offset=360-TempAngle; break;
case 4: RetRotateAngle.X_Offset=0; break;
case 5: RetRotateAngle.X_Offset=TempAngle; break;
case 6: RetRotateAngle.X_Offset=180-TempAngle; break;
case 7: RetRotateAngle.X_Offset=180; break;
case 8: RetRotateAngle.X_Offset=180+TempAngle; break;
default : break;
}
return RetRotateAngle;
}
现在我想把两点AB 旋转到OX轴的正向,就是这个函数Get_LineRotateAngle
然后把ABC三点旋转到0XY平面, A 为圆心,AB 为OX 的正向,C 点在AB的逆时针方向,就是 Get_ArcRotateAngle函数
现在始终不对,请问大侠,那里有问题,该如何修改
|
|