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)); } } }
/*------------------------------------------------------------------------ * * 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; }
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; }