ga { license: GPL; // BSD, GPL, LGPL or filename of your own license language: cpp; //java; // what language to output (cpp, java) pass: reference; // or value return: value; // or reference namespace: c3ga; // what namespace to put the ga in (if any) inline: constructors set assign operators functions; // what to inline: general_mv general_om exception: throw ; // how to handle exceptions: [callback | ignore | throw] debug_coordinate_string: disable; //enable or disable profile: ; // profiling = disable // profile: enable net; cpp_operator_default_bindings; // this sets the cpp default operator bindings //todo: is it always require to register both assign and regular?? multivector_mem_alloc: full; // or parity_pure; memory allocation for general multivector: full or parity pure storage: float '%s'; basis: no, e1, e2, e3, ni; metric: e1 . e1 = e2 . e2 = e3 . e3 = 1; metric: no . ni = -1; multivector: mv( 1.0, // grade 0 no, e1, e2, e3, ni, // grade 1 no^e1, no^e2, no^e3, e1^e2, e2^e3, e3^e1, e1^ni, e2^ni, e3^ni, no^ni, // grade 2 e2^e3^ni, e3^e1^ni, e1^e2^ni, no^e3^ni, no^e1^ni, no^e2^ni, no^e2^e3, no^e1^e3, no^e1^e2, e1^e2^e3, // grade 3 e1 ^ e2 ^ e3 ^ ni, no ^ e2 ^ e3 ^ ni, no ^ e1 ^ ni ^ e3, no ^ e1 ^ e2 ^ ni, no ^ e1 ^ e2 ^ e3, // grade 4 no ^ e1 ^ e2 ^ e3 ^ ni // grade 5 ); specialization: blade no_t(no); specialization: blade e1_t(e1); specialization: blade e2_t(e2); specialization: blade e3_t(e3); specialization: blade ni_t(ni); specialization: blade scalar(1.0); specialization: blade noni_t(no^ni); specialization: blade point(no, e1, e2, e3, ni); specialization: blade normalizedPoint(no = 1, e1, e2, e3, ni); specialization: blade flatPoint(e1^ni, e2^ni, e3^ni, no^ni); specialization: blade normalizedFlatPoint(e1^ni, e2^ni, e3^ni, no^ni = 1); specialization: blade pointPair(no^e1, no^e2, no^e3, e1^e2, e2^e3, e3^e1, e1^ni, e2^ni, e3^ni, no^ni); specialization: blade line(e1^e2^ni, e1^e3^ni, e2^e3^ni, e1^no^ni, e2^no^ni, e3^no^ni); specialization: blade dualLine(e1^e2, e1^e3, e2^e3, e1^ni, e2^ni, e3^ni); specialization: blade plane(e1^e2^e3^ni, e1^e2^no^ni, e1^e3^no^ni, e2^e3^no^ni); specialization: blade dualPlane(e1, e2, e3, ni); specialization: blade circle(e2^e3^ni, e3^e1^ni, e1^e2^ni, no^e3^ni, no^e1^ni, no^e2^ni, no^e2^e3, no^e1^e3, no^e1^e2, e1^e2^e3); specialization: blade sphere(e1^e2^e3^ni, e1^e2^no^ni, e1^e3^no^ni, e2^e3^no^ni, e1^e2^e3^no); specialization: blade dualSphere(no, e1, e2, e3, ni); specialization: blade normalizedSphere(e1^e2^e3^ni=1, e1^e2^no^ni, e1^e3^no^ni, e2^e3^no^ni, e1^e2^e3^no); specialization: blade normalizedDualSphere(no=1, e1, e2, e3, ni); specialization: blade freeVector(e1^ni, e2^ni, e3^ni); specialization: blade freeBivector(e1^e2^ni, e2^e3^ni, e3^e1^ni); specialization: blade freeTrivector(e1^e2^e3^ni); specialization: blade tangentVector(no^e1, no^e2, no^e3, e1^e2, e2^e3, e3^e1, e1^ni, e2^ni, e3^ni, no^ni); specialization: blade tangentBivector(e1^e2^e3, e2^e3^ni, e3^e1^ni, e1^e2^ni, no^e3^ni, no^e1^ni, no^e2^ni, no^e2^e3, no^e1^e3, no^e1^e2); specialization: blade vectorE2GA(e1, e2); specialization: blade vectorE3GA(e1, e2, e3); specialization: blade bivectorE3GA(e1^e2, e2^e3, e3^e1); specialization: blade TRversorLog(e1^e2, e2^e3, e3^e1, e1^ni, e2^ni, e3^ni); specialization: blade TRSversorLog(e1^e2, e1^e3, e2^e3, e1^ni, e2^ni, e3^ni, no^ni); specialization: versor TRversor(1.0, // grade 0 e1^e2, e1^e3, e2^e3, e1^ni, e2^ni, e3^ni, // grade 2 e1^e2^e3^ni); // grade 4 specialization: versor TRSversor(1.0, // grade 0 e1^e2, e1^e3, e2^e3, e1^ni, e2^ni, e3^ni, no^ni, // grade 2 e1^e2^no^ni, e1^e3^no^ni, e2^e3^no^ni, e1^e2^e3^ni); // grade 4 specialization: versor evenVersor(1.0, // grade 0 no^e1, no^e2, no^e3, e1^e2, e2^e3, e3^e1, e1^ni, e2^ni, e3^ni, no^ni, // grade 2 e1^e2^e3^ni, e1^e2^no^ni, e1^e3^no^ni, e2^e3^no^ni, e1^e2^e3^no); // grade 4 specialization: versor translator(1.0, // grade 0 e1^ni, e2^ni, e3^ni // grade 2 ); specialization: versor normalizedTranslator(1.0=1, // grade 0 e1^ni, e2^ni, e3^ni // grade 2 ); specialization: versor rotor(1.0, // grade 0 e1^e2, e2^e3, e3^e1 // grade 2 ); specialization: versor scalor(1.0, no ^ ni); constant: e1ni = "e1 ^ ni"; constant: e2ni = "e2 ^ ni"; constant: e3ni = "e3 ^ ni"; constant: noni = "no ^ ni"; constant: I3 = "e1 ^ e2 ^ e3"; constant: I5 = "no ^ e1 ^ e2 ^ e3 ^ ni"; constant: I5i = "::g2bi::inverse(no ^ e1 ^ e2 ^ e3 ^ ni)"; outermorphism: om( no, e1, e2, e3, ni, // grade 1 no^e1, no^e2, no^e3, e1^e2, e2^e3, e3^e1, e1^ni, e2^ni, e3^ni, no^ni, // grade 2 e2^e3^ni, e3^e1^ni, e1^e2^ni, no^e3^ni, no^e1^ni, no^e2^ni, no^e2^e3, no^e1^e3, no^e1^e2, e1^e2^e3, // grade 3 e1 ^ e2 ^ e3 ^ ni, no ^ e2 ^ e3 ^ ni, no ^ e1 ^ e3 ^ ni, no ^ e1 ^ e2 ^ ni, no ^ e1 ^ e2 ^ e3, // grade 4 no ^ e1 ^ e2 ^ e3 ^ ni // grade 5 ); // outermorphism for use with OpenGL modelview matrix: om_specialization: transpose omFlatPoint(e1^ni, e2^ni, e3^ni, no^ni); } mv lcont(mv x, mv y) { return ::g2bi::lcont(x, y); } mv scp(mv x, mv y) { return ::g2bi::scp(x, y); } mv gp(mv x, mv y) { return x y; } mv gpEM(mv x, mv y) { return ::g2bi::gp_em(x, y); } mv scpEM(mv x, mv y) { return ::g2bi::scp_em(x, y); } mv lcontEM(mv x, mv y) { return ::g2bi::lcont_em(x, y); } mv op(mv x, mv y) { return x ^ y; } mv add(mv x, mv y) { return x + y; } mv subtract(mv x, mv y) { return x - y; } scalar norm_e2(mv x) { return ::g2bi::scp_em(x, ::g2bi::reverse(x)); } scalar norm_e(mv x) { scalar e2 = ::g2bi::scp_em(x, ::g2bi::reverse(x)); return ::g2bi::scalar_sqrt(e2); } mv unit_e(mv x) { scalar e2 = ::g2bi::scp_em(x, ::g2bi::reverse(x)); scalar ie = ::g2bi::inverse(::g2bi::scalar_sqrt(e2)); return x ie; } scalar norm_r2(mv x) { return ::g2bi::scp(x, ::g2bi::reverse(x)); } scalar norm_r(mv x) { scalar r2 = ::g2bi::scp(x, ::g2bi::reverse(x)); return ::g2bi::scalar_sign(r2) * ::g2bi::scalar_sqrt(::g2bi::scalar_abs(r2)); } mv unit_r(mv x) { scalar r2 = ::g2bi::scp(x, ::g2bi::reverse(x)); scalar ir = ::g2bi::inverse(::g2bi::scalar_sqrt(::g2bi::scalar_abs(r2))); return x ir; } mv reverse(mv x) { return ::g2bi::reverse(x); } mv negate(mv x) { return ::g2bi::negate(x); } mv dual(mv x) { return ::g2bi::dual(x); } mv undual(mv x) { return ::g2bi::undual(x); } mv inverse(mv x) { scalar n = ::g2bi::scp(x, ::g2bi::reverse(x)); scalar in = ::g2bi::inverse(n); return ::g2bi::gp(::g2bi::reverse(x), in); } mv inverseEM(mv x) { scalar n = ::g2bi::scp_em(x, ::g2bi::reverse(x)); scalar in = ::g2bi::inverse(n); return ::g2bi::gp_em(::g2bi::reverse(x), in); } mv apply_om(om x, mv y) { return x * y; } mv gradeInvolution(mv x) { return ::g2bi::grade_involution(x); } /* normalizedPoint c3gaPoint(vectorE3GA l) { return ::g2bi::scp(l, e1) * e1 + ::g2bi::scp(l, e2) * e2 + ::g2bi::scp(l, e3) * e3 + no + 0.5 * (::g2bi::scp(l, e1) * ::g2bi::scp(l, e1) + ::g2bi::scp(l, e2) * ::g2bi::scp(l, e2) + ::g2bi::scp(l, e3) * ::g2bi::scp(l, e3)) * ni; } */