Пример #1
0
/****************  C | Cu Cu | C  **************/
static double c_cucu_c(double x , double y , double phi , double radius , double *t , double *u , double *v)
{
  double a , b , u1 , theta , alpha , long_rs , va;
  double toto;

  a = x + radius*sin(phi);
  b = y - radius*(cos(phi) + 1.0);
  if (FEQ(a, 0.,EPS4)&&FEQ(b , 0.,EPS4)) return(infini);
  u1 = sqrt(a*a + b*b);
  if (u1 > 6.0 * radius)  return(infini);
  else{
    theta = atan2(b , a);
    va = 1.25 -  (u1*u1) / (16.0 * radius * radius);
    if ((va<0.)||(va>1.)) return(infini);
    else{
      *u = acos(va);
      toto = sin(*u);
      if (FEQ(toto ,0.0 ,EPS3)) toto = 0.;
      alpha = asin(radius * toto * 2.0/u1);
      *t = mod2pi(M_PI_2 + theta + alpha);
      *v = mod2pi(*t - phi);
      long_rs = radius*(2.0 *(*u) + *t + *v);
      return(long_rs);
    }
  }
}
Пример #2
0
/****************  C C | C  ****************/
static double cc_c(double x , double y , double phi , double radius , double *t , double *u , double *v)
{
  double a , b , u1 , theta , alpha , long_rs , va;
  static double toto;

  a = x - radius*sin(phi);
  b = y + radius*(cos(phi) -1.0);
  if (FEQ(a, 0.,EPS4)&&FEQ(b , 0.,EPS4)) return(infini);
  u1 = sqrt(a*a + b*b);
  va = 4.0 * radius;
  if (u1 > va) return(infini);
  else{
    theta = atan2(b , a);
    *u = acos(1.0 -  (2.0 * u1 * u1)/(va*va));
    toto = sin(*u);
    if (FEQ(toto ,0.0 ,EPS3)) toto = 0.0;
    /*BMIC*/
    if (FEQ(toto ,0.0 ,EPS3) &&FEQ(u1 ,0.0 ,EPS3)) return(infini);
    alpha = asin((2.0 * radius *toto)/(u1));
    /*EMIC*/
    *t = mod2pi(M_PI_2 + theta - alpha);
    *v = mod2pi(*t - *u - phi);
    long_rs = radius*(*t + *u + *v);
    return(long_rs);
  }
}
Пример #3
0
           /*** C Cu | Cu C  ***/
static double ccu_cuc(double x , double y , double phi , double radius , double *t , double *u ,double* v)
{
  double a , b , u1 , theta , alpha , long_rs , va;
  
  a = x + radius*sin(phi);
  b = y - radius*(cos(phi) + 1.0);
  if (FEQ(a, 0.,EPS4)&&FEQ(b , 0.,EPS4)) return(infini);
  u1 = sqrt(a*a + b*b);
  va = 4.0 * radius;
  if (u1 > va) return(infini);
  else{
    theta = atan2(b , a);
    if (u1 > (2.0 *radius)) {
      alpha = acos(u1/(4.0 * radius) - 0.5);
      *t = mod2pi(M_PI_2 + theta - alpha);
      *u = mod2pi(M_PI - alpha);
      *v = mod2pi(phi - *t + 2.0 * (*u));
    }
    else{
      alpha = acos(0.5 + u1/(4.0 * radius)); 
      *t = mod2pi(M_PI_2 + theta + alpha);
      *u = mod2pi(alpha);
      *v = mod2pi(phi - *t + 2.0 * (*u));
    }
    long_rs = radius * (2.0 *(*u) + *t + *v);
    return(long_rs);
  }
}
Пример #4
0
int
dev_view(			/* assign new driver view */
	VIEW	*nv
)
{
	if (nv->type == VT_PAR ||		/* check view legality */
			nv->horiz > 160. || nv->vert > 160.) {
		error(COMMAND, "illegal view type/angle");
		nv->type = odev.v.type;
		nv->horiz = odev.v.horiz;
		nv->vert = odev.v.vert;
		return(0);
	}
	if (nv->vfore > FTINY) {
		error(COMMAND, "cannot handle fore clipping");
		nv->vfore = 0.;
		return(0);
	}
	if (nv != &odev.v) {
		if (!FEQ(nv->horiz,odev.v.horiz) ||	/* resize window? */
				!FEQ(nv->vert,odev.v.vert)) {
			int	dw = DisplayWidth(ourdisplay,ourscreen);
			int	dh = DisplayHeight(ourdisplay,ourscreen);

			dw -= 25;	/* for window frame */
			dh -= 50;
			odev.hres = 2.*VIEWDIST/pwidth *
					tan(PI/180./2.*nv->horiz);
			odev.vres = 2.*VIEWDIST/pheight *
					tan(PI/180./2.*nv->vert);
			if (odev.hres > dw) {
				odev.vres = dw * odev.vres / odev.hres;
				odev.hres = dw;
			}
			if (odev.vres > dh) {
				odev.hres = dh * odev.hres / odev.vres;
				odev.vres = dh;
			}
			XResizeWindow(ourdisplay, gwind, odev.hres, odev.vres);
			dev_input();	/* get resize event */
		}
		odev.v = *nv;
	}
	if (nxtzmax > FTINY) {
		curzmax = nxtzmax;
		nxtzmax = 0.;
	}
	glClear(GL_DEPTH_BUFFER_BIT);
	qtReplant();
	return(1);
}
Пример #5
0
bool MxQuadric3::optimize(Vec3& v, const Vec3& v1,
			  const Vec3& v2, const Vec3& v3) const
{
    Vec3 d13 = v1 - v3;
    Vec3 d23 = v2 - v3;
    Mat3 A = tensor();
    Vec3 B = vector();

    Vec3 Ad13 = A*d13;
    Vec3 Ad23 = A*d23;
    Vec3 Av3  = A*v3;

    double d13_d23 = (d13*Ad23) + (d23*Ad13);
    double v3_d13  = (d13*Av3) + (v3*Ad13);
    double v3_d23  = (d23*Av3) + (v3*Ad23);

    double d23Ad23 = d23*Ad23;
    double d13Ad13 = d13*Ad13;

    double denom = d13Ad13*d23Ad23 - 2*d13_d23;
    if( FEQ(denom, 0.0, 1e-12) )
	return false;

    double a = ( d23Ad23*(2*(B*d13) + v3_d13) -
		  d13_d23*(2*(B*d23) + v3_d23) ) / -denom;

    double b = ( d13Ad13*(2*(B*d23) + v3_d23) -
		  d13_d23*(2*(B*d13) + v3_d13) ) / -denom;

    if( a<0.0 ) a=0.0; else if( a>1.0 ) a=1.0;
    if( b<0.0 ) b=0.0; else if( b>1.0 ) b=1.0;

    v = a*d13 + b*d23 + v3;
    return true;
}
Пример #6
0
	bool Matrix::operator==(const Matrix &m)const{
		// m1 == m2
		if(this->m_unit != m.m_unit || this->m_mirrored != m.m_mirrored) return false;
		for(int i = 0; i < 16; i++)
			if(FEQ(this->e[i], m.e[i], TIGHT_TOLERANCE) == false) return false;
		return true;
	}
Пример #7
0
bool quadrix_find_best_fit(const Mat4& Q, Vec3& candidate)
{
    Mat4 K = Q;
    K(3,0) = K(3,1) = K(3,2) = 0.0;  K(3,3) = 1;


    Mat4 M;
    real det = K.inverse(M);
    if( FEQ(det, 0.0, 1e-12) )
	return false;


#ifdef SAFETY
    //
    // The homogeneous division SHOULDN'T be necessary.
    // But, when we're being SAFE, we do it anyway just in case.
    //
    candidate[X] = M(0,3)/M(3,3);
    candidate[Y] = M(1,3)/M(3,3);
    candidate[Z] = M(2,3)/M(3,3);
#else
    candidate[X] = M(0,3);
    candidate[Y] = M(1,3);
    candidate[Z] = M(2,3);
#endif

    return true;
}
Пример #8
0
      /****  C | C C  *****/
static double c_cc(double x , double y , double phi , double radius , double *t , double *u , double *v)
{
  double a , b , u1 , theta , alpha , long_rs , va;
  
  a = x - radius*sin(phi);
  b = y + radius*(cos(phi) - 1.0);
  if (FEQ(a, 0.,EPS4)&&FEQ(b , 0.,EPS4)) return(infini);
  u1 = sqrt(a*a + b*b);
  if (u1 > 4*radius) return(infini);
  else{
    theta = atan2(b , a);
    alpha = acos(u1/(4.0 * radius));
    va = M_PI_2 + alpha;
    *t = mod2pi(va + theta);
    *u = mod2pi(2.0 * (M_PI - va));
    *v = mod2pi(*t + *u - phi);
    long_rs = radius*(*t + *u + *v);
    return(long_rs);
  }
}
Пример #9
0
static KF1(jtcvt2bit){I c,i,m,q,r,r1,wr,*ws,*wv;UC k,*zv=(UC*)yv;
 wv=AV(w); wr=AR(w); ws=AS(w); 
 c=wr?ws[wr-1]:1; m=c?AN(w)/c:0; q=c/BB; r=c%BB; r1=c%BW?(BW-c%BW)/BB:0;
 switch(AT(w)){
  default:  R 0;
  case B01: TOBIT(B, 1         ); break;
  case INT: TOBIT(I, 1==x      ); break;
  case FL:  TOBIT(D, FEQ(1.0,x)); break;
 }
 R 1;
}
Пример #10
0
bool MxQuadric3::optimize(Vec3& v) const
{
    Mat3 Ainv;
    double det = invert(Ainv, tensor());
    if( FEQ(det, 0.0, 1e-12) )
	return false;

    v = -(Ainv*vector());

    return true;
}
Пример #11
0
char *
viewopt(				/* translate to minimal view string */
VIEW  *vp
)
{
	static char  vwstr[128];
	char  *cp = vwstr;

	*cp = '\0';
	if (vp->type != stdview.type) {
		sprintf(cp, " -vt%c", vp->type);
		cp += strlen(cp);
	}
	if (!VEQ(vp->vp,stdview.vp)) {
		sprintf(cp, " -vp %.6g %.6g %.6g",
				vp->vp[0], vp->vp[1], vp->vp[2]);
		cp += strlen(cp);
	}
	if (!FEQ(vp->vdist,stdview.vdist) || !VEQ(vp->vdir,stdview.vdir)) {
		sprintf(cp, " -vd %.6g %.6g %.6g",
				vp->vdir[0]*vp->vdist,
				vp->vdir[1]*vp->vdist,
				vp->vdir[2]*vp->vdist);
		cp += strlen(cp);
	}
	if (!VEQ(vp->vup,stdview.vup)) {
		sprintf(cp, " -vu %.6g %.6g %.6g",
				vp->vup[0], vp->vup[1], vp->vup[2]);
		cp += strlen(cp);
	}
	if (!FEQ(vp->horiz,stdview.horiz)) {
		sprintf(cp, " -vh %.6g", vp->horiz);
		cp += strlen(cp);
	}
	if (!FEQ(vp->vert,stdview.vert)) {
		sprintf(cp, " -vv %.6g", vp->vert);
		cp += strlen(cp);
	}
	if (!FEQ(vp->vfore,stdview.vfore)) {
		sprintf(cp, " -vo %.6g", vp->vfore);
		cp += strlen(cp);
	}
	if (!FEQ(vp->vaft,stdview.vaft)) {
		sprintf(cp, " -va %.6g", vp->vaft);
		cp += strlen(cp);
	}
	if (!FEQ(vp->hoff,stdview.hoff)) {
		sprintf(cp, " -vs %.6g", vp->hoff);
		cp += strlen(cp);
	}
	if (!FEQ(vp->voff,stdview.voff)) {
		sprintf(cp, " -vl %.6g", vp->voff);
		cp += strlen(cp);
	}
	return(vwstr);
}
Пример #12
0
int
addrot(		/* compute rotation (x,y,z) => (xp,yp,zp) */
	register char	*xf,
	FVECT xp,
	FVECT yp,
	FVECT zp
)
{
	int	n;
	double	theta;

	if (yp[2]*yp[2] + zp[2]*zp[2] < 2.*FTINY*FTINY) {
		/* Special case for X' along Z-axis */
		theta = -atan2(yp[0], yp[1]);
		sprintf(xf, " -ry %f -rz %f",
				xp[2] < 0.0 ? 90.0 : -90.0,
				theta*(180./PI));
		return(4);
	}
	n = 0;
	theta = atan2(yp[2], zp[2]);
	if (!FEQ(theta,0.0)) {
		sprintf(xf, " -rx %f", theta*(180./PI));
		while (*xf) ++xf;
		n += 2;
	}
	theta = asin(-xp[2]);
	if (!FEQ(theta,0.0)) {
		sprintf(xf, " -ry %f", theta*(180./PI));
		while (*xf) ++xf;
		n += 2;
	}
	theta = atan2(xp[1], xp[0]);
	if (!FEQ(theta,0.0)) {
		sprintf(xf, " -rz %f", theta*(180./PI));
		/* while (*xf) ++xf; */
		n += 2;
	}
	return(n);
}
Пример #13
0
bool MxQuadric::optimize(MxVector& v) const
{
    MxMatrix Ainv(A.dim());

    double det = A.invert(Ainv);
    if( FEQ(det, 0.0, 1e-12) )
	return false;

    v = (Ainv * b);
    mxv_neg(v, v.dim());

    return true;
}
Пример #14
0
bool MxQuadric3::optimize(Vec3& v, const Vec3& v1, const Vec3& v2) const
{
    Vec3 d = v1 - v2;
    Mat3 A = tensor();

    Vec3 Av2 = A*v2;
    Vec3 Ad  = A*d;

    double denom = 2.0*d*Ad;
    if( FEQ(denom, 0.0, 1e-12) )
	return false;

    double a =  ( -2*(vector()*d) - (d*Av2) - (v2*Ad) ) / ( 2*(d*Ad) );

    if( a<0.0 ) a=0.0; else if( a>1.0 ) a=1.0;

    v = a*d + v2;
    return true;
}
Пример #15
0
static double mod2pi(double a)
{
  return((double)((a=fmod(a, M_2PI))>0.0)?a:(FEQ(a,0.0,EPSILON)?0.0:(a + M_2PI)));
}
Пример #16
0
int
getparam(		/* get variable from user */
	char  *str,
	char  *dsc,
	int  typ,
	void  *p
)
{
	MyUptr  ptr = (MyUptr)p;
	int  i0;
	double  d0, d1, d2;
	char  buf[48];

	switch (typ) {
	case 'i':			/* integer */
		if (sscanf(str, "%d", &i0) != 1) {
			(*dev->comout)(dsc);
			sprintf(buf, " (%d): ", ptr->i);
			(*dev->comout)(buf);
			(*dev->comin)(buf, NULL);
			if (sscanf(buf, "%d", &i0) != 1)
				return(0);
		}
		if (ptr->i == i0)
			return(0);
		ptr->i = i0;
		break;
	case 'r':			/* real */
		if (sscanf(str, "%lf", &d0) != 1) {
			(*dev->comout)(dsc);
			sprintf(buf, " (%.6g): ", ptr->d);
			(*dev->comout)(buf);
			(*dev->comin)(buf, NULL);
			if (sscanf(buf, "%lf", &d0) != 1)
				return(0);
		}
		if (FEQ(ptr->d, d0))
			return(0);
		ptr->d = d0;
		break;
	case 'b':			/* boolean */
		if (sscanf(str, "%1s", buf) != 1) {
			(*dev->comout)(dsc);
			sprintf(buf, "? (%c): ", ptr->i ? 'y' : 'n');
			(*dev->comout)(buf);
			(*dev->comin)(buf, NULL);
			if (buf[0] == '\0')
				return(0);
		}
		if (strchr("yY+1tTnN-0fF", buf[0]) == NULL)
			return(0);
		i0 = strchr("yY+1tT", buf[0]) != NULL;
		if (ptr->i == i0)
			return(0);
		ptr->i = i0;
		break;
	case 'C':			/* color */
		if (sscanf(str, "%lf %lf %lf", &d0, &d1, &d2) != 3) {
			(*dev->comout)(dsc);
			sprintf(buf, " (%.6g %.6g %.6g): ",
					colval(ptr->C,RED),
					colval(ptr->C,GRN),
					colval(ptr->C,BLU));
			(*dev->comout)(buf);
			(*dev->comin)(buf, NULL);
			if (sscanf(buf, "%lf %lf %lf", &d0, &d1, &d2) != 3)
				return(0);
		}
		if (FEQ(colval(ptr->C,RED), d0) &&
				FEQ(colval(ptr->C,GRN), d1) &&
				FEQ(colval(ptr->C,BLU), d2))
			return(0);
		setcolor(ptr->C, d0, d1, d2);
		break;
	default:
		return(0);		/* shouldn't happen */
	}
	newparam++;
	return(1);
}
Пример #17
0
double reed_shepp(Stconfig *c1 , Stconfig *c2, double radius , int* numero , double *t_r , double *u_r , double *v_r)
{
  double x , y , phi;
  double t , u , v , t1 , u1 , v1;
  int num;
  double var , var_d, theta , alpha , dx , dy , r, longueur;
  
  /* Changement de repere,les courbes sont toujours calculees 
     de (0 0 0)--> (x , y , phi) */
  dx       = (double)(c2->x - c1->x);
  dy       = (double)(c2->y - c1->y);
  var      = (double)(c2->z -c1->z);
  r        = (double)radius;

  theta    = atan2(dy , dx);
  alpha    = theta - (double)(c1->z);
  var_d    = sqrt(dx*dx + dy*dy);
  x        = cos(alpha)*var_d;
  y        = sin(alpha)*var_d;


  t1 = u1 = v1 = 0.0;

  if (fabs(var) <= M_PI)    phi = var;
  else {
    if (c2->z >= c1->z) phi = var - M_2PI;
    else                 phi = mod2pi(var);}

  if(FEQ(r,0.0,EPS4)) {
    
    longueur = csca(x , y , phi , r , &t1 , &u1 , &v1); /* l+ s+ l+ */
    var = t1+v1; num = 9; t = t1; u = u1; v = v1;

    csca(x ,-y , -phi , r , &t1 , &u1 , &v1); /* r+ s+ r+ */
    if((t1+v1) < (t+v)){num = 10;t = t1; u = u1; v = v1;}
    csca(-x , y , -phi , r , &t1 , &u1 , &v1); /* l- s- l- */
    if((t1+v1) < (t+v)){num = 11;t = t1; u = u1; v = v1;}
    csca(-x ,-y , phi , r , &t1 , &u1 , &v1); /* r- s- r- */
    if((t1+v1) < (t+v)){num = 12;t = t1; u = u1; v = v1;}
    cscb(x , y , phi , r , &t1 , &u1 , &v1); /* l+ s+ r+ */
    if((t1+v1) < (t+v)){num = 13;t = t1; u = u1; v = v1;}
    cscb(x ,-y , -phi , r , &t1 , &u1 , &v1); /* r+ s+ l+ */
    if((t1+v1) < (t+v)){num = 14;t = t1; u = u1; v = v1;}
    cscb(-x , y , -phi , r , &t1 , &u1 , &v1); /* l- s- r- */
    if((t1+v1) < (t+v)){num = 15;t = t1; u = u1; v = v1;}
    cscb(-x ,-y , phi , r , &t1 , &u1 , &v1); /* r- s- l- */
    if((t1+v1) < (t+v)){num = 16;t = t1; u = u1; v = v1;}

    *t_r = (double)t;  *u_r = (double)u;  *v_r = (double)v;
    *numero = num;
    if(longueur == infini) PrintInfo(("infini0\n"));
    return((double)longueur);
  }
                      /****  C | C | C ***/

  longueur = c_c_c(x , y , phi , r , &t1 , &u1 , &v1); /* l+ r- l+ */
  num = 1; t = t1; u = u1; v = v1;

  var = c_c_c(-x , y , -phi , r , &t1 , &u1 , &v1); /* l- r+ l- */
  if (var < longueur){longueur = var; num = 2; t = t1; u = u1; v = v1;}

  var = c_c_c(x ,-y , -phi , r , &t1 , &u1 , &v1); /* r+ l- r+ */
  if (var < longueur){longueur = var; num = 3; t = t1; u = u1; v = v1;}

  var = c_c_c(-x ,-y , phi , r , &t1 , &u1 , &v1); /* r- l+ r- */
  if (var < longueur){longueur = var; num = 4; t = t1; u = u1; v = v1;}

                     /****  C | C C  ***/

  var = c_cc(x , y , phi , r , &t1 , &u1 , &v1); /* l+ r- l- */
  if (var < longueur){longueur = var; num = 5; t = t1; u = u1; v = v1;}

  var = c_cc(-x , y , -phi , r , &t1 , &u1 , &v1); /* l- r+ l+ */
  if (var < longueur){longueur = var; num = 6; t = t1; u = u1; v = v1;}

  var = c_cc(x ,-y , -phi , r , &t1 , &u1 , &v1); /* r+ l- r- */
  if (var < longueur){longueur = var; num = 7; t = t1; u = u1; v = v1;}

  var = c_cc(-x ,-y , phi , r , &t1 , &u1 , &v1); /* r- l+ r+ */
  if (var < longueur){longueur = var; num = 8; t = t1; u = u1; v = v1;}

                   /****  C S C ****/

  var = csca(x , y , phi , r , &t1 , &u1 , &v1); /* l+ s+ l+ */
  if (var < longueur){longueur = var; num = 9; t = t1; u = u1; v = v1;}

  var = csca(x ,-y , -phi , r , &t1 , &u1 , &v1); /* r+ s+ r+ */
  if (var < longueur){longueur = var; num = 10;t = t1; u = u1; v = v1;}

  var = csca(-x , y , -phi , r , &t1 , &u1 , &v1); /* l- s- l- */
  if (var < longueur){longueur = var; num = 11;t = t1; u = u1; v = v1;}

  var = csca(-x ,-y , phi , r , &t1 , &u1 , &v1); /* r- s- r- */
  if (var < longueur){longueur = var; num = 12;t = t1; u = u1; v = v1;}

  
  var = cscb(x , y , phi , r , &t1 , &u1 , &v1); /* l+ s+ r+ */
  if (var < longueur){longueur = var; num = 13;t = t1; u = u1; v = v1;}

  var = cscb(x ,-y , -phi , r , &t1 , &u1 , &v1); /* r+ s+ l+ */
  if (var < longueur){longueur = var; num = 14;t = t1; u = u1; v = v1;}

  var = cscb(-x , y , -phi , r , &t1 , &u1 , &v1); /* l- s- r- */
  if (var < longueur){longueur = var; num = 15;t = t1; u = u1; v = v1;}

  var = cscb(-x ,-y , phi , r , &t1 , &u1 , &v1); /* r- s- l- */
  if (var < longueur){longueur = var; num = 16;t = t1; u = u1; v = v1;}

                      /*** C Cu | Cu C ***/
  var = ccu_cuc(x , y , phi , r , &t1 , &u1 , &v1); /* l+ r+ l- r- */
  if (var < longueur){longueur = var; num = 17;t = t1; u = u1; v = v1;}

  var = ccu_cuc(x ,-y , -phi , r , &t1 , &u1 , &v1); /* r+ l+ r- l- */
  if (var < longueur){longueur = var; num = 18;t = t1; u = u1; v = v1;}

  var = ccu_cuc(-x , y , -phi , r , &t1 , &u1 , &v1); /* l- r- l+ r+ */
  if (var < longueur){longueur = var; num = 19;t = t1; u = u1; v = v1;}

  var = ccu_cuc(-x ,-y , phi , r , &t1 , &u1 , &v1); /* r- l- r+ l+ */
  if (var < longueur){longueur = var; num = 20;t = t1; u = u1; v = v1;}
  
                    /*** C | Cu Cu | C  ***/
  var = c_cucu_c(x , y , phi , r , &t1 , &u1 , &v1); /* l+ r- l- r+ */
  if (var < longueur){longueur = var;num = 21; t = t1; u = u1; v = v1;}

  var = c_cucu_c(x ,-y , -phi , r , &t1 , &u1 , &v1); /* r+ l- r- l+ */
  if (var < longueur){longueur = var; num = 22;t = t1; u = u1; v = v1;}

  var = c_cucu_c(-x , y , -phi , r , &t1 , &u1 , &v1); /* l- r+ l+ r- */
  if (var < longueur){longueur = var;num = 23; t = t1; u = u1; v = v1;}

  var = c_cucu_c(-x ,-y , phi , r , &t1 , &u1 , &v1); /* r- l+ r+ l- */
  if (var < longueur){longueur = var;num = 24; t = t1; u = u1; v = v1;}
  
                 /*** C | C2 S C  ***/
  var = c_c2sca(x , y , phi , r , &t1 , &u1 , &v1); /* l+ r- s- l- */
  if (var < longueur){longueur = var;num = 25; t = t1; u = u1; v = v1;}

  var = c_c2sca(x ,-y , -phi , r , &t1 , &u1 , &v1); /* r+ l- s- r- */
  if (var < longueur){longueur = var;num = 26; t = t1; u = u1; v = v1;}

  var = c_c2sca(-x , y , -phi , r , &t1 , &u1 , &v1); /* l- r+ s+ l+ */
  if (var < longueur){longueur = var;num = 27; t = t1; u = u1; v = v1;}

  var = c_c2sca(-x ,-y , phi , r , &t1 , &u1 , &v1); /* r- l+ s+ r+ */
  if (var < longueur){longueur = var;num = 28; t = t1; u = u1; v = v1;}

  var = c_c2scb(x , y , phi , r , &t1 , &u1 , &v1); /* l+ r- s- r- */
  if (var < longueur){longueur = var; num = 29; t = t1; u = u1; v = v1;}

  var = c_c2scb(x ,-y , -phi , r , &t1 , &u1 , &v1); /* r+ l- s- l- */
  if (var < longueur){longueur = var; num = 30; t = t1; u = u1; v = v1;}

  var = c_c2scb(-x , y , -phi , r , &t1 , &u1 , &v1); /* l- r+ s+ r+ */
  if (var < longueur){longueur = var; num = 31; t = t1; u = u1; v = v1;}

  var = c_c2scb(-x ,-y , phi , r , &t1 , &u1 , &v1); /* r- l+ s+ l+ */
  if (var < longueur){longueur = var; num = 32; t = t1; u = u1; v = v1;}

              /*** C | C2 S C2 | C  ***/

  var = c_c2sc2_c(x , y , phi , r , &t1 , &u1 , &v1); /* l+ r- s- l- r+ */
  if (var < longueur){longueur = var; num = 33; t = t1; u = u1; v = v1;}

  var = c_c2sc2_c(x ,-y , -phi , r , &t1 , &u1 , &v1); /* r+ l- s- r- l+ */
  if (var < longueur){longueur = var; num = 34; t = t1; u = u1; v = v1;}

  var = c_c2sc2_c(-x , y , -phi , r , &t1 , &u1 , &v1); /* l- r+ s+ l+ r- */
  if (var < longueur){longueur = var; num = 35; t = t1; u = u1; v = v1;}

  var = c_c2sc2_c(-x ,-y , phi , r , &t1 , &u1 , &v1); /* r- l+ s+ r+ l- */
  if (var < longueur){longueur = var; num = 36; t = t1; u = u1; v = v1;}  
  
               /***  C C | C  ****/

  var = cc_c(x , y , phi , r , &t1 , &u1 , &v1); /* l+ r+ l- */
  if (var < longueur){longueur = var; num = 37; t = t1; u = u1; v = v1;}

  var = cc_c(x ,-y , -phi , r , &t1 , &u1 , &v1); /* r+ l+ r- */
  if (var < longueur){longueur = var; num = 38; t = t1; u = u1; v = v1;}

  var = cc_c(-x , y , -phi , r , &t1 , &u1 , &v1); /* l- r- l+ */
  if (var < longueur){longueur = var; num = 39; t = t1; u = u1; v = v1;}

  var = cc_c(-x ,-y , phi , r , &t1 , &u1 , &v1); /* r- l- r+ */
  if (var < longueur){longueur = var; num = 40; t = t1; u = u1; v = v1;}

              /*** C S C2 | C  ***/

  var = csc2_ca(x , y , phi , r , &t1 , &u1 , &v1); /* l+ s+ r+ l- */
  if (var < longueur){longueur = var; num = 41; t = t1; u = u1; v = v1;}

  var = csc2_ca(x ,-y , -phi , r , &t1 , &u1 , &v1); /* r+ s+ l+ r- */
  if (var < longueur){longueur = var; num = 42; t = t1; u = u1; v = v1;}

  var = csc2_ca(-x , y , -phi , r , &t1 , &u1 , &v1); /* l- s- r- l+ */
  if (var < longueur){longueur = var; num = 43; t = t1; u = u1; v = v1;}

  var = csc2_ca(-x ,-y , phi , r , &t1 , &u1 , &v1); /* r- s- l- r+ */
  if (var < longueur){longueur = var; num = 44; t = t1; u = u1; v = v1;}

  var = csc2_cb(x , y , phi , r , &t1 , &u1 , &v1); /* l+ s+ l+ r- */
  if (var < longueur){longueur = var; num = 45; t = t1; u = u1; v = v1;}

  var = csc2_cb(x ,-y , -phi , r , &t1 , &u1 , &v1); /* r+ s+ r+ l- */
  if (var < longueur){longueur = var; num = 46; t = t1; u = u1; v = v1;}

  var = csc2_cb(-x , y , -phi , r , &t1 , &u1 , &v1); /* l- s- l- r+ */
  if (var < longueur){longueur = var; num = 47; t = t1; u = u1; v = v1;}

  var = csc2_cb(-x ,-y , phi , r , &t1 , &u1 , &v1); /* r- s- r- l+ */
  if (var < longueur){longueur = var; num = 48; t = t1; u = u1; v = v1;}

  *t_r = (double)t;  *u_r = (double)u;  *v_r = (double)v;
  *numero = num;

  return((double)longueur);
}
Пример #18
0
	 bool Vector2d::operator==(const Vector2d &v)const {
		return FEQ(dx, v.getx(), 1.0e-06) && FEQ(dy, v.gety(), 1.0e-06);
	 }
Пример #19
0
double dubins(Stconfig *c1 , Stconfig *c2, double radius , int* numero , double *t_r , double *u_r , double *v_r)
{
  double x , y , phi;
  double t , u , v , t1 , u1 , v1;
  int num;
  double var , var_d, theta , alpha , dx , dy , r, longueur;
  
  /* Changement de repere,les courbes sont toujours calculees 
     de (0 0 0)--> (x , y , phi) */
  dx       = (double)(c2->x - c1->x);
  dy       = (double)(c2->y - c1->y);
  var      = (double)(c2->z -c1->z);
  r        = (double)radius;

  theta    = atan2(dy , dx);
  alpha    = theta - (double)(c1->z);
  var_d    = sqrt(dx*dx + dy*dy);
  x        = cos(alpha)*var_d;
  y        = sin(alpha)*var_d;


  t1 = u1 = v1 = 0.0;

  if (fabs(var) <= M_PI)    phi = var;
  else {
    if (c2->z >= c1->z) phi = var - M_2PI;
    else                 phi = mod2pi(var);}

  if(FEQ(r,0.0,EPS4)) {
    
    longueur = csca(x , y , phi , r , &t1 , &u1 , &v1); /* l+ s+ l+ */
    var = t1+v1; num = 9; t = t1; u = u1; v = v1;

    csca(x ,-y , -phi , r , &t1 , &u1 , &v1); /* r+ s+ r+ */
    if((t1+v1) < (t+v)){num = 10;t = t1; u = u1; v = v1;}
    cscb(x , y , phi , r , &t1 , &u1 , &v1); /* l+ s+ r+ */
    if((t1+v1) < (t+v)){num = 13;t = t1; u = u1; v = v1;}
    cscb(x ,-y , -phi , r , &t1 , &u1 , &v1); /* r+ s+ l+ */
    if((t1+v1) < (t+v)){num = 14;t = t1; u = u1; v = v1;}

    *t_r = (double)t;  *u_r = (double)u;  *v_r = (double)v;
    *numero = num;
    if(longueur == infini) PrintInfo(("infini0\n"));
    return((double)longueur);
  }
 
                   /****  C S C ****/

  longueur = csca(x , y , phi , r , &t1 , &u1 , &v1); /* l+ s+ l+ */
  num = 9; t = t1; u = u1; v = v1;

  var = csca(x ,-y , -phi , r , &t1 , &u1 , &v1); /* r+ s+ r+ */
  if (var < longueur){longueur = var; num = 10;t = t1; u = u1; v = v1;}
  
  var = cscb(x , y , phi , r , &t1 , &u1 , &v1); /* l+ s+ r+ */
  if (var < longueur){longueur = var; num = 13;t = t1; u = u1; v = v1;}

  var = cscb(x ,-y , -phi , r , &t1 , &u1 , &v1); /* r+ s+ l+ */
  if (var < longueur){longueur = var; num = 14;t = t1; u = u1; v = v1;}


  *t_r = (double)t;  *u_r = (double)u;  *v_r = (double)v;
  *numero = num;

  return((double)longueur);
}
Пример #20
0
/*
 *	 dooper() will execute a constant operation in a node and return
 *	 the node to be the result of the operation.
 */
static EXPR *dooper P1 (EXPR *, ep)
{
    EXPRTYPE type = ep->nodetype;

    ep->nodetype = ep->v.p[0]->nodetype;
    switch (ep->v.p[0]->nodetype) {
#ifdef FLOAT_SUPPORT
#ifndef FLOAT_BOOTSTRAP
	RVAL    f;
#endif	/* FLOAT_BOOTSTRAP */

    case en_fcon:
#ifndef FLOAT_BOOTSTRAP
	FASSIGN (f, ep->v.p[0]->v.f);
	switch (type) {
	case en_uminus:
	    FASSIGN (ep->v.f, f);
	    FNEG (ep->v.f);
	    break;
	case en_test:
	    ep->v.i = FTST (f) ? (IVAL) 1 : (IVAL) 0;
	    ep->nodetype = en_icon;
	    break;
	case en_not:
	    ep->v.i = FTST (f) ? (IVAL) 0 : (IVAL) 1;
	    ep->nodetype = en_icon;
	    break;
	case en_cast:
	    if (is_real_floating_type (ep->etp)) {
		ep->v.f = f;
	    } else if (is_bool (ep->etp)) {
		ep->v.u = (UVAL) (f ? 1 : 0);
		ep->nodetype = en_icon;
	    } else {
		FTOL (ep->v.i, f);
		ep->v.i = strip_icon (ep->v.i, ep->etp);
		ep->nodetype = en_icon;
	    }
	    break;
	case en_add:
	    FADD3 (ep->v.f, f, ep->v.p[1]->v.f);
	    break;
	case en_sub:
	    FSUB3 (ep->v.f, f, ep->v.p[1]->v.f);
	    break;
	case en_mul:
	    FMUL3 (ep->v.f, f, ep->v.p[1]->v.f);
	    break;
	case en_div:
	    if (FTST (ep->v.p[1]->v.f)) {
		FDIV3 (ep->v.f, f, ep->v.p[1]->v.f);
	    } else {
		ep->nodetype = en_div;
	    }
	    break;
	case en_eq:
	    ep->v.i = (IVAL) FEQ (f, ep->v.p[1]->v.f);
	    ep->nodetype = en_icon;
	    break;
	case en_ne:
	    ep->v.i = (IVAL) FNE (f, ep->v.p[1]->v.f);
	    ep->nodetype = en_icon;
	    break;
	case en_land:
	    ep->v.i = (IVAL) (FTST (f) && FTST (ep->v.p[1]->v.f));
	    ep->nodetype = en_icon;
	    break;
	case en_lor:
	    ep->v.i = (IVAL) (FTST (f) || FTST (ep->v.p[1]->v.f));
	    ep->nodetype = en_icon;
	    break;
	case en_lt:
	    ep->v.i = (IVAL) FLT (f, ep->v.p[1]->v.f);
	    ep->nodetype = en_icon;
	    break;
	case en_le:
	    ep->v.i = (IVAL) FLE (f, ep->v.p[1]->v.f);
	    ep->nodetype = en_icon;
	    break;
	case en_gt:
	    ep->v.i = (IVAL) FGT (f, ep->v.p[1]->v.f);
	    ep->nodetype = en_icon;
	    break;
	case en_ge:
	    ep->v.i = (IVAL) FGE (f, ep->v.p[1]->v.f);
	    ep->nodetype = en_icon;
	    break;
	default:
	    CANNOT_REACH_HERE ();
	    break;
	}
	break;
	
#endif /* FLOAT_BOOTSTRAP */
#endif /* FLOAT_SUPPORT */
    case en_icon:
	if (is_unsigned_type (ep->v.p[0]->etp)) {
	    UVAL    u = ep->v.p[0]->v.u;

	    switch (type) {
	    case en_uminus:
		/*
		 *       unary minus on an unsigned is normally a mistake so we must
		 *       fool the compiler into not giving a warning.
		 */
		ep->v.u = (UVAL) (-(IVAL) u);
		break;
	    case en_test:
		ep->v.u = (u ? (UVAL) 1 : (UVAL) 0);
		break;
	    case en_not:
		ep->v.u = (u ? (UVAL) 0 : (UVAL) 1);
		break;
	    case en_compl:
		ep->v.u = (UVAL) strip_icon ((IVAL) ~u, ep->etp);
		break;
	    case en_cast:
		if (is_bool (ep->etp)) {
		    ep->v.u = (UVAL) (u ? 1 : 0);
#ifdef FLOAT_SUPPORT
		} else if (is_real_floating_type (ep->etp)) {
		    ep->nodetype = en_fcon;
		    UTOF (ep->v.f, u);
		    break;
#endif /* FLOAT_SUPPORT */
		} else {
		    ep->v.u = (UVAL) strip_icon ((IVAL) u, ep->etp);
		}
		break;
	    case en_add:
		ep->v.u = u + ep->v.p[1]->v.u;
		break;
	    case en_sub:
		ep->v.u = u - ep->v.p[1]->v.u;
		break;
	    case en_mul:
		ep->v.u = u * ep->v.p[1]->v.u;
		break;
	    case en_div:
		if (ep->v.p[1]->v.u == (UVAL) 0) {
		    ep->nodetype = en_div;
		} else {
		    ep->v.u = u / ep->v.p[1]->v.u;
		}
		break;
	    case en_mod:
		if (ep->v.p[1]->v.u == (UVAL) 0) {
		    ep->nodetype = en_mod;
		} else {
		    ep->v.u = u % ep->v.p[1]->v.u;
		}
		break;
	    case en_and:
		ep->v.u = u & ep->v.p[1]->v.u;
		break;
	    case en_or:
		ep->v.u = u | ep->v.p[1]->v.u;
		break;
	    case en_xor:
		ep->v.u = u ^ ep->v.p[1]->v.u;
		break;
	    case en_eq:
		ep->v.u = (UVAL) (u == ep->v.p[1]->v.u);
		break;
	    case en_ne:
		ep->v.u = (UVAL) (u != ep->v.p[1]->v.u);
		break;
	    case en_land:
		ep->v.u = (UVAL) (u && ep->v.p[1]->v.u);
		break;
	    case en_lor:
		ep->v.u = (UVAL) (u || ep->v.p[1]->v.u);
		break;
	    case en_lt:
		ep->v.u = (UVAL) (u < ep->v.p[1]->v.u);
		break;
	    case en_le:
		ep->v.u = (UVAL) (u <= ep->v.p[1]->v.u);
		break;
	    case en_gt:
		ep->v.u = (UVAL) (u > ep->v.p[1]->v.u);
		break;
	    case en_ge:
		ep->v.u = (UVAL) (u >= ep->v.p[1]->v.u);
		break;
	    case en_lsh:
		ep->v.u = u << ep->v.p[1]->v.u;
		break;
	    case en_rsh:
		ep->v.u = u >> ep->v.p[1]->v.u;
		break;
	    default:
		CANNOT_REACH_HERE ();
		break;
	    }
	} else {