Besbous
asked on
How to get function out of many ?
Hi ,
I have this code ! but it s too big and I only need one function (StrateTo(){}) from it , but the thing is that everything is connected, many stuff i don t need ! i was wondering how can i change .
I tried this :
void StrateTo(int x1, int y1, int z1, int x2, int y2, int z2 ){
StrateRoute(p);
CStrate *ps ;
CStrate *ppre;
CPoint3D mt;
int i=0 ;
ppre=ps=strate;
while(ps != NULL){
if(ppre->d!=ps->d)
while(distance('D')>0);
if(ppre->e!=ps->e)
while(distance('E')>0);
if(ppre->e!=ps->e)
while(distance('F')>0);
jd.RotateToPos(ps->d);
je.RotateToPos(ps->e);
jf.RotateToPos(ps->f);
ppre = ps ;
ps = ps->next ;
}
pos = p ;
}
but i don t know how to replace CStrate and jd.RotateToPos() in the function !
here is the main code :
#define PI 3.14159265
class CJoint{
public:
CJoint();
void SetParam(char _motor,double _step,int home);
void RotateTo(double angle);
void RotateToPos(int next_pos);
void RotateDelta(int delta);
void ShortRotateToPos(int next_pos);
void ShortRotateDelta(int delta);
int AngleToPos(double angle){return (int)(angle/step);};
int GetDistance();
int GetCurPos(){ return cur_pos ;};
int Stopped();
void Home();
void FastHome();
void SetCurPosHome(){cur_pos=ho me_pos;};
protected:
char motor ;
double step ;
int cur_pos;
int home_pos;
double angle ;
};
CJoint::CJoint(){
motor = '\0';
step = 1.0;
cur_pos = 0 ;
home_pos = 0 ;
angle = 0 ;
};
void CJoint::SetParam(char _motor,double _step,int _home){
cur_pos = home_pos = _home;
motor = _motor ;
step = _step ;
}
void CJoint::RotateTo(double angle){
int delta ;
delta = (int)(angle/step) - cur_pos ;
if( delta != 0)
rotate_long( motor, delta );
cur_pos += delta ;
}
void CJoint::RotateToPos(int next_pos){
int delta;
delta = next_pos - cur_pos ;
if( delta != 0)
rotate_long( motor, delta );
cur_pos += delta ;
}
void CJoint::RotateDelta(int delta){
if( delta != 0)
rotate_long(motor,delta);
cur_pos += delta ;
}
void CJoint::ShortRotateToPos(i nt next_pos){
int delta;
delta = next_pos - cur_pos ;
if( delta != 0)
rotate(motor,delta);
cur_pos += delta ;
}
void CJoint::ShortRotateDelta(i nt delta){
if( delta != 0)
rotate(motor,delta);
cur_pos += delta ;
}
int CJoint::GetDistance(){
return distance(motor);
}
int CJoint::Stopped(){
return (GetDistance()==0);
}
void CJoint::Home(){
home(motor);
}
void CJoint::FastHome(){
RotateTo(home_pos);
}
//************************ ********** ********** ********** ********** ********** ********** *******
#define STRATE_MAX 1024
#define STEP_DISTANCE 1
class CStrate{
public:
CStrate();
void XYZ2Angle();
int OverDistance();
void GetInterval(CStrate *pi);
void Print();
CStrate *next ;
int d;
int e;
int f;
double x ;
double y ;
double z ;
};
CStrate::CStrate(){
}
void CStrate::XYZ2Angle(){
double angle[3];
_angle2(x,y,z,angle);
d = (int)(angle[MOTOR_D]/STEP_ D);
e = (int)(angle[MOTOR_E]/STEP_ E);
f = (int)(angle[MOTOR_F]/STEP_ F);
}
int CStrate::OverDistance(){
if( abs(d - next->d) > STEP_DISTANCE ||
abs(e - next->e) > STEP_DISTANCE ||
abs(f - next->f) > STEP_DISTANCE ){
return 1;
}
return 0;
}
void CStrate::GetInterval(CStra te *pi){
pi->x = ( x + next->x )/2.0 ;
pi->y = ( y + next->y )/2.0 ;
pi->z = ( z + next->z )/2.0 ;
pi->XYZ2Angle();
}
void CStrate::Print(){
printf("(%6.1lf,%6.1lf,%6. 1lf)(%4d,% 4d,%4d)-", x,y,z,d,e, f);
printf("(%6.1lf,%6.1lf,%6. 1lf)(%4d,% 4d,%4d)\n" ,next->x,n ext->y,nex t->z,next- >d,next->e ,next->f);
}
//************************ ********** ********** ********** ********** ********** ********** *******
class CRobot{
public:
CRobot();
~CRobot();
void MoveTo(CPoint3D p);
void Move3To(CPoint3D p);
void StrateTo(CPoint3D p);
void WaitDEF();
void HomeAll();
CJoint ja;
CJoint jb;
CJoint jc;
CJoint jd;
CJoint je;
CJoint jf;
protected:
void StrateRoute(CPoint3D p);
int StrateRouteCore(CStrate *cur);
CPoint3D pos ;
CStrate *strate;
int strate_count ;
};
CRobot::CRobot(){
double home_angle[3];
strate = new CStrate[STRATE_MAX];
pos.x = XHOME ;
pos.y = YHOME ;
pos.z = ZHOME ;
_angle2( pos.x, pos.y, pos.z, home_angle );
ja.SetParam('A', 1.0,0);
jb.SetParam('B',STEP_B,0);
jc.SetParam('C',STEP_C,0);
jd.SetParam('D',STEP_D,(in t)(home_an gle[MOTOR_ D]/STEP_D) );
je.SetParam('E',STEP_E,(in t)(home_an gle[MOTOR_ E]/STEP_E) );
jf.SetParam('F',STEP_F,(in t)(home_an gle[MOTOR_ F]/STEP_F) );
}
CRobot::~CRobot(){
delete strate ;
}
void CRobot::MoveTo(CPoint3D p){
double angle[3];
_angle2(p.x,p.y,p.z,angle) ;
jd.RotateTo(angle[MOTOR_D] );
je.RotateTo(angle[MOTOR_E] );
jf.RotateTo(angle[MOTOR_F] );
pos=p;
}
void CRobot::StrateTo(CPoint3D p){
StrateRoute(p);
CStrate *ps ;
CStrate *ppre;
CPoint3D mt;
int i=0 ;
ppre=ps=strate;
while(ps != NULL){
/*
printf("[%3d](%6.1lf,%6.1l f,%6.1lf)( %6d,%6d,%6 d)\n",
i++,
ps->x,ps->y,ps->z,
ps->d,ps->e,ps->f);*/
jd.ShortRotateToPos(ps->d) ;
//if(ppre->d!=ps->d)
// while(!jd.Stopped());
je.ShortRotateToPos(ps->e) ;
//if(ppre->e!=ps->e)
// while(!je.Stopped());
jf.ShortRotateToPos(ps->f) ;
//if(ppre->e!=ps->e)
// while(!jf.Stopped());
/**//*
jd.RotateToPos(ps->d);
je.RotateToPos(ps->e);
jf.RotateToPos(ps->f);/**/
ppre = ps ;
ps = ps->next ;
}
pos = p ;
}
void CRobot::StrateRoute(CPoint 3D p){
strate[0].x = pos.x ;
strate[0].y = pos.y ;
strate[0].z = pos.z ;
strate[0].next = &strate[1];
strate[0].XYZ2Angle();
strate[1].x = p.x ;
strate[1].y = p.y ;
strate[1].z = p.z ;
strate[1].next = NULL ;
strate[1].XYZ2Angle();
strate_count = 2 ;
StrateRouteCore(strate);
}
int CRobot::StrateRouteCore(CS trate *cur){
//printf("[%d]",strate_cou nt);
//cur->Print();
CStrate *inter;
if( strate_count >= STRATE_MAX ){
printf("Memory Error(Strate)\n");
getchar();
return 0;
}
if( cur->OverDistance() ){
inter = &strate[strate_count] ;
strate_count ++ ;
cur->GetInterval(inter);
inter->next = cur->next ;
cur->next = inter ;
StrateRouteCore(cur );
StrateRouteCore(inter);
}
return 1 ;
}
void CRobot::WaitDEF(){
while( !jd.Stopped() || !je.Stopped() || !jf.Stopped() ){
}
}
I have this code ! but it s too big and I only need one function (StrateTo(){}) from it , but the thing is that everything is connected, many stuff i don t need ! i was wondering how can i change .
I tried this :
void StrateTo(int x1, int y1, int z1, int x2, int y2, int z2 ){
StrateRoute(p);
CStrate *ps ;
CStrate *ppre;
CPoint3D mt;
int i=0 ;
ppre=ps=strate;
while(ps != NULL){
if(ppre->d!=ps->d)
while(distance('D')>0);
if(ppre->e!=ps->e)
while(distance('E')>0);
if(ppre->e!=ps->e)
while(distance('F')>0);
jd.RotateToPos(ps->d);
je.RotateToPos(ps->e);
jf.RotateToPos(ps->f);
ppre = ps ;
ps = ps->next ;
}
pos = p ;
}
but i don t know how to replace CStrate and jd.RotateToPos() in the function !
here is the main code :
#define PI 3.14159265
class CJoint{
public:
CJoint();
void SetParam(char _motor,double _step,int home);
void RotateTo(double angle);
void RotateToPos(int next_pos);
void RotateDelta(int delta);
void ShortRotateToPos(int next_pos);
void ShortRotateDelta(int delta);
int AngleToPos(double angle){return (int)(angle/step);};
int GetDistance();
int GetCurPos(){ return cur_pos ;};
int Stopped();
void Home();
void FastHome();
void SetCurPosHome(){cur_pos=ho
protected:
char motor ;
double step ;
int cur_pos;
int home_pos;
double angle ;
};
CJoint::CJoint(){
motor = '\0';
step = 1.0;
cur_pos = 0 ;
home_pos = 0 ;
angle = 0 ;
};
void CJoint::SetParam(char _motor,double _step,int _home){
cur_pos = home_pos = _home;
motor = _motor ;
step = _step ;
}
void CJoint::RotateTo(double angle){
int delta ;
delta = (int)(angle/step) - cur_pos ;
if( delta != 0)
rotate_long( motor, delta );
cur_pos += delta ;
}
void CJoint::RotateToPos(int next_pos){
int delta;
delta = next_pos - cur_pos ;
if( delta != 0)
rotate_long( motor, delta );
cur_pos += delta ;
}
void CJoint::RotateDelta(int delta){
if( delta != 0)
rotate_long(motor,delta);
cur_pos += delta ;
}
void CJoint::ShortRotateToPos(i
int delta;
delta = next_pos - cur_pos ;
if( delta != 0)
rotate(motor,delta);
cur_pos += delta ;
}
void CJoint::ShortRotateDelta(i
if( delta != 0)
rotate(motor,delta);
cur_pos += delta ;
}
int CJoint::GetDistance(){
return distance(motor);
}
int CJoint::Stopped(){
return (GetDistance()==0);
}
void CJoint::Home(){
home(motor);
}
void CJoint::FastHome(){
RotateTo(home_pos);
}
//************************
#define STRATE_MAX 1024
#define STEP_DISTANCE 1
class CStrate{
public:
CStrate();
void XYZ2Angle();
int OverDistance();
void GetInterval(CStrate *pi);
void Print();
CStrate *next ;
int d;
int e;
int f;
double x ;
double y ;
double z ;
};
CStrate::CStrate(){
}
void CStrate::XYZ2Angle(){
double angle[3];
_angle2(x,y,z,angle);
d = (int)(angle[MOTOR_D]/STEP_
e = (int)(angle[MOTOR_E]/STEP_
f = (int)(angle[MOTOR_F]/STEP_
}
int CStrate::OverDistance(){
if( abs(d - next->d) > STEP_DISTANCE ||
abs(e - next->e) > STEP_DISTANCE ||
abs(f - next->f) > STEP_DISTANCE ){
return 1;
}
return 0;
}
void CStrate::GetInterval(CStra
pi->x = ( x + next->x )/2.0 ;
pi->y = ( y + next->y )/2.0 ;
pi->z = ( z + next->z )/2.0 ;
pi->XYZ2Angle();
}
void CStrate::Print(){
printf("(%6.1lf,%6.1lf,%6.
printf("(%6.1lf,%6.1lf,%6.
}
//************************
class CRobot{
public:
CRobot();
~CRobot();
void MoveTo(CPoint3D p);
void Move3To(CPoint3D p);
void StrateTo(CPoint3D p);
void WaitDEF();
void HomeAll();
CJoint ja;
CJoint jb;
CJoint jc;
CJoint jd;
CJoint je;
CJoint jf;
protected:
void StrateRoute(CPoint3D p);
int StrateRouteCore(CStrate *cur);
CPoint3D pos ;
CStrate *strate;
int strate_count ;
};
CRobot::CRobot(){
double home_angle[3];
strate = new CStrate[STRATE_MAX];
pos.x = XHOME ;
pos.y = YHOME ;
pos.z = ZHOME ;
_angle2( pos.x, pos.y, pos.z, home_angle );
ja.SetParam('A', 1.0,0);
jb.SetParam('B',STEP_B,0);
jc.SetParam('C',STEP_C,0);
jd.SetParam('D',STEP_D,(in
je.SetParam('E',STEP_E,(in
jf.SetParam('F',STEP_F,(in
}
CRobot::~CRobot(){
delete strate ;
}
void CRobot::MoveTo(CPoint3D p){
double angle[3];
_angle2(p.x,p.y,p.z,angle)
jd.RotateTo(angle[MOTOR_D]
je.RotateTo(angle[MOTOR_E]
jf.RotateTo(angle[MOTOR_F]
pos=p;
}
void CRobot::StrateTo(CPoint3D p){
StrateRoute(p);
CStrate *ps ;
CStrate *ppre;
CPoint3D mt;
int i=0 ;
ppre=ps=strate;
while(ps != NULL){
/*
printf("[%3d](%6.1lf,%6.1l
i++,
ps->x,ps->y,ps->z,
ps->d,ps->e,ps->f);*/
jd.ShortRotateToPos(ps->d)
//if(ppre->d!=ps->d)
// while(!jd.Stopped());
je.ShortRotateToPos(ps->e)
//if(ppre->e!=ps->e)
// while(!je.Stopped());
jf.ShortRotateToPos(ps->f)
//if(ppre->e!=ps->e)
// while(!jf.Stopped());
/**//*
jd.RotateToPos(ps->d);
je.RotateToPos(ps->e);
jf.RotateToPos(ps->f);/**/
ppre = ps ;
ps = ps->next ;
}
pos = p ;
}
void CRobot::StrateRoute(CPoint
strate[0].x = pos.x ;
strate[0].y = pos.y ;
strate[0].z = pos.z ;
strate[0].next = &strate[1];
strate[0].XYZ2Angle();
strate[1].x = p.x ;
strate[1].y = p.y ;
strate[1].z = p.z ;
strate[1].next = NULL ;
strate[1].XYZ2Angle();
strate_count = 2 ;
StrateRouteCore(strate);
}
int CRobot::StrateRouteCore(CS
//printf("[%d]",strate_cou
//cur->Print();
CStrate *inter;
if( strate_count >= STRATE_MAX ){
printf("Memory Error(Strate)\n");
getchar();
return 0;
}
if( cur->OverDistance() ){
inter = &strate[strate_count] ;
strate_count ++ ;
cur->GetInterval(inter);
inter->next = cur->next ;
cur->next = inter ;
StrateRouteCore(cur );
StrateRouteCore(inter);
}
return 1 ;
}
void CRobot::WaitDEF(){
while( !jd.Stopped() || !je.Stopped() || !jf.Stopped() ){
}
}
ASKER
thx !
actually what I need is just the function StrateTo() withought needing to all CStrate nor CJoint,
i tried this code , but the thing is that i got errors showing : subscript requires array or pointers (strate[].x) and i don t know how to define strate in the StrateTo() function without calling CStrate.
void StrateTo(int x1, int y1, int z1, int x2, int y2, int z2 ){
double a[3];
int e, d, f;
int strate_count;
angle(x1,y1,z1,x2,y2,z2,a) ;
d = (int)(a[MOTOR_D]/STEP_D);
e = (int)(a[MOTOR_E]/STEP_E);
f = (int)(a[MOTOR_F]/STEP_F);
StrateRoute(x1,y1,z1,x2,y2 ,z2);
while(distance('D')>0 && distance('E')>0 && distance('F')>0){
rotate_long('D',d);
rotate_long('E',e);
rotate_long('F',f);
}
}
void StrateRoute(int x1, int y1, int z1, int x2, int y2, int z2){
strate[0].x = x1 ;
strate[0].y = y1 ;
strate[0].z = z1 ;
strate[0].next = &strate[1];
strate[0].Angle(x1,y1,z1,x 2,y2,z2);
strate[1].x = x2 ;
strate[1].y = y2 ;
strate[1].z = z2 ;
strate[1].next = NULL ;
strate[1].Angle(x1,y1,z1,x 2,y2,z2);
strate_count = 2 ;
if( strate_count >= STRATE_MAX ){
printf("No No, Go Back Stunny!!\n");
getchar();
return 0;
}
}
void Angle(int x1, int y1, int z1, int x2, int y2, int z2 ){
double a[3];
int e, d, f;
angle(x1,y1,z1,x2,y2,z2,a) ;
d = (int)(a[MOTOR_D]/STEP_D);
e = (int)(a[MOTOR_E]/STEP_E);
f = (int)(a[MOTOR_F]/STEP_F);
}
actually what I need is just the function StrateTo() withought needing to all CStrate nor CJoint,
i tried this code , but the thing is that i got errors showing : subscript requires array or pointers (strate[].x) and i don t know how to define strate in the StrateTo() function without calling CStrate.
void StrateTo(int x1, int y1, int z1, int x2, int y2, int z2 ){
double a[3];
int e, d, f;
int strate_count;
angle(x1,y1,z1,x2,y2,z2,a)
d = (int)(a[MOTOR_D]/STEP_D);
e = (int)(a[MOTOR_E]/STEP_E);
f = (int)(a[MOTOR_F]/STEP_F);
StrateRoute(x1,y1,z1,x2,y2
while(distance('D')>0 && distance('E')>0 && distance('F')>0){
rotate_long('D',d);
rotate_long('E',e);
rotate_long('F',f);
}
}
void StrateRoute(int x1, int y1, int z1, int x2, int y2, int z2){
strate[0].x = x1 ;
strate[0].y = y1 ;
strate[0].z = z1 ;
strate[0].next = &strate[1];
strate[0].Angle(x1,y1,z1,x
strate[1].x = x2 ;
strate[1].y = y2 ;
strate[1].z = z2 ;
strate[1].next = NULL ;
strate[1].Angle(x1,y1,z1,x
strate_count = 2 ;
if( strate_count >= STRATE_MAX ){
printf("No No, Go Back Stunny!!\n");
getchar();
return 0;
}
}
void Angle(int x1, int y1, int z1, int x2, int y2, int z2 ){
double a[3];
int e, d, f;
angle(x1,y1,z1,x2,y2,z2,a)
d = (int)(a[MOTOR_D]/STEP_D);
e = (int)(a[MOTOR_E]/STEP_E);
f = (int)(a[MOTOR_F]/STEP_F);
}
To use 'strate' as you have, it must be defined as an array of structures. Similar to this:
typedef struct
{
int x;
int y;
/* etc */
} strate_t;
strate_t strate[SomeNumber];
Then the syntax:
strate[0].x = x1;
is valid.
How is 'strate' defined?
Kent
ASKER
it s defined in Class Robot, as CStrate *strate;
class CRobot{
public:
CRobot();
~CRobot();
void MoveTo(CPoint3D p);
void Move3To(CPoint3D p);
void StrateTo(CPoint3D p);
void WaitDEF();
void HomeAll();
CJoint ja;
CJoint jb;
CJoint jc;
CJoint jd;
CJoint je;
CJoint jf;
protected:
void StrateRoute(CPoint3D p);
int StrateRouteCore(CStrate *cur);
CPoint3D pos ;
CStrate *strate;
int strate_count ;
};
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
I'll convert RotateToPos() and show you how it's done. You can convert any others that you need.
Kent
void StrateTo(int x1, int y1, int z1, int x2, int y2, int z2 ){
StrateRoute(p);
CStrate *ps ;
CStrate *ppre;
CPoint3D mt;
int i=0 ;
ppre=ps=strate;
while(ps != NULL){
if(ppre->d!=ps->d)
while(distance('D')>0);
if(ppre->e!=ps->e)
while(distance('E')>0);
if(ppre->e!=ps->e)
while(distance('F')>0);
RotateToPos(jd, ps->d);
RotateToPos(je, ps->e);
RotateToPos(jf, ps->f);
ppre = ps ;
ps = ps->next ;
}
pos = p ;
}
RotateToPos(CJoint * item, int next_pos){
int delta;
delta = next_pos - item->cur_pos ;
if( delta != 0)
rotate_long( motor, delta );
item->cur_pos += delta ;
}