View Full Version : OpenGl parsing

12-01-2011, 02:52 PM
How would you pass an equation to OpenGl.

d1=0 to 360

str x = "c1*s1*cos(log(d1*r1*c1)*s1)"

how could you hand string x to GL?
What i'm doing now is using a slow parser to get the result of the string and passing the result to the GL_List.

carsten neumann
12-01-2011, 03:19 PM
You can not pass equations to OpenGL, it only deals with graphic primitives (triangles, lines, points) for which you specify attributes (positions, normals, etc.).
If you have a parametric description of a surface you can evaluate and use the resulting positions to render a graphical representation of the surface.

In the same way it is not possible to pass strings to OpenGL. There are libraries that can render text using OpenGL or you can code that functionality yourself.

GL_List is not the name of any type that is part of the OpenGL API, are you sure you want to use OpenGL and are not dealing with some other library that uses the (upper case) GL prefix?

12-01-2011, 04:04 PM
What I want it to do is; allow the user to enter the formula and then plot it in OpenGL.

Maybe I should put it in as a Feature_Request?
Heres a sample.

'Written in FreeBasic.023 for windows
'to get latest version:
'For a real easy to use Integrated Development Enviroment. FBIDE
'Begin code
#include once "GL/gl.bi"
#include once "GL/glu.bi"

'console printed instructioins.
screen 0
print "Press Esc to EXIT"
print "-----------------------------------------"
print "Press Space-bar to stop all motion "
print "-----------------------------------------"
print "Left , Right Arrows to rotate on X - Axis"
print " Up , Down Arrows to rotate on Y - Axis"
print " R_Shft to reset U/D , L/R rotate values "
print "-----------------------------------------"
print " (+) , (-) , (Enter) to control spin "
print " (Q) , (W) , (E) to control zoom level "
print " (A) , (S) , (D) to control U/D shift "
print " (Z) , (X) , (C) to control L/R shift "
print " (R) , (T) to control RED LEVEL "
print " (F) , (G) to control GREEN LEVEL "
print " (V) , (B) to control BLUE LEVEL "
print "-----------------------------------------";

'for general trig looping and values
dim as double r1 = atn(1)/90
dim as double d1
dim as double deg1_start = 0
dim as double deg1_end = 360
dim as double deg1_inc = 1
dim as double r2 = atn(1)/45
dim as double d2
dim as double deg2_start = 0
dim as double deg2_end = 360
dim as double deg2_inc = .5
dim as double c1
dim as double c2
dim as double s1
dim as double s2

dim as double out_x
dim as double out_y
dim as double out_z

dim as integer xres,yres
windowtitle "Abstract-147"
screen 19
screeninfo xres,yres
Screenres xres,yres,32,1,2

' create and compile a OpenGL list
dim as integer glList = glGenLists(1)
glNewList(glList, GL_COMPILE)

For d1 = deg1_start To deg1_end Step deg1_inc


For d2 = deg2_start To deg2_end Step deg2_inc


dim as single x : x =(c1*cos(cos(d2*r2)*s2/c1))*2

dim as single y : y =(s1*sin(sin(d2*r2)*c2/s1))*2

dim as single z : z = c2+s2

glvertex3f x , y , z

Next d2

Next d1

'================================================= ==============================
'================================================= ==============================
gluPerspective 18 , xres/yres , .1, 500
glBlendfunc GL_SRC_ALPHA, GL_ONE
glPointsize 1
glEnable gl_blend

'for OpenGl transition,rotation
dim as single xt, yt, zt=-15 'transition variables
dim as single xr, yr, zr 'rotation variables
dim as single xrs=.5,yrs=.5,zrs=.5' transitions of camera
dim as ubyte red= 150, green=75, blue=25

dim as ubyte status=1
DO WHILE status=1


gltranslatef xt, yt, zt
glrotatef xr, 1, 0, 0
glrotatef yr, 0, 1, 0
glrotatef zr, 0, 0, 1

' draw the list
glColor3ub red,green,blue
glCallList glList


'check for keys being pressed
if multikey(&h01) then status = 0 ' esc key to quit

xrs = xrs + (multikey(&h50)/10) - (multikey(&h48)/10) 'left & right arrows
yrs = yrs + (multikey(&h4D)/10) - (multikey(&h4B)/10) 'up & down arrows
zrs = zrs + (multikey(&h0C)/10) - (multikey(&h4E)/10) 'plus & minus on the keypad

xr = xr - xrs
yr = yr - yrs
zr = zr - zrs

zt = zt + ((multikey(&h10)/2) - (multikey(&h11)/2)) ' q , w zoom in out
yt = yt + ((multikey(&h1E)/2) - (multikey(&h1F)/2)) ' a , s shift left,right
xt = xt + ((multikey(&h2C)/2) - (multikey(&h2D)/2)) ' z , x shift up,down

red = red +((multikey(&h13)) - (multikey(&h14))) ' r , t adjust red level
green = green +((multikey(&h21)) - (multikey(&h22))) ' f , g adjust green level
blue = blue +((multikey(&h2f)) - (multikey(&h30))) ' v , b adjust blue level

if multikey(&h39) then xrs=0 : yrs=0 : zrs=0 ' SPACE-BAR = stop all transitions

if multikey(&h1C) then xr=0 : yr=0 : zr=0 ' "Enter Key" reset spin to zero

if multikey(&h36) then 'right_shift key, to reset GL_X,GL_Y rotation values
xr =0:yr =0
end if

if multikey(&h12) then zt=-15 ' "E key" reset zoom level
if multikey(&h20) then yt= 0 ' "D key" reset UP/DOWN position to center
if multikey(&h2E) then xt =0 ' "C key" reset Left/Right position to center



Alfonse Reinheart
12-01-2011, 05:22 PM
Maybe I should put it in as a Feature_Request?

OpenGL should not be plotting functions; that's not its job. It is a low-level rendering system. If you want to plot a function, it is up to you to evaluate that function, then draw a series of lines that represent the plotted function.

That's how low-level rendering systems work: you tell them exactly what to draw.

12-02-2011, 04:06 AM
GL exposes what the GPU can do. And the GPU is a graphics renderer.

12-02-2011, 09:06 AM
It would be nice if you could:

glfloat r1=??
glfloat d1=??
glfloat c1=??
glfloat s1=??
glformula = "user input using allocated variables."

Whats the difference between a hard coded equation and a user input equation thats the same equation.

If you use a parser with the glList then depending on the equation you are looking at 30 seconds to 5 or more minutes to
fill the list. So a user would type in x,y,z equations and then have to wait maybe 5 minutes for the display to show up.

Alfonse Reinheart
12-02-2011, 10:17 AM
It would be nice if you could:

It would be nice if OpenGL could also play sounds or run a game engine. That doesn't mean it ought to be doing that.

If you use a parser with the glList then depending on the equation you are looking at 30 seconds to 5 or more minutes to
fill the list. So a user would type in x,y,z equations and then have to wait maybe 5 minutes for the display to show up.

What kind of CPU are you running that computing points on a function takes 0.5 to 5 seconds? What kind of function is this? Hardcore packages like Mathematica/Matlab/etc and such don't take that long for most functions, so why do you think that your program would?