Thursday, February 3, 2011

Bezier surface without using Evaluators OpenGl

Hi all,
This is my first post that contains some actual code. I wont provide the entire code for any of the posts, as it will be a spoon feeding. I will off-course give substantial part of it. (And to much extent with any optimizations, leaving them to the imagination of the user :))

We will use DeCasteljau Algorithm algorithm to draw the surface.The similar code using evaluators is available in Red Book Chapter 13.

Before going onto the code please learn a bit of opengl, as i will only explain how to calculate the points.

GLfloat ctrlpoints[4][4][3];
//set the control points as u wish, 4 sets, 4 points each, x, y, z
int LOD=20;
//increase or decrease this (may be using +/-) to increase 
number of curves making the surface
/* simple linear interpolation between two points
in three dimension*/
void lerp (GLfloat dest[], GLfloat a[], GLfloat b[], float t)
    { 
        dest[0] = a[0] + (b[0]-a[0])*t;
        dest[1] = a[1] + (b[1]-a[1])*t;
        dest[2] = a[2] + (b[2]-a[2])*t;
    }

// evaluate a point on a bezier-curve. t goes from 0 to 1.0    
void bezier (GLfloat dest[],GLfloat a[],GLfloat b[],
             GLfloat c[],GLfloat d[], float t)
    { 
        GLfloat ab[3],bc[3],cd[3],abbc[3],bccd[3];
        lerp (ab, a,b,t);           // point between a and b 
        lerp (bc, b,c,t);           // point between b and c 
        lerp (cd, c,d,t);           // point between c and d 
        lerp (abbc, ab,bc,t);       // point between ab and bc 
        lerp (bccd, bc,cd,t);       // point between bc and cd 
        lerp (dest, abbc,bccd,t);   // point on the bezier-curve 
    }
/*
Given u and v, compute a point on the surface
*/
void eval(GLfloat dest[],float u,float v,GLfloat pnts[4][4][3])
    {
        GLfloat Q[4][3];
        for(int i=0;i<4;i++)
            {
                bezier(Q[i],pnts[i][0],pnts[i][1],pnts[i][2],pnts[i][3],u);
            }
        bezier(dest,Q[0],Q[1],Q[2],Q[3],v);
    }
/*
For orthogonal lines, change we need column vise points
This function find transpose of the matrix
*/
void get_vertical(GLfloat dest[4][4][3])
    {
        for(int i=0;i<4;i++)//ith column
            {
                for(int j=0;j<4;j++)//row
                    {
                        for(int k=0;k<3;k++)//elem
                            {
                                dest[i][j][k]=ctrlpoints[j][i][k];
                            }
                    }
            }
    }


void display()
{
/*
Intialization etc code here
*/

/*
Compute using algo
Plot them using GL_LINE_STRIP to get a smooth line, instead of discrete points
*/
for(int i=0;i<LOD;i++)
            {
                float u = (float)i/(LOD-1);
                glBegin(GL_LINE_STRIP);
                for(int j=0;j<LOD;j++)
                    {
                        float v = (float)j/(LOD-1);
                        GLfloat p[3];
                        eval(p,u,v,ctrlpoints);
                        
                        glVertex3fv(p);
                        
                    }
                glEnd();
            }
            
        GLfloat dest[4][4][3];
        get_vertical(dest);

        for(int i=0;i<LOD;i++)
            {
                float u = (float)i/(LOD-1);
                glBegin(GL_LINE_STRIP);
                for(int j=0;j<LOD;j++)
                    {
                        float v = (float)j/(LOD-1);
                        GLfloat p[3];
                        eval(p,u,v,dest);
                        
                        glVertex3fv(p);
                        
                    }
                glEnd();
            }
/*
Swapping buffer etc code goes here

*/
}

Saturday, January 29, 2011

How to Add code snippets to blogger ??

This is my first post with something interesting. Although many such posts exist out there, i made a collection of those to make things easy for myself and the guys out there.

I prefer SyntaxHighlighter, a open source project hosted at code.google.com.Or now hosted at http://alexgorbatchev.com/SyntaxHighlighter/

After you've checked out the the source code, or downloaded a package (Might be outdated, as compared to trunk) from somewhere, its time to add them to blogger.
Its better if you checkout the latest trunk.

Now you need to host the source files somewhere, I am using my google sites  for this job. We can as well use the code.google.com itself, but the directory structure might change in the future, leaving your blog in a bad look.

Anyways getting to the point, there are some javascript (.js) files in the code (See Scripts Folder e.g. shBrushCpp.js etc). Each of this script is for a particular language(Cpp for c++ , vb for visual basic etc), so u might want all of them or just few depending on your needs. Use as minimum as required, as javascript can take some time to load.

Apart from these language specific files, you need to use shCore.js . Also You need the SyntaxHighlighter.css which defines all the classes for our use. and other file clipboard.swf .

Upload these files to your webhost (or google sites for that matter).


Now add the following snippet before </body>  tag. 
Add you domain name to the to the links before moving on.

Example program in c++ ,


int main()
  {
    printf("Hello World !");
    return 0;
  }

Friday, January 28, 2011

Introduction

Hi All,

Some of you might be returning visitors from http://blog.gunjanbansal.in (Computers and Technology). This is my new blog were i will "try" to hone my programming skills as well as give hints to people. I am not the best programmer out there, but sure I'll try my very best to be. Hope I succeed. Please add a comment to a post if you feel something is not as its supposed to be. I will update it within a day or two. Drop me a mail if i miss.