Commit 562c84c4 authored by Luis Peñaranda's avatar Luis Peñaranda
Browse files

use float arithmetic functions for floats

parent dade31c1
Loading
Loading
Loading
Loading
+83 −93
Original line number Diff line number Diff line
@@ -65,15 +65,15 @@ void OpenGLCanvas::change_fov(double f){
        if (fov_scale_relation == "Naive")
            scale=fov_max/fov;
        else if (fov_scale_relation == "Square Root")
            scale=sqrt((360.f-fov_max-fov)/(360.-2*fov_max));
            scale=sqrtf((360.f-fov_max-fov)/(360.-2*fov_max));
        else if (fov_scale_relation == "Linear")
            scale=(360.f-fov_max-fov)/(360.-2*fov_max);
            scale=(360.f-fov_max-fov)/(360.f-2.f*fov_max);
        else if (fov_scale_relation == "Square Power")
            scale=powf((360.f-fov_max-fov)/(360.-2*fov_max),2);
            scale=powf((360.f-fov_max-fov)/(360.f-2.f*fov_max),2.f);
        else if (fov_scale_relation == "Cubic Power")
            scale=powf((360.f-fov_max-fov)/(360.-2*fov_max),3);
            scale=powf((360.f-fov_max-fov)/(360.f-2.f*fov_max),3.f);
        else if (fov_scale_relation == "Logarithm")
            scale=log(exp(1.f)+(1.f-exp(1.f))*(fov-fov_max)/(360.-2*fov_max));
            scale=logf(expf(1.f)+(1.f-expf(1.f))*(fov-fov_max)/(360.f-2.f*fov_max));
    }

//    scale = 0.3f;
@@ -99,7 +99,7 @@ void OpenGLCanvas::change_fov(int new_fov){
}

void OpenGLCanvas::change_fov_max(int new_fov_max){
    if(new_fov_max<=360&&new_fov_max>=1)
    if(new_fov_max<=360.f&&new_fov_max>=1)
            fov_max=(double)new_fov_max;
    if (fov<=fov_max)
        scale=1.f;
@@ -109,15 +109,15 @@ void OpenGLCanvas::change_fov_max(int new_fov_max){
        if (fov_scale_relation == "Naive")
            scale=fov_max/fov;
        else if (fov_scale_relation == "Square Root")
            scale=sqrt((360.f-fov_max-fov)/(360.-2*fov_max));
            scale=sqrtf((360.f-fov_max-fov)/(360.f-2.f*fov_max));
        else if (fov_scale_relation == "Linear")
            scale=(360.f-fov_max-fov)/(360.-2*fov_max);
            scale=(360.f-fov_max-fov)/(360.f-2.f*fov_max);
        else if (fov_scale_relation == "Square Power")
            scale=powf((360.f-fov_max-fov)/(360.-2*fov_max),2);
            scale=powf((360.f-fov_max-fov)/(360.f-2.f*fov_max),2.f);
        else if (fov_scale_relation == "Cubic Power")
            scale=powf((360.f-fov_max-fov)/(360.-2*fov_max),3);
            scale=powf((360.f-fov_max-fov)/(360.f-2.f*fov_max),3.f);
        else if (fov_scale_relation == "Logarithm")
            scale=log(exp(1.f)+(1.f-exp(1.f))*(fov-fov_max)/(360.-2*fov_max));
            scale=logf(expf(1.f)+(1.f-expf(1.f))*(fov-fov_max)/(360.f-2.f*fov_max));
    }
    fprintf(stderr,"change fov_max, fov=%f, fov_max=%f, new scale=%f\n",fov,fov_max,scale);
    emit max_fov_changed((int)fov_max);
@@ -133,7 +133,7 @@ void OpenGLCanvas::change_fov_max(int new_fov_max){

void OpenGLCanvas::change_center_lambda(double lambda){

    if (center_lambda!=lambda && lambda>=-CONST_PI && lambda<=CONST_PI) {
    if (center_lambda!=lambda && lambda>=-CONST_PI_F && lambda<=CONST_PI_F) {
        center_lambda = lambda;
        updateGL();
    }
@@ -142,7 +142,7 @@ void OpenGLCanvas::change_center_lambda(double lambda){

void OpenGLCanvas::change_center_phi(double phi){

    if (center_phi!=phi && phi>=-CONST_PI_2 && phi<=CONST_PI_2) {
    if (center_phi!=phi && phi>=-CONST_PI_2_F && phi<=CONST_PI_2_F) {
        center_phi = phi;
        updateGL();
    }
@@ -164,15 +164,15 @@ void OpenGLCanvas::change_fov_scale_relation(QString name){
       if (fov_scale_relation == "Naive")
           scale=fov_max/fov;
       else if (fov_scale_relation == "Square Root")
           scale=sqrt((360.f-fov_max-fov)/(360.-2*fov_max));
           scale=sqrtf((360.f-fov_max-fov)/(360.f-2.f*fov_max));
       else if (fov_scale_relation == "Linear")
           scale=(360.f-fov_max-fov)/(360.-2*fov_max);
           scale=(360.f-fov_max-fov)/(360.f-2.f*fov_max);
       else if (fov_scale_relation == "Square Power")
           scale=powf((360.f-fov_max-fov)/(360.-2*fov_max),2);
           scale=powf((360.f-fov_max-fov)/(360.f-2.f*fov_max),2.f);
       else if (fov_scale_relation == "Cubic Power")
           scale=powf((360.f-fov_max-fov)/(360.-2*fov_max),3);
           scale=powf((360.f-fov_max-fov)/(360.f-2.f*fov_max),3.f);
       else if (fov_scale_relation == "Logarithm")
           scale=log(exp(1.f)+(1.f-exp(1.f))*(fov-fov_max)/(360.-2*fov_max));
           scale=logf(expf(1.f)+(1.f-expf(1.f))*(fov-fov_max)/(360.f-2.f*fov_max));
   }
   fprintf(stderr,"changed scale relation, scale=%f, fov_max=%f\n",scale,fov_max);
   updateGL();
@@ -393,6 +393,7 @@ void OpenGLCanvas::define_texture_coordinates(float *texCoord, int m, int n, flo

}

// This function makes the same computation GLSL does. It is never called.
void OpenGLCanvas::vertex_transformation(float *positions, int m, int n, float center_lambda, float center_phi, float fov_rads, float scale){

    float min_lambda = -CONST_PI_F;
@@ -409,16 +410,16 @@ void OpenGLCanvas::vertex_transformation(float *positions, int m, int n, float c
    lambda=fov_rads;
    phi=0.f;
    // OpenGL: x is the vertical axes pointg downwards, and y is horizontal axes
    y = sin(phi);
    x = -sin(lambda)*cos(phi);
    z = -cos(lambda)*cos(phi);
    u = 2.f*x/(-z+1.f);
    v = 2.f*y/(-z+1.f);
    r = sqrt(u*u+v*v);
    theta = atan2(u,v);
    y=sinf(phi);
    x=-sinf(lambda)*cosf(phi);
    z = -cosf(lambda)*cosf(phi);
    u=2.f*x/(1.f-z);
    v=2.f*y/(1.f-z);
    r=hypotf(u,v);
    theta=atan2f(u,v);
    r*=scale;
    u = -r*sin(theta);
    v = r*cos(theta);
    u=-r*sinf(theta);
    v=r*cosf(theta);
    x=(4.f*u)/(u*u+v*v+4.f);
    y=(4.f*v)/(u*u+v*v+4.f);
    z=(u*u+v*v-4.f)/(u*u+v*v+4.f);
@@ -433,41 +434,40 @@ void OpenGLCanvas::vertex_transformation(float *positions, int m, int n, float c
            phi=(min_phi+delta_phi*i);

            // OpenGL: x is the vertical axes pointg downwards, and y is horizontal axes
            y = sin(phi);
            x = -sin(lambda)*cos(phi);
            z = -cos(lambda)*cos(phi);
            y=sinf(phi);
            x=-sinf(lambda)*cosf(phi);
            z=-cosf(lambda)*cosf(phi);

            //Rotation 1: (-center_lambda)-rotation on the xz-plane
            float x_copy=x;
            x = cos(-center_lambda)*x - sin(-center_lambda)*z;
            y = 1.f*y;
            z = sin(-center_lambda)*x_copy + cos(-center_lambda)*z;
            x=cosf(-center_lambda)*x-sinf(-center_lambda)*z;
            //y=1.f*y;
            z=sinf(-center_lambda)*x_copy+cosf(-center_lambda)*z;

            //Rotation 2: (-center_phi)-rotation on the yz-plane
            float y_copy=y;
            x = 1.f*x;
            y = cos(-center_phi)*y - sin(-center_phi)*z;
            z = sin(-center_phi)*y_copy + cos(-center_phi)*z;
            //x = 1.f*x;
            y=cosf(-center_phi)*y-sinf(-center_phi)*z;
            z=sinf(-center_phi)*y_copy+cosf(-center_phi)*z;

            u=2.f*x/(1.f-z);
            v=2.f*y/(1.f-z);

            u = 2.f*x/(-z+1.f);
            v = 2.f*y/(-z+1.f);

            r = sqrt(u*u+v*v);
            theta = atan2(u,v);
            r=hypotf(u,v);
            theta=atan2f(u,v);

            // scaling the complex plane according to scale specified in the interface (relate it to FOV)
            r*=scale;

            u = -r*sin(theta);
            v = r*cos(theta);
            u=-r*sinf(theta);
            v=r*cosf(theta);

            x=(4.f*u)/(u*u+v*v+4.f);
            y=(4.f*v)/(u*u+v*v+4.f);
            z=(u*u+v*v-4.f)/(u*u+v*v+4.f);

            lambda = atan2(x,-z)/CONST_PI_F;
            phi = asin(y)/CONST_PI_2_F;
            lambda=atan2f(x,-z)/CONST_PI_F;
            phi=asinf(y)/CONST_PI_2_F;

            if (visualization=="Moebius"){
                u = x/(-z);
@@ -476,36 +476,31 @@ void OpenGLCanvas::vertex_transformation(float *positions, int m, int n, float c
                positions[3*(j+i*n)+1] = v/extent;
                positions[3*(j+i*n)+2] = z;
            }

            if (visualization=="3D Sphere"){
            else if (visualization=="3D Sphere"){
                positions[3*(j+i*n)] = 0.9f*x;
                positions[3*(j+i*n)+1] = 0.9f*y;
                positions[3*(j+i*n)+2] = z;
            }

            if (visualization=="Equi-Rectangular"){
            else if (visualization=="Equi-Rectangular"){
                positions[3*(j+i*n)] = lambda;
                positions[3*(j+i*n)+1] = phi;
                positions[3*(j+i*n)+2] = z;
            }

            if (visualization=="Stereographic"){
            else if (visualization=="Stereographic"){
                u = 2*x/(-z+1);
                v = 2*y/(-z+1);
                positions[3*(j+i*n)] = u/extent;
                positions[3*(j+i*n)+1] = v/extent;
                positions[3*(j+i*n)+2] = z;
            }

            if (visualization=="Mercator"){
            else if (visualization=="Mercator"){
                u=lambda;
                v = log((1.0/cos(phi)) + tan(phi));
                v=logf((1.0/cosf(phi))+tanf(phi));
                positions[3*(j+i*n)] = u/extent;
                positions[3*(j+i*n)+1] = v/extent;
                positions[3*(j+i*n)+2] = z;
            }

            if (visualization=="Zorin-Barr"){
            else if (visualization=="Zorin-Barr"){
                // perspective
                u = x/(-z);
                v = y/(-z);
@@ -522,18 +517,15 @@ void OpenGLCanvas::vertex_transformation(float *positions, int m, int n, float c
                positions[3*(j+i*n)+1] = v/extent;
                positions[3*(j+i*n)+2] = z;
            }

            if (visualization=="Orthographic"){
            else if (visualization=="Orthographic"){
                u=x;
                v=y;
                positions[3*(j+i*n)] = u/extent;
                positions[3*(j+i*n)+1] = v/extent;
                positions[3*(j+i*n)]=x/extent;
                positions[3*(j+i*n)+1]=y/extent;
                positions[3*(j+i*n)+2]=z;
            }

        }
    }

}

void OpenGLCanvas::load_sphere_mesh(float *positions, int m, int n){
@@ -555,9 +547,9 @@ void OpenGLCanvas::load_sphere_mesh(float *positions, int m, int n){
            phi=(min_phi+delta_phi*i);

            // OpenGL: x is the vertical axes pointg downwards, and y is horizontal axes
            y = sin(phi);
            x = -sin(lambda)*cos(phi);
            z = -cos(lambda)*cos(phi);
            y=sinf(phi);
            x=-sinf(lambda)*cosf(phi);
            z=-cosf(lambda)*cosf(phi);

            positions[3*(j+i*n)] = x;
            positions[3*(j+i*n)+1] = y;
@@ -569,32 +561,31 @@ void OpenGLCanvas::load_sphere_mesh(float *positions, int m, int n){
}

float OpenGLCanvas::calculate_extent(float fov_rads){

    double lambda, phi, x, y, z, u, v, r, theta;
    float lambda, phi, x, y, z, u, v, r, theta;
    //calculating the extent of the projection for the given FOV
    lambda=fov_rads;
    phi = 0.;
    phi=0.f;
    // OpenGL: x is the vertical axes pointg downwards, and y is horizontal axes
    y = sin(phi);
    x = -sin(lambda)*cos(phi);
    z = -cos(lambda)*cos(phi);
    u = 2.*x/(-z+1.);
    v = 2.*y/(-z+1.);
    r = sqrt(u*u+v*v);
    theta = atan2(u,v);
    y=sinf(phi);
    x=-sinf(lambda)*cosf(phi);
    z=-cosf(lambda)*cosf(phi);
    u=2.f*x/(1.f-z);
    v=2.f*y/(1.f-z);
    r=hypotf(u,v);//sqrt(u*u+v*v);
    theta=atan2f(u,v);
    r*=scale;
    u = -r*sin(theta);
    v = r*cos(theta);
    x = (4.*u)/(u*u+v*v+4.);
    y = (4.*v)/(u*u+v*v+4.);
    z = (u*u+v*v-4.)/(u*u+v*v+4.);
    u=-r*sinf(theta);
    v=r*cosf(theta);
    x=(4.f*u)/(u*u+v*v+4.f);
    y=(4.f*v)/(u*u+v*v+4.f);
    z=(u*u+v*v-4.f)/(u*u+v*v+4.f);
    if (visualization=="Moebius"){
        u=x/(-z);
        v=y/(-z);
    }
    else if (visualization=="Stereographic"){
        u = 2*x/(-z+1);
        v = 2*y/(-z+1);
        u=2.f*x/(1.f-z);
        v=2.f*y/(1.f-z);
    }
    else if (visualization=="Mercator"){
        u=fov_rads;
@@ -608,7 +599,7 @@ float OpenGLCanvas::calculate_extent(float fov_rads){
        v=y/(-z);
    }
    if (visualization=="Orthographic"){
        if(z<0.){
        if(z<0.f){
            u=x;
            v=y;
        }else{
@@ -791,22 +782,21 @@ void OpenGLCanvas::wheelEvent(QWheelEvent *event){

void OpenGLCanvas::paintGL(){

    float fov_rads = (fov/360.)*CONST_PI;
    float fov_rads = (fov/360.f)*CONST_PI_F;

//    // changing scale to generate the figures for the paper (remove it after)
//    scale = 0.8;


    // defining transformation parameters (that will be passed to the vertex shader)
    float extent=calculate_extent(fov_rads);
    float vis_mode=.0;
    if (visualization=="Moebius") vis_mode=1.0;
    else if (visualization=="3D Sphere") vis_mode=2.0;
    else if (visualization=="Equi-Rectangular") vis_mode=3.0;
    else if (visualization=="Stereographic") vis_mode=4.0;
    else if (visualization=="Mercator") vis_mode=5.0;
    else if (visualization=="Zorin-Barr") vis_mode=6.0;
    else if (visualization=="Orthographic") vis_mode=7.0;
    float vis_mode=.0f;
    if (visualization=="Moebius") vis_mode=1.f;
    else if (visualization=="3D Sphere") vis_mode=2.f;
    else if (visualization=="Equi-Rectangular") vis_mode=3.f;
    else if (visualization=="Stereographic") vis_mode=4.f;
    else if (visualization=="Mercator") vis_mode=5.f;
    else if (visualization=="Zorin-Barr") vis_mode=6.f;
    else if (visualization=="Orthographic") vis_mode=7.f;
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, 2.0/extent, 0.0, 2.0/scale, 0.0, -2.0/vis_mode);