bool CMathGeom3D:: FourPointSphere(double x1, double y1, double z1, double x2, double y2, double z2, double x3, double y3, double z3, double x4, double y4, double z4, double *xc, double *yc, double *zc, double *r) { double d1 = x1*x1 + y1*y1 + z1*z1; double d2 = x2*x2 + y2*y2 + z2*z2; double d3 = x3*x3 + y3*y3 + z3*z3; double d4 = x4*x4 + y4*y4 + z4*z4; CMatrix3DH m11(x1, y1, z1, 1.0, x2, y2, z2, 1.0, x3, y3, z3, 1.0, x4, y4, z4, 1.0); double dm11 = m11.determinant(); if (fabs(dm11) < CMathGen::EPSILON_E6) return false; double idm11 = 1.0/dm11; CMatrix3DH m12(d1, y1, z1, 1.0, d2, y2, z2, 1.0, d3, y3, z3, 1.0, d4, y4, z4, 1.0); double dm12 = m12.determinant(); CMatrix3DH m13(x1, d1, z1, 1.0, x2, d2, z2, 1.0, x3, d3, z3, 1.0, x4, d4, z4, 1.0); double dm13 = m13.determinant(); CMatrix3DH m14(x1, y1, d1, 1.0, x2, y2, d2, 1.0, x3, y3, d3, 1.0, x4, y4, d4, 1.0); double dm14 = m14.determinant(); CMatrix3DH m15(d1, x1, y1, z1, d2, x2, y2, z2, d3, x3, y3, z3, d4, x4, y4, z4); double dm15 = m15.determinant(); *xc = 0.5*dm12*idm11; *yc = 0.5*dm13*idm11; *zc = 0.5*dm14*idm11; *r = sqrt((*xc)*(*xc) + (*yc)*(*yc) + (*zc)*(*zc) - dm15*idm11); return true; }
void funclike(void) { #define stringify(x) #x expect_string("5", stringify(5)); expect_string("x", stringify(x)); expect_string("x y", stringify(x y)); expect_string("x y", stringify( x y )); expect_string("x + y", stringify( x + y )); expect_string("x + y", stringify(/**/x/**/+/**//**/ /**/y/**/)); expect_string("x+y", stringify( x+y )); expect_string("'a'", stringify('a')); expect_string("'\\''", stringify('\'')); expect_string("\"abc\"", stringify("abc")); expect_string("ZERO", stringify(ZERO)); #define m1(x) x expect(5, m1(5)); expect(7, m1((5 + 2))); expect(8, m1(plus(5, 3))); expect(10, m1() 10); expect(14, m1(2 + 2 +) 10); #define m2(x) x + x expect(10, m2(5)); #define m3(x, y) x * y expect(50, m3(5, 10)); expect(11, m3(2 + 2, 3 + 3)); #define m4(x, y) x + y + TWO expect(17, m4(5, 10)); #define m6(x, ...) x + __VA_ARGS__ expect(20, m6(2, 18)); expect(25, plus(m6(2, 18, 5))); #define plus(x, y) x * y + plus(x, y) expect(11, plus(2, 3)); #undef plus #define plus(x, y) minus(x, y) #define minus(x, y) plus(x, y) expect(31, plus(30, 1)); expect(29, minus(30, 1)); // This is not a function-like macro. #define m7 (0) + 1 expect(1, m7); #define m8(x, y) x ## y expect(2, m8(TW, O)); expect(0, m8(ZERO,)); #define m9(x, y, z) x y + z expect(8, m9(1,, 7)); #define m10(x) x ## x expect_string("a", "a" m10()); #define hash_hash # ## # #define mkstr(a) # a #define in_between(a) mkstr(a) #define join(c, d) in_between(c hash_hash d) expect_string("x ## y", join(x, y)); int m14 = 67; #define m14(x) x expect(67, m14); expect(67, m14(m14)); int a = 68; #define glue(x, y) x ## y glue(a+, +); expect(69, a); #define identity(x) stringify(x) expect_string("aa A B aa C", identity(m10(a) A B m10(a) C)); #define identity2(x) stringify(z ## x) expect_string("zA aa A B aa C", identity2(A m10(a) A B m10(a) C)); #define m15(x) x x expect_string("a a", identity(m15(a))); #define m16(x) (x,x) expect_string("(a,a)", identity(m16(a))); }