// G2 functions: mv lcont(const mv& x, const mv& y) { mv __temp_var_1__; float __tmp_coord_array_1__[4] ; mv_zero(__tmp_coord_array_1__, 4); const float* __y_xpd__[3] ; y.expand(__y_xpd__, true); const float* __x_xpd__[3] ; x.expand(__x_xpd__, true); if (((y.m_gu & 1) != 0)) { if (((x.m_gu & 1) != 0)) { __tmp_coord_array_1__[0] += (__x_xpd__[0][0] * __y_xpd__[0][0]); } } if (((y.m_gu & 2) != 0)) { if (((x.m_gu & 1) != 0)) { __tmp_coord_array_1__[1] += (__y_xpd__[1][0] * __x_xpd__[0][0]); __tmp_coord_array_1__[2] += (__y_xpd__[1][1] * __x_xpd__[0][0]); } if (((x.m_gu & 2) != 0)) { __tmp_coord_array_1__[0] += ((__x_xpd__[1][1] * __y_xpd__[1][1]) + (__x_xpd__[1][0] * __y_xpd__[1][0])); } } if (((y.m_gu & 4) != 0)) { if (((x.m_gu & 1) != 0)) { __tmp_coord_array_1__[3] += (__y_xpd__[2][0] * __x_xpd__[0][0]); } if (((x.m_gu & 2) != 0)) { __tmp_coord_array_1__[1] += (-1.0f * __x_xpd__[1][1] * __y_xpd__[2][0]); __tmp_coord_array_1__[2] += (__x_xpd__[1][0] * __y_xpd__[2][0]); } if (((x.m_gu & 4) != 0)) { __tmp_coord_array_1__[0] += (-1.0f * __x_xpd__[2][0] * __y_xpd__[2][0]); } } __temp_var_1__ = mv_compress(__tmp_coord_array_1__); return __temp_var_1__; }
// G2 functions: mv apply_om(const om& x, const mv& y) { mv __temp_var_1__; float __tmp_coord_array_14__[4] ; mv_zero(__tmp_coord_array_14__, 4); const float* __y_xpd__[3] ; y.expand(__y_xpd__, true); if (((y.m_gu & 2) != 0)) { __tmp_coord_array_14__[1] += ((x.m_c[1] * __y_xpd__[1][1]) + (x.m_c[0] * __y_xpd__[1][0])); __tmp_coord_array_14__[2] += ((x.m_c[2] * __y_xpd__[1][0]) + (x.m_c[3] * __y_xpd__[1][1])); } if (((y.m_gu & 4) != 0)) { __tmp_coord_array_14__[3] += (x.m_c[4] * __y_xpd__[2][0]); } __temp_var_1__ = mv_compress(__tmp_coord_array_14__); return __temp_var_1__; }
mv gradeInvolution(const mv& x) { mv __temp_var_1__; float __tmp_coord_array_13__[4] ; mv_zero(__tmp_coord_array_13__, 4); const float* __x_xpd__[3] ; x.expand(__x_xpd__, true); if (((x.m_gu & 1) != 0)) { __tmp_coord_array_13__[0] += __x_xpd__[0][0]; } if (((x.m_gu & 2) != 0)) { __tmp_coord_array_13__[1] += (-1.0f * __x_xpd__[1][0]); __tmp_coord_array_13__[2] += (-1.0f * __x_xpd__[1][1]); } if (((x.m_gu & 4) != 0)) { __tmp_coord_array_13__[3] += __x_xpd__[2][0]; } __temp_var_1__ = mv_compress(__tmp_coord_array_13__); return __temp_var_1__; }
mv inverse(const mv& x) { scalar n; const float* __x_xpd__[3] ; x.expand(__x_xpd__, true); if (((x.m_gu & 1) != 0)) { n.m_c[0] += (__x_xpd__[0][0] * __x_xpd__[0][0]); } if (((x.m_gu & 2) != 0)) { n.m_c[0] += ((__x_xpd__[1][1] * __x_xpd__[1][1]) + (__x_xpd__[1][0] * __x_xpd__[1][0])); } if (((x.m_gu & 4) != 0)) { n.m_c[0] += (__x_xpd__[2][0] * __x_xpd__[2][0]); } scalar in; in.m_c[0] = ((char)1 / n.m_c[0]); mv __temp_var_1__; float __tmp_coord_array_12__[4] ; mv_zero(__tmp_coord_array_12__, 4); if (((x.m_gu & 1) != 0)) { __tmp_coord_array_12__[0] += (__x_xpd__[0][0] * in.m_c[0]); } if (((x.m_gu & 2) != 0)) { __tmp_coord_array_12__[1] += (__x_xpd__[1][0] * in.m_c[0]); __tmp_coord_array_12__[2] += (__x_xpd__[1][1] * in.m_c[0]); } if (((x.m_gu & 4) != 0)) { __tmp_coord_array_12__[3] += (-1.0f * __x_xpd__[2][0] * in.m_c[0]); } __temp_var_1__ = mv_compress(__tmp_coord_array_12__); return __temp_var_1__; }
mv unit_r(const mv& x) { scalar r2; const float* __x_xpd__[3] ; x.expand(__x_xpd__, true); if (((x.m_gu & 1) != 0)) { r2.m_c[0] += (__x_xpd__[0][0] * __x_xpd__[0][0]); } if (((x.m_gu & 2) != 0)) { r2.m_c[0] += ((__x_xpd__[1][0] * __x_xpd__[1][0]) + (__x_xpd__[1][1] * __x_xpd__[1][1])); } if (((x.m_gu & 4) != 0)) { r2.m_c[0] += (__x_xpd__[2][0] * __x_xpd__[2][0]); } scalar ir; ir.m_c[0] = ((char)1 / sqrt((((r2.m_c[0] < (char)0)) ? ((-r2.m_c[0])) : (r2.m_c[0])))); mv __temp_var_1__; float __tmp_coord_array_7__[4] ; mv_zero(__tmp_coord_array_7__, 4); if (((x.m_gu & 1) != 0)) { __tmp_coord_array_7__[0] += (__x_xpd__[0][0] * ir.m_c[0]); } if (((x.m_gu & 2) != 0)) { __tmp_coord_array_7__[1] += (__x_xpd__[1][0] * ir.m_c[0]); __tmp_coord_array_7__[2] += (__x_xpd__[1][1] * ir.m_c[0]); } if (((x.m_gu & 4) != 0)) { __tmp_coord_array_7__[3] += (__x_xpd__[2][0] * ir.m_c[0]); } __temp_var_1__ = mv_compress(__tmp_coord_array_7__); return __temp_var_1__; }
mv unit_e(const mv& x) { scalar e2; const float* __x_xpd__[3] ; x.expand(__x_xpd__, true); if (((x.m_gu & 1) != 0)) { e2.m_c[0] += (__x_xpd__[0][0] * __x_xpd__[0][0]); } if (((x.m_gu & 2) != 0)) { e2.m_c[0] += ((__x_xpd__[1][0] * __x_xpd__[1][0]) + (__x_xpd__[1][1] * __x_xpd__[1][1])); } if (((x.m_gu & 4) != 0)) { e2.m_c[0] += (__x_xpd__[2][0] * __x_xpd__[2][0]); } scalar ie; ie.m_c[0] = ((char)1 / sqrt(e2.m_c[0])); mv __temp_var_1__; float __tmp_coord_array_6__[4] ; mv_zero(__tmp_coord_array_6__, 4); if (((x.m_gu & 1) != 0)) { __tmp_coord_array_6__[0] += (__x_xpd__[0][0] * ie.m_c[0]); } if (((x.m_gu & 2) != 0)) { __tmp_coord_array_6__[1] += (__x_xpd__[1][0] * ie.m_c[0]); __tmp_coord_array_6__[2] += (__x_xpd__[1][1] * ie.m_c[0]); } if (((x.m_gu & 4) != 0)) { __tmp_coord_array_6__[3] += (__x_xpd__[2][0] * ie.m_c[0]); } __temp_var_1__ = mv_compress(__tmp_coord_array_6__); return __temp_var_1__; }
mv add(const mv& x, const mv& y) { mv __temp_var_1__; float __tmp_coord_array_4__[4] ; mv_zero(__tmp_coord_array_4__, 4); const float* __y_xpd__[3] ; y.expand(__y_xpd__, true); const float* __x_xpd__[3] ; x.expand(__x_xpd__, true); if (((x.m_gu & 1) != 0)) { __tmp_coord_array_4__[0] += __x_xpd__[0][0]; } if (((x.m_gu & 2) != 0)) { __tmp_coord_array_4__[1] += __x_xpd__[1][0]; __tmp_coord_array_4__[2] += __x_xpd__[1][1]; } if (((x.m_gu & 4) != 0)) { __tmp_coord_array_4__[3] += __x_xpd__[2][0]; } if (((y.m_gu & 1) != 0)) { __tmp_coord_array_4__[0] += __y_xpd__[0][0]; } if (((y.m_gu & 2) != 0)) { __tmp_coord_array_4__[1] += __y_xpd__[1][0]; __tmp_coord_array_4__[2] += __y_xpd__[1][1]; } if (((y.m_gu & 4) != 0)) { __tmp_coord_array_4__[3] += __y_xpd__[2][0]; } __temp_var_1__ = mv_compress(__tmp_coord_array_4__); return __temp_var_1__; }
bool parseEx(struct c2gaParseMultivectorData *PD, const std::string &_str, const std::string &_strSourceName) { double coord[16]; char buf[256]; /* used to copy number tokens */ double scale; unsigned int bitmap; int startIdx = 0, endIdx; int lineIdx = 0, currentLineStart = 0; int token, i, beDone, cnt, firstLoop = 1; const char *str = _str.c_str(); const char *strSourceName = _strSourceName.c_str(); c2gaParseDataInit(PD); /* should reset all */ c2ga::zero_16(coord); /* get the first token */ token = c2gaParseGetNextToken(str, &startIdx, &endIdx, &lineIdx, ¤tLineStart); while (1) { /* reset for next basis blade */ bitmap = 0; scale = 1.0; beDone = 0; if (token == T_END_OF_STRING) break; cnt = 0; while ((token == T_PLUS) || (token == T_MINUS)) { /* accept all +- */ cnt++; startIdx = endIdx+1; if (token == T_MINUS) scale *= -1.0; /* - */ token = c2gaParseGetNextToken(str, &startIdx, &endIdx, &lineIdx, ¤tLineStart); } /* require at least one +- if this is not the first term: */ if ((!firstLoop) && (cnt == 0)) { snprintf(PD->message, 256, "Expected '+' or '-' at %s, line %d, column %d", strSourceName, lineIdx+1, startIdx - currentLineStart +1); return false; } if ((token == T_NUMBER) || ((token >= T_FIRST_BASIS_VECTOR) && (token <= T_LAST_BASIS_VECTOR))) { /* must be number or basis vector */ if (token == T_NUMBER) { { /* copy token to buf, multiply scale with value of number */ for (i = 0; i <= (endIdx-startIdx); i++) buf[i] = str[startIdx+i]; buf[(endIdx-startIdx)+1] = 0; scale *= (double)atof((const char*)buf); } startIdx = endIdx+1; /* * or ^ ? */ token = c2gaParseGetNextToken(str, &startIdx, &endIdx, &lineIdx, ¤tLineStart); if ((token == T_WEDGE) || (token == T_MUL)) { startIdx = endIdx+1; /* must find basis vector */ token = c2gaParseGetNextToken(str, &startIdx, &endIdx, &lineIdx, ¤tLineStart); } else { /* just a single scalar is OK */ startIdx = endIdx+1; beDone = 1; } } if (!beDone) { if ((token >= T_FIRST_BASIS_VECTOR) && (token <= T_LAST_BASIS_VECTOR)) { c2gaParseWedgeBasisVector((unsigned int)token - T_FIRST_BASIS_VECTOR, &scale, &bitmap); startIdx = endIdx+1; } else { snprintf(PD->message, 256, "Expected basis vector at %s, line %d, column %d", strSourceName, lineIdx+1, startIdx - currentLineStart +1); return false; } } if (!beDone) { /* accept ^ basis vector as many times as it takes */ while (1) { /* ^ */ token = c2gaParseGetNextToken(str, &startIdx, &endIdx, &lineIdx, ¤tLineStart); if (token != T_WEDGE) break; startIdx = endIdx+1; /* basis vector */ token = c2gaParseGetNextToken(str, &startIdx, &endIdx, &lineIdx, ¤tLineStart); if ((token >= T_FIRST_BASIS_VECTOR) && (token <= T_LAST_BASIS_VECTOR)) { c2gaParseWedgeBasisVector((unsigned int)token - T_FIRST_BASIS_VECTOR, &scale, &bitmap); startIdx = endIdx+1; } else { snprintf(PD->message, 256, "Expected basis vector at %s, line %d, column %d", strSourceName, lineIdx+1, startIdx - currentLineStart +1); return false; } } } } /* end of 'if number or bv' */ else if (token == T_BAD_CHARACTER) { snprintf(PD->message, 256, "Bad character at %s, line %d, column %d", strSourceName, lineIdx+1, startIdx - currentLineStart +1); return false; } else if (token == T_BAD_NUMBER) { snprintf(PD->message, 256, "Bad number at %s, line %d, column %d", strSourceName, lineIdx+1, startIdx - currentLineStart +1); return false; } else if (token == T_BAD_IDENTIFIER) { snprintf(PD->message, 256, "Bad identifier at %s, line %d, column %d", strSourceName, lineIdx+1, startIdx - currentLineStart +1); return false; } else { snprintf(PD->message, 256, "Unexpected token at %s, line %d, column %d", strSourceName, lineIdx+1, startIdx - currentLineStart +1); return false; } /* add */ c2gaParseSum(coord, scale, bitmap); /* remember that the first loop is done */ firstLoop = 0; } /* compress */ PD->value = mv_compress(coord, 0.0, 31); return true; /* success */ } /* end of parse_mvEx */
mv compress(const mv & arg1, float epsilon /*= 0.0*/) { return mv_compress(arg1.m_c, epsilon, arg1.m_gu); }