// Cleans up vector (0's out entries that are less than epsilon) void Vector<3, real_t>::cleanup() { for(unsigned i = 3; i--;) { if (EQ(data[i], create_real(0))) { data[i] = 0; } } }
void Vector<3, real_t>::getOrthonormalBasis(Vector<3, real_t> &U, Vector<3, real_t> &V) { normalize(); const Vector3 &normal = *this; Vector3 up = Vector3(0, 1, 0); if (ABS(up.dot(normal)) > create_real(0.8)) up = Vector3(1, 0, 0); U = up.cross(normal).getNormalized(); V = normal.cross(U).getNormalized(); }
pointer parse_number(parser* parse) { size_t len = 0; bool isFloat = false; bool isHex = false; bool isBinary = false; const char* Start = parse->curr; while(!is_delimiter(*parse->curr)) { if(*parse->curr == '.') isFloat = true; if(is_number_char(*parse->curr) || (isHex && is_extended_hex_char(*parse->curr))) len++; else if(len == 1 && *parse->curr == 'x' && *Start == '0') { len++; isHex = true; } else if(len == 0 && *parse->curr == 'b') isBinary = true; else return parser_error(parse, "Unexpected char '%c' in number literal.", *parse->curr); parse->curr++; } { int TotalIs = isHex + isBinary + isFloat; if(TotalIs > true) { char* buffer = new char[len+1]; strncpy(buffer, Start, len); buffer[len] = '\0'; parser_error(parse, "Unexpected number literal: %s.", buffer); delete buffer; return NIL; } } if(isFloat) { char* buffer = new char[len+1]; strncpy(buffer, Start, len); buffer[len] = '\0'; float ret = atof(buffer); delete buffer; return create_real(ret); } else { // Might be smart to use a buffer here, in case strtol doesn't see all delimiters as we do. int ret; if(isHex) ret = strtol(Start + 2, NULL, 16); else if(isBinary) ret = strtol(Start + 1, NULL, 2); else ret = strtol(Start, NULL, 10); return create_int(ret); } }