Exemple #1
0
void test_trig()
{
    double x;
    double y;

    RPN::Context cxt;
    cxt.insert("x", new RPN::VariableNode(&x));
    cxt.insert("y", new RPN::VariableNode(&y));

    RPN::Expression xsin("sin x", cxt);
    RPN::Expression xcos("cos x", cxt);
    RPN::Expression xtan("tan x", cxt);

    RPN::Expression xsec("sec x", cxt);
    RPN::Expression xcsc("csc x", cxt);
    RPN::Expression xcot("cot x", cxt);

    RPN::Expression xasin("asin x", cxt);
    RPN::Expression xacos("acos x", cxt);
    RPN::Expression xatan("atan x", cxt);

    RPN::Expression xasec("asec x", cxt);
    RPN::Expression xacsc("acsc x", cxt);
    RPN::Expression xacot("acot x", cxt);

    RPN::Expression xatan2("atan2(x, y)", cxt);
    RPN::Expression xacot2("acot2(x, y)", cxt);

    for(x = -RPN::Constants::PI; x < RPN::Constants::PI; x += 0.097)
    {
        insist_equal(xsin.evaluate(), sin(x));
        insist_equal(xcos.evaluate(), cos(x));
        insist_equal(xtan.evaluate(), tan(x));

        insist_equal(xsec.evaluate(), 1.0/cos(x));
        insist_equal(xcsc.evaluate(), 1.0/sin(x));
        insist_equal(xcot.evaluate(), 1.0/tan(x));
    }

    for(x = -1; x < 1; x += 0.043)
    {
        insist_equal(xasin.evaluate(), asin(x));
        insist_equal(xacos.evaluate(), acos(x));
        insist_equal(xatan.evaluate(), atan(x));

        insist_equal(xasec.evaluate(), acos(1.0/x));
        insist_equal(xacsc.evaluate(), asin(1.0/x));
        insist_equal(xacot.evaluate(), atan(1.0/x));
    }

    for(x = -1; x < 1; x+= 0.069)
    {
        for(y = -1; y < 1; y += 0.73)
        {
            insist_equal(xatan2.evaluate(), atan2(x, y));
            insist_equal(xacot2.evaluate(), atan2(y, x));
        }
    }
}
Exemple #2
0
/*------------------------------------------------------------------------
*
* PROTOTYPE  :  int V3XVector_InPoly(V3XVECTOR * isect, int numVerts, V3XVECTOR *vertex, V3XVECTOR *normal)
*
* Description :
*
*/
int V3XVector_InPoly(V3XVECTOR * isect, int numVerts, V3XVECTOR *vertex, V3XVECTOR *normal)
{
    V3XVECTOR mini, maxi;
    V3XVECTOR *st, *fin;
    V3XSCALAR sum = CST_ZERO;
    #ifdef SUM_ANGLE
    V3XSCALAR sumA = CST_ZERO;
    #endif
    int i;
    // phase 1 : bounding box de la face
    V3XBBox_Compute(&mini, &maxi, numVerts, vertex);
    // phase 2 : Si il est pas dans la bounding box, laisse tomber.
    //           (ca evite de faire des normalisation plus tard.)
    if (!V3XBBox_Inside(isect, &mini, &maxi))
    {
        return 0;
    }
    /* phase 3 : determine si le point dans le polygone
    */
    {
        st = vertex + numVerts - 1;
        fin = vertex + 0;
        for (i=0;i<numVerts;i++)
        {
            V3XVECTOR a, b;
            V3XSCALAR  c;
            V3XVector_Dif(&a, st, isect); c = V3XVector_Normalize(&a, &a); if (c<CST_EPSILON) return 1;
            V3XVector_Dif(&b, fin, isect); c = V3XVector_Normalize(&b, &b); if (c<CST_EPSILON) return 1;
            c = V3XVector_DotProduct(&a, &b);
            sum += c;
#ifdef SUM_ANGLE
            c = xacos(c); // Ca me fait chier ca.
            sumA +=c;
#endif
            st = fin;
            fin++;
        }
        /*
        if ((numVerts==3)&&(sum <-.9f*CST_ONE)) return 1;
        else
        */
        if (numVerts>=3)
        {
            if (sum<CST_ZERO) sum=-sum;
            if (sumA>350.f*M_PI180) return 1; // 360ø pour un n-gones … + de 3 cot‚s.
        }
    }
    UNUSED(normal);
    return 0;
}
Exemple #3
0
int
main (void)
{
  struct xpr z, f, c;
  int k;

  printf ("     Test of Inverse Trig Functions\n");
  printf ("\n Atan:\n");
  for (k = 0; k < 3; ++k)
    {
      switch (k)
	{
	case 0:
	  z = dbltox (.5);
	  break;
	case 1:
	  z = dbltox (1.);
	  break;
	case 2:
	  z = dbltox (-2.);
	  break;
	}

      /* compute extended precision arctangent and tangent */
      f = xatan (z);
      c = xtan (f);

      printf (" %8.4f   ", xtodbl (z));
      xprxpr (f, decd);
      printf ("\n check tan= ");
      xprxpr (c, decd);
      putchar ('\n');
    }
  printf ("\n Asin:\n");
  for (k = 0; k < 3; ++k)
    {
      switch (k)
	{
	case 0:
	  z = dbltox (.5);
	  break;
	case 1:
	  z = dbltox (.75);
	  break;
	case 2:
	  z = dbltox (.25);
	  break;
	}

      /* compute extended precision arcsin and sine */
      f = xasin (z);
      c = xsin (f);

      printf (" %8.4f   ", xtodbl (z));
      xprxpr (f, decd);
      printf ("\n check sin= ");
      xprxpr (c, decd);
      putchar ('\n');
    }
  printf ("\n Acos:\n");
  for (k = 0; k < 3; ++k)
    {
      switch (k)
	{
	case 0:
	  z = dbltox (.5);
	  break;
	case 1:
	  z = dbltox (.75);
	  break;
	case 2:
	  z = dbltox (.25);
	  break;
	}

      /* compute extended precision arccos and cosine */
      f = xacos (z);
      c = xcos (f);
      printf (" %8.4f   ", xtodbl (z));
      xprxpr (f, decd);
      printf ("\n check cos= ");
      xprxpr (c, decd);
      putchar ('\n');
    }
  return 0;
}