(Fwd) Problems with OpenGL conversion of distortion correction program

New Message Reply Date view Thread view Subject view Author view

parviz (parviz++at++pxp.stlaurent.sgi.com)
Tue, 9 Apr 1996 15:33:51 -0400


One of our Customer has the following problem with converting distortion
correction program to OpenGl,
any ideas??

"I modified the distortion correction demo program "hemisphere.c" that
I found on sgigate.sgi.com in the distribution file
/pub/Performer/RealityCentre/distort.tar.Z. The modification works fine
under IrisGL. I then attempted to convert the modified program to
OpenGL without much success; none of the OpenGL commands seem to draw
anything. Could you ask one of your Performer/OpenGL gurus to have a look
at the program please? I've attached copies of both the IrisGL and OpenGL
versions of the program. Running the programs requires the .flt-format
models and textures found in the distributon file. Thanks

PS - can I copy the frame buffer into a 1024x1280 texture map? I'm not
sure what the restrictions on texture map size are.

----- IrisGL version (hemisphere.c) -----

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <getopt.h> /* for cmdline handler */

#include <gl/device.h>

#include <Performer/pf.h>
#include <Performer/pfdu.h>
#include "pfutil.h"
#include "pfflt.h"
#include "gl.h"

static void CullChannel(pfChannel *, void *);
static void DrawChannel(pfChannel *, void *);
static void OpenPipeline(int, uint);
static void UpdateView(void);
static void GetGLInput(void);
static void drawDistort(void);

/*
 * structure that resides in shared memory so that the
 * application, cull, and draw processes can access it.
 */
typedef struct
{
    long exitFlag;
    pfCoord view;
    float sceneSize;
    int drawStats;
    pfChannel *chan;
} SharedData;

static SharedData *Shared;

/* light source created and updated in draw-process */

static pfLight *Sun;

/* for configuring multi-process */
static long ProcSplit = PFMP_APPCULLDRAW;

/* write out scene upon read-in - uses pfDebugPrint */
static long WriteScene = 0;

/*
* docmdline() -- use getopt to get command-line arguments,
* executed at the start of the application process.
*/

static long
docmdline(int argc, char *argv[])
{
    long opt;

    /* process command-line arguments */
    while ((opt = getopt(argc, argv, "wp:?")) != -1)
    {
        switch (opt)
        {
        case 'w':
            WriteScene = 1;
            break;
        case 'p':
            ProcSplit = atoi(optarg);
            break;
        }
    }
    return optind;
}

/*
 * main() -- program entry point. this procedure
 * is executed in the application process.
 */

int
main (int argc, char *argv[])
{
    int arg;
    int found;
    int i;
    pfNode *root;
    pfScene *scene;
    pfPipe *p;
    pfEarthSky *eSky;
    pfBox bbox;
    float far = 40000.0f;
    pfVec3 xyz, hpr;
    pfPipeWindow* pw;

    arg = docmdline(argc, argv);

    pfInit();

    /* configure multi-process selection */
    pfMultiprocess(ProcSplit);

    /* allocate shared before fork()'ing parallel processes */
    Shared = (SharedData*)pfMalloc(sizeof(SharedData), pfGetSharedArena());
    Shared->exitFlag = 0;
    Shared->drawStats = 0;

    /* initiate multi-processing mode set in pfMultiprocess call */
    pfConfig();

    scene = pfNewScene();

    /* specify directories where geometry and textures exist */
    if (!(getenv("PFPATH")))
        pfFilePath(".");

    /* load files named by command line arguments */
    for (found = 0; arg < argc; arg++)
    {
        if ((root = pfdLoadFile(argv[arg])) != NULL)
        {
            pfAddChild(scene, root);
            found++;
        }
    }

    /* if no files successfully loaded, terminate program */
    if (!found) exit(0);

    p = pfGetPipe(0);
    pfPhase(PFPHASE_FREE_RUN);

    /* Open and configure full screen GL window. */
    pw = pfNewPWin(pfGetPipe(0));
    /* pfPWinOriginSize(pw,0,0,511,511); */
    pfPWinOriginSize(pw,0,0,1024,1024);
    pfPWinName(pw,"IRIS Performer");
    pfOpenPWin(pw);
    pfStageConfigFunc( -1, PFPROC_DRAW, OpenPipeline );
    pfConfigStage( -1, PFPROC_DRAW );
    pfFrame();

    pfFrameRate(30.0f);

    Shared->chan = pfNewChan(p);

    pfChanTravFunc(Shared->chan, PFTRAV_CULL, CullChannel );
    pfChanTravFunc(Shared->chan, PFTRAV_DRAW, DrawChannel );
    pfChanScene(Shared->chan, scene);
    pfChanNearFar(Shared->chan, 0.1f, far);
/* window(-2.5, 2.5, -1.05, 1.05, 1.0, 100.0);*/
    pfChanFOV(Shared->chan, 136.0f, 92.5f);

/* 512 x 512 */

    pfChanViewport( Shared->chan, 0.0, 1.0, 0.000, 1.0 );

/* 256 x 256
    pfChanViewport( Shared->chan, 0.0, .5, 0.000, 0.5 );
*/

    pfSetVec3(xyz, 0.0f, 0.0f, 0.0f);
    pfSetVec3(hpr, 0.0f, 45.0f, 0.0f);
    pfChanViewOffsets(Shared->chan, xyz, hpr);

    /* Create an earth/sky model that draws sky/ground/horizon */

    eSky = pfNewESky();
    pfESkyMode(eSky, PFES_BUFFER_CLEAR, PFES_FAST);
    pfChanESky(Shared->chan, eSky);

    pfChanLODAttr( Shared->chan, PFLOD_SCALE, 0.125 );

    /* main simulation loop */

    while (!Shared->exitFlag)
    {
        /* wait until next frame boundary */
        pfSync();

        /* Set view parameters. */
        UpdateView();
        pfChanView(Shared->chan, Shared->view.xyz, Shared->view.hpr);

        /* initiate traversal using current state */
        pfFrame();
    }

    /* terminate cull and draw processes (if they exist) */
    pfExit();

    /* exit to operating system */
    exit(0);
}

/*
 * UpdateView() updates the eyepoint based on the information
 * placed in shared memory by GetGLInput().
 */
static void
UpdateView(void)
{
    static float speed = 0.0f;
    pfCoord *view = &Shared->view;

    /* update view direction */
    view->hpr[PF_H] = 0.0;
    view->hpr[PF_P] ++; /*= 0.0;*/
    view->hpr[PF_R] = 0.0;

    /* update view position */

    view->xyz[PF_X] = 0.0;
    view->xyz[PF_Y] = 0.0;
    view->xyz[PF_Z] = 50.0;
/* view->xyz[PF_X] = 15023;
    view->xyz[PF_Y] = -7199.4;
    view->xyz[PF_Z] = -204.7 + 1000;
    */
}

/*
 * OpenPipeline() -- create a pipeline: setup the window system,
 * the IRIS GL, and IRIS Performer. this procedure is executed in
 * the draw process (when there is a separate draw process).
 */

static void
OpenPipeline(int pipe, uint stage )
{
    float xSize = 800;
    float ySize = 500;

    /* register events of note with event-queue manager */
    qdevice(ESCKEY);
    qdevice(F1KEY);

    /* negotiate with GL */
    gconfig();

    /* create a light source in the "south-west" (QIII) */
    Sun = pfNewLight(NULL);
    pfLightPos(Sun, -0.3f, -0.3f, 1.0f, 0.0f);

    /* create a default texture environment */
    pfApplyTEnv(pfNewTEnv(NULL));

    /* create a default lighting model */
    pfApplyLModel(pfNewLModel(NULL));

    pfApplyMtl(pfNewMtl(NULL));

    /* enable culling of back-facing polygons */
    pfCullFace(PFCF_BACK);

    /*
     * These enables should be set to reflect the majority of the
     * database. If most geometry is not textured, then texture
     * should be disabled. However, you then need to change the
     * FLIGHT-format file reader. (pfflt.c)
     */
    pfEnable(PFEN_TEXTURE);
    pfDisable(PFEN_WIREFRAME);
    pfDisable(PFEN_LIGHTING);
    pfDisable(PFEN_FOG);
}

/*
 * CullChannel() -- traverse the scene graph and generate a
 * display list for the draw process. This procedure is
 * executed in the cull process.
 */

static void
CullChannel(pfChannel *channel, void *data)
{
    pfCull();
}

static void
DrawChannel (pfChannel *channel, void *data)
{

    /* rebind light so it stays fixed in position */
    pfLightOn(Sun);

    /* erase framebuffer and draw Earth-Sky model */
    pfClearChan(channel);

    /* invoke Performer draw-processing for this frame */
    pfDraw();

    /* draw Performer throughput statistics */
    if (Shared->drawStats)
        pfDrawChanStats(channel);

    GetGLInput();
    drawDistort();
}

static void
GetGLInput(void)
{

    while (qtest())
    {
        short value;
        long device = qread(&value);

        /* only act on key-down transitions */
        if (value)
        {
            switch (device)
            {
                /* ESC-key signals end of simulation */
            case ESCKEY:
                Shared->exitFlag = 1;
                break;

                /* F1-key toggles channel-stats display */
            case F1KEY:
                Shared->drawStats = !Shared->drawStats;
                break;
            }
        }
    }
}

#include "newuvarray.h"

float texprops[] = { TX_MAGFILTER, TX_BILINEAR,
                        TX_MINFILTER, TX_BILINEAR,
                        TX_WRAP, TX_REPEAT,
                        TX_INTERNAL_FORMAT, TX_RGB_5,
                        TX_FAST_DEFINE, TX_NULL};

Matrix ident = { 1.,0.,0.,0.,
                  0.,1.,0.,0.,
                  0.,0.,1.,0.,
                  0.,0.,0.,1.};

static void
drawDistort(void)
{

    static unsigned long map[1024 * 1024], flags;
    static int first = 1;
    int i, j;
    float vert[2];
    float tvert[2];

    if(first)
    {
        texdef2d(1024, 3, 1024, 1024, map, 10, texprops);
        first = 0;
    }

    viewport( 0, 1023, 0 , 1023);
    texbind(TX_TEXTURE_0, 1024);
    fbsubtexload(0, 0, TX_TEXTURE_0, 1024, 0.0, 1.0, 0.0, 1.0, flags);

    ortho2(0.0, 16.0, 0.0, 16.0);
    loadmatrix(ident);

    zbuffer(0);
    backface(0);

    cpack(0xffffffff);

    for( i = 0; i < 16; i++) /* sixteen tmesh strips */
    {
        float yup, ydown;
        int tindexup, tindexdown;

        ydown = (float) (i);
        yup = (float) (i + 1);
        tindexdown = i * 17;
        tindexup = (i + 1) * 17;

        bgntmesh();

        tvert[0] = uvarray[tindexdown][0];
        tvert[1] = uvarray[tindexdown][1];
        t2f (tvert);
        vert[0] = 0.0;
        vert[1] = ydown;
        v2f (vert);

        tvert[0] = uvarray[tindexup][0];
        tvert[1] = uvarray[tindexup][1];
        t2f (tvert);
        vert[1] = yup;
        v2f (vert);

        for (j = 1; j < 17; j ++) {
            tvert[0] = uvarray[tindexdown + j][0];
            tvert[1] = uvarray[tindexdown + j][1];
            t2f (tvert);
            vert[0] = (float) (j);
            vert[1] = ydown;
            v2f (vert);

            tvert[0] = uvarray[tindexup + j][0];
            tvert[1] = uvarray[tindexup + j][1];
            t2f (tvert);
            vert[1] = yup;
            v2f (vert);
        }

        endtmesh();
    }

    zbuffer(1);
}

----- Makefile for hemisphere.c -----

OPT = -g
LFLAGS = \
                -lpfdu_igl \
                -lpfutil_igl \
                -lpf_igl \
                -lmpc -limage -lgl -lX11 -lm -lfpe -lC

CFLAGS = -c \
                -DIRISGL \
                -I/home/camus2/Performer/include/Performer/pfdb \
                -I/home/camus2/Performer/include/Performer

OBJS = hemisphere.o

ALL = hemisphere

$(ALL): $(OBJS)
        $(CC) $(OPT) $(OBJS) -o $(ALL) $(LFLAGS)
        ++at++echo "DONE"

.c.o:
        $(CC) $(OPT) $(CFLAGS) $<

----- OpenGL version (hemiGL.c) -----

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <getopt.h> /* for cmdline handler */

#include <Performer/pf.h>
#include <Performer/pfdu.h>
#include "pfutil.h"
#include "pfflt.h"
#include "gl.h"

static void CullChannel(pfChannel *, void *);
static void DrawChannel(pfChannel *, void *);
static void OpenPipeline(int, uint);
static void UpdateView(void);
static void drawDistort(void);

/*
 * structure that resides in shared memory so that the
 * application, cull, and draw processes can access it.
 */
typedef struct
{
    long exitFlag;
    pfCoord view;
    float sceneSize;
    int drawStats;
    pfChannel *chan;
} SharedData;

static SharedData *Shared;

/* light source created and updated in draw-process */

static pfLight *Sun;

/* for configuring multi-process */
static long ProcSplit = PFMP_APPCULLDRAW;

/* write out scene upon read-in - uses pfDebugPrint */
static long WriteScene = 0;

/*
* docmdline() -- use getopt to get command-line arguments,
* executed at the start of the application process.
*/

static long
docmdline(int argc, char *argv[])
{
    long opt;

    /* process command-line arguments */
    while ((opt = getopt(argc, argv, "wps:?")) != -1)
    {
        switch (opt)
        {
        case 'w':
            WriteScene = 1;
            break;
        case 'p':
            ProcSplit = atoi(optarg);
            break;
        case 's':
            Shared->drawStats = 1;
            break;
        }
    }
    return optind;
}

/*
 * main() -- program entry point. this procedure
 * is executed in the application process.
 */

int
main (int argc, char *argv[])
{
    int arg;
    int found;
    int i;
    pfNode *root;
    pfScene *scene;
    pfPipe *p;
    pfEarthSky *eSky;
    pfBox bbox;
    float far = 40000.0f;
    pfVec3 xyz, hpr;
    pfPipeWindow* pw;

    pfInit();

    /* allocate shared before fork()'ing parallel processes */
    Shared = (SharedData*)pfMalloc(sizeof(SharedData), pfGetSharedArena());
    Shared->exitFlag = 0;
    Shared->drawStats = 0;
    arg = docmdline(argc, argv);

    /* configure multi-process selection */
    pfMultiprocess(ProcSplit);

    /* initiate multi-processing mode set in pfMultiprocess call */
    pfConfig();

    scene = pfNewScene();

    /* specify directories where geometry and textures exist */
    if (!(getenv("PFPATH")))
        pfFilePath(".");

    /* load files named by command line arguments */
    for (found = 0; arg < argc; arg++)
    {
        if ((root = pfdLoadFile(argv[arg])) != NULL)
        {
            pfAddChild(scene, root);
            found++;
        }
    }

    /* if no files successfully loaded, terminate program */
    if (!found) exit(0);

    p = pfGetPipe(0);
    pfPhase(PFPHASE_FREE_RUN);

    /* Open and configure full screen GL window. */
    pw = pfNewPWin(pfGetPipe(0));
    pfPWinOriginSize(pw,0,0,1024,1024);
    pfPWinName(pw,"IRIS Performer");
    pfOpenPWin(pw);
    pfStageConfigFunc( -1, PFPROC_DRAW, OpenPipeline );
    pfConfigStage( -1, PFPROC_DRAW );
    pfFrame();

    pfFrameRate(30.0f);

    Shared->chan = pfNewChan(p);

    pfChanTravFunc(Shared->chan, PFTRAV_CULL, CullChannel );
    pfChanTravFunc(Shared->chan, PFTRAV_DRAW, DrawChannel );
    pfChanScene(Shared->chan, scene);
    pfChanNearFar(Shared->chan, 0.1f, far);
    pfChanFOV(Shared->chan, 136.0f, 92.5f);

    pfChanViewport( Shared->chan, 0.0, 1.0, 0.000, 1.0 );

    pfSetVec3(xyz, 0.0f, 0.0f, 0.0f);
    pfSetVec3(hpr, 0.0f, 45.0f, 0.0f);
    pfChanViewOffsets(Shared->chan, xyz, hpr);

    /* Create an earth/sky model that draws sky/ground/horizon */

    eSky = pfNewESky();
    pfESkyMode(eSky, PFES_BUFFER_CLEAR, PFES_FAST);
    pfChanESky(Shared->chan, eSky);

    pfChanLODAttr( Shared->chan, PFLOD_SCALE, 0.125 );

    /* main simulation loop */

    while (!Shared->exitFlag)
    {
        /* wait until next frame boundary */
        pfSync();

        /* Set view parameters. */
        UpdateView();
        pfChanView(Shared->chan, Shared->view.xyz, Shared->view.hpr);

        /* initiate traversal using current state */
        pfFrame();
    }

    /* terminate cull and draw processes (if they exist) */
    pfExit();

    /* exit to operating system */
    exit(0);
}

/*
 * UpdateView() updates the eyepoint based on the information
 * placed in shared memory by GetGLInput().
 */
static void
UpdateView(void)
{
    static float speed = 0.0f;
    pfCoord *view = &Shared->view;

    /* update view direction */
    view->hpr[PF_H] = 0.0;
    view->hpr[PF_P] ++; /*= 0.0;*/
    view->hpr[PF_R] = 0.0;

    /* update view position */

    view->xyz[PF_X] = 0.0;
    view->xyz[PF_Y] = 0.0;
    view->xyz[PF_Z] = 50.0;
/* view->xyz[PF_X] = 15023;
    view->xyz[PF_Y] = -7199.4;
    view->xyz[PF_Z] = -204.7 + 1000;
    */
}

/*
 * OpenPipeline() -- create a pipeline: setup the window system,
 * the IRIS GL, and IRIS Performer. this procedure is executed in
 * the draw process (when there is a separate draw process).
 */

static void
OpenPipeline(int pipe, uint stage )
{
    float xSize = 800;
    float ySize = 500;

    /* negotiate with GL */
    /* gconfig(); */

    /* create a light source in the "south-west" (QIII) */
    Sun = pfNewLight(NULL);
    pfLightPos(Sun, -0.3f, -0.3f, 1.0f, 0.0f);

    /* create a default texture environment */
    pfApplyTEnv(pfNewTEnv(NULL));

    /* create a default lighting model */
    pfApplyLModel(pfNewLModel(NULL));

    pfApplyMtl(pfNewMtl(NULL));

    /* enable culling of back-facing polygons */
    pfCullFace(PFCF_BACK);

    /*
     * These enables should be set to reflect the majority of the
     * database. If most geometry is not textured, then texture
     * should be disabled. However, you then need to change the
     * FLIGHT-format file reader. (pfflt.c)
     */
    pfEnable(PFEN_TEXTURE);
    pfDisable(PFEN_WIREFRAME);
    pfDisable(PFEN_LIGHTING);
    pfDisable(PFEN_FOG);
}

/*
 * CullChannel() -- traverse the scene graph and generate a
 * display list for the draw process. This procedure is
 * executed in the cull process.
 */

static void
CullChannel(pfChannel *channel, void *data)
{
    pfCull();
}

static void
DrawChannel (pfChannel *channel, void *data)
{

    /* rebind light so it stays fixed in position */
    pfLightOn(Sun);

    /* erase framebuffer and draw Earth-Sky model */
    pfClearChan(channel);

    /* invoke Performer draw-processing for this frame */
    pfDraw();

    /* draw Performer throughput statistics */
    if (Shared->drawStats)
        pfDrawChanStats(channel);

    drawDistort(channel);
}

#include "newuvarray.h"

/* float texprops[] = { TX_MAGFILTER, TX_BILINEAR,
                        TX_MINFILTER, TX_BILINEAR,
                        TX_WRAP, TX_REPEAT,
                        TX_INTERNAL_FORMAT, TX_RGB_5,
                        TX_FAST_DEFINE, TX_NULL}; */

static void
drawDistort(void)
{

    static unsigned long map[1024 * 1024], flags;
    static int first = 1;
    int i, j;
    float vert[2];
    float tvert[2];

    if(first)
    {
        glEnable (GL_TEXTURE_2D);
        first = 0;
    }
    /* texdef2d(1024, 3, 1024, 1024, map, 10, texprops); */

    glTexImage2D (
        GL_TEXTURE_2D, 0, 3, 512, 512, 0, GL_RGB, GL_UNSIGNED_INT, map
    );
    glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

    glViewport( 0, 0, 1024, 1024);
    /* texbind(TX_TEXTURE_0, 1024);
    fbsubtexload(0, 0, TX_TEXTURE_0, 1024, 0.0, 1.0, 0.0, 1.0, flags); */
    /* glCopyTexImage2DEXT (...); */ /* Don't know arguments yet */

    gluOrtho2D(0.0, 16.0, 0.0, 16.0);
    glLoadIdentity();

    glDisable(GL_DEPTH_TEST); /* turn off z-buffer */
    glDisable(GL_CULL_FACE); /* turn off culling */

    glColor4f (1.0, 1.0, 1.0, 1.0);

    for( i = 0; i < 16; i++) /* sixteen tmesh strips */
    {
        float yup, ydown;
        int tindexup, tindexdown;

        ydown = (float) (i);
        yup = (float) (i + 1);
        tindexdown = i * 17;
        tindexup = (i + 1) * 17;

        glBegin(GL_TRIANGLE_STRIP);

        tvert[0] = uvarray[tindexdown][0];
        tvert[1] = uvarray[tindexdown][1];
        glTexCoord2fv (tvert);
        vert[0] = 0.0;
        vert[1] = ydown;
        glVertex2fv (vert);

        tvert[0] = uvarray[tindexup][0];
        tvert[1] = uvarray[tindexup][1];
        glTexCoord2fv (tvert);
        vert[1] = yup;
        glVertex2fv (vert);

        for (j = 1; j < 17; j ++) {
            tvert[0] = uvarray[tindexdown + j][0];
            tvert[1] = uvarray[tindexdown + j][1];
            glTexCoord2fv (tvert);
            vert[0] = (float) (j);
            vert[1] = ydown;
            glVertex2fv (vert);

            tvert[0] = uvarray[tindexup + j][0];
            tvert[1] = uvarray[tindexup + j][1];
            glTexCoord2fv (tvert);
            vert[1] = yup;
            glVertex2fv (vert);
        }

        glEnd();
    }

    glEnable (GL_DEPTH_TEST); /* turn the z-buffer back on */
}

----- Makefile for hemiGL.c -----

OPT = -g
LFLAGS = \
                -lpfdu_ogl \
                -lpfutil_ogl \
                -lpf_ogl \
                -lmpc -limage -lGL -lX11 -lm -lfpe -lC

CFLAGS = -c \
                -I/home/camus2/Performer/include/Performer/pfdb \
                -I/home/camus2/Performer/include/Performer

OBJS = hemiGL.o

ALL = hemiGL

$(ALL): $(OBJS)
        $(CC) $(OPT) $(OBJS) -o $(ALL) $(LFLAGS)
        ++at++echo "DONE"

.c.o:
        $(CC) $(OPT) $(CFLAGS) $<

----- newuvarray.h (for both versions) -----

float uvarray[289][2] = {
0.067185, 0.080706,
0.174310, 0.155577,
0.250074, 0.203457,
0.308217, 0.235680,
0.355695, 0.257851,
0.396468, 0.273009,
0.433026, 0.282886,
0.467093, 0.288472,
0.500000, 0.290281,
0.532907, 0.288472,
0.566974, 0.282886,
0.603532, 0.273009,
0.644305, 0.257851,
0.691783, 0.235680,
0.749926, 0.203457,
0.825690, 0.155577,
0.932815, 0.080706,
0.067185, 0.150102,
0.174310, 0.212581,
0.250074, 0.252537,
0.308217, 0.279427,
0.355695, 0.297929,
0.396468, 0.310577,
0.433026, 0.318820,
0.467093, 0.323481,
0.500000, 0.324991,
0.532907, 0.323481,
0.566974, 0.318820,
0.603532, 0.310577,
0.644305, 0.297929,
0.691783, 0.279427,
0.749926, 0.252537,
0.825690, 0.212581,
0.932815, 0.150102,
0.067185, 0.211489,
0.174310, 0.263007,
0.250074, 0.295953,
0.308217, 0.318125,
0.355695, 0.333381,
0.396468, 0.343811,
0.433026, 0.350607,
0.467093, 0.354451,
0.500000, 0.355695,
0.532907, 0.354451,
0.566974, 0.350607,
0.603532, 0.343811,
0.644305, 0.333381,
0.691783, 0.318125,
0.749926, 0.295953,
0.825690, 0.263007,
0.932815, 0.211489,
0.067185, 0.266976,
0.174310, 0.308586,
0.250074, 0.335195,
0.308217, 0.353104,
0.355695, 0.365425,
0.396468, 0.373849,
0.433026, 0.379338,
0.467093, 0.382443,
0.500000, 0.383448,
0.532907, 0.382443,
0.566974, 0.379338,
0.603532, 0.373849,
0.644305, 0.365425,
0.691783, 0.353104,
0.749926, 0.335195,
0.825690, 0.308586,
0.932815, 0.266976,
0.067185, 0.318114,
0.174310, 0.350593,
0.250074, 0.371363,
0.308217, 0.385341,
0.355695, 0.394958,
0.396468, 0.401534,
0.433026, 0.405818,
0.467093, 0.408241,
0.500000, 0.409026,
0.532907, 0.408241,
0.566974, 0.405818,
0.603532, 0.401534,
0.644305, 0.394958,
0.691783, 0.385341,
0.749926, 0.371363,
0.825690, 0.350593,
0.932815, 0.318114,
0.067185, 0.366098,
0.174310, 0.390008,
0.250074, 0.405298,
0.308217, 0.415589,
0.355695, 0.422669,
0.396468, 0.427510,
0.433026, 0.430664,
0.467093, 0.432448,
0.500000, 0.433026,
0.532907, 0.432448,
0.566974, 0.430664,
0.603532, 0.427510,
0.644305, 0.422669,
0.691783, 0.415589,
0.749926, 0.405298,
0.825690, 0.390008,
0.932815, 0.366098,
0.067185, 0.411884,
0.174310, 0.427618,
0.250074, 0.437680,
0.308217, 0.444452,
0.355695, 0.449111,
0.396468, 0.452297,
0.433026, 0.454373,
0.467093, 0.455547,
0.500000, 0.455927,
0.532907, 0.455547,
0.566974, 0.454373,
0.603532, 0.452297,
0.644305, 0.449111,
0.691783, 0.444452,
0.749926, 0.437680,
0.825690, 0.427618,
0.932815, 0.411884,
0.067185, 0.456279,
0.174310, 0.464086,
0.250074, 0.469079,
0.308217, 0.472439,
0.355695, 0.474750,
0.396468, 0.476331,
0.433026, 0.477361,
0.467093, 0.477943,
0.500000, 0.478132,
0.532907, 0.477943,
0.566974, 0.477361,
0.603532, 0.476331,
0.644305, 0.474750,
0.691783, 0.472439,
0.749926, 0.469079,
0.825690, 0.464086,
0.932815, 0.456279,
0.067185, 0.500000,
0.174310, 0.500000,
0.250074, 0.500000,
0.308217, 0.500000,
0.355695, 0.500000,
0.396468, 0.500000,
0.433026, 0.500000,
0.467093, 0.500000,
0.500000, 0.500000,
0.532907, 0.500000,
0.566974, 0.500000,
0.603532, 0.500000,
0.644305, 0.500000,
0.691783, 0.500000,
0.749926, 0.500000,
0.825690, 0.500000,
0.932815, 0.500000,
0.067185, 0.543721,
0.174310, 0.535914,
0.250074, 0.530921,
0.308217, 0.527561,
0.355695, 0.525250,
0.396468, 0.523669,
0.433026, 0.522639,
0.467093, 0.522057,
0.500000, 0.521868,
0.532907, 0.522057,
0.566974, 0.522639,
0.603532, 0.523669,
0.644305, 0.525250,
0.691783, 0.527561,
0.749926, 0.530921,
0.825690, 0.535914,
0.932815, 0.543721,
0.067185, 0.588116,
0.174310, 0.572382,
0.250074, 0.562320,
0.308217, 0.555548,
0.355695, 0.550889,
0.396468, 0.547703,
0.433026, 0.545627,
0.467093, 0.544453,
0.500000, 0.544073,
0.532907, 0.544453,
0.566974, 0.545627,
0.603532, 0.547703,
0.644305, 0.550889,
0.691783, 0.555548,
0.749926, 0.562320,
0.825690, 0.572382,
0.932815, 0.588116,
0.067185, 0.633902,
0.174310, 0.609992,
0.250074, 0.594702,
0.308217, 0.584411,
0.355695, 0.577331,
0.396468, 0.572490,
0.433026, 0.569336,
0.467093, 0.567552,
0.500000, 0.566974,
0.532907, 0.567552,
0.566974, 0.569336,
0.603532, 0.572490,
0.644305, 0.577331,
0.691783, 0.584411,
0.749926, 0.594702,
0.825690, 0.609992,
0.932815, 0.633902,
0.067185, 0.681886,
0.174310, 0.649407,
0.250074, 0.628637,
0.308217, 0.614659,
0.355695, 0.605042,
0.396468, 0.598466,
0.433026, 0.594182,
0.467093, 0.591759,
0.500000, 0.590974,
0.532907, 0.591759,
0.566974, 0.594182,
0.603532, 0.598466,
0.644305, 0.605042,
0.691783, 0.614659,
0.749926, 0.628637,
0.825690, 0.649407,
0.932815, 0.681886,
0.067185, 0.733024,
0.174310, 0.691414,
0.250074, 0.664805,
0.308217, 0.646896,
0.355695, 0.634575,
0.396468, 0.626151,
0.433026, 0.620662,
0.467093, 0.617557,
0.500000, 0.616552,
0.532907, 0.617557,
0.566974, 0.620662,
0.603532, 0.626151,
0.644305, 0.634575,
0.691783, 0.646896,
0.749926, 0.664805,
0.825690, 0.691414,
0.932815, 0.733024,
0.067185, 0.788511,
0.174310, 0.736993,
0.250074, 0.704047,
0.308217, 0.681875,
0.355695, 0.666619,
0.396468, 0.656189,
0.433026, 0.649393,
0.467093, 0.645549,
0.500000, 0.644305,
0.532907, 0.645549,
0.566974, 0.649393,
0.603532, 0.656189,
0.644305, 0.666619,
0.691783, 0.681875,
0.749926, 0.704047,
0.825690, 0.736993,
0.932815, 0.788511,
0.067185, 0.849898,
0.174310, 0.787419,
0.250074, 0.747463,
0.308217, 0.720573,
0.355695, 0.702071,
0.396468, 0.689423,
0.433026, 0.681180,
0.467093, 0.676519,
0.500000, 0.675009,
0.532907, 0.676519,
0.566974, 0.681180,
0.603532, 0.689423,
0.644305, 0.702071,
0.691783, 0.720573,
0.749926, 0.747463,
0.825690, 0.787419,
0.932815, 0.849898,
0.067185, 0.919294,
0.174310, 0.844423,
0.250074, 0.796543,
0.308217, 0.764320,
0.355695, 0.742149,
0.396468, 0.726991,
0.433026, 0.717114,
0.467093, 0.711528,
0.500000, 0.709719,
0.532907, 0.711528,
0.566974, 0.717114,
0.603532, 0.726991,
0.644305, 0.742149,
0.691783, 0.764320,
0.749926, 0.796543,
0.825690, 0.844423,
0.932815, 0.919294
};

"

-- 
Regards

Parviz Parandeh SE , Montreal Canada parviz++at++stlaurent.sgi.com Voice mail: 58479 Tel: 514-745-2440 Fax: 514-745-2660


New Message Reply Date view Thread view Subject view Author view

This archive was generated by hypermail 2.0b2 on Mon Aug 10 1998 - 17:52:41 PDT

This message has been cleansed for anti-spam protection. Replace '++at++' in any mail addresses with the '@' symbol.