Esempio n. 1
0
// 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;
      }
   }
}
Esempio n. 2
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();
}
Esempio n. 3
0
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);
    }


}