PDA

View Full Version : Example: Section 5.4 (page 41), Combined with Exercise 1 (page 44)



kryton9
26-02-2010, 08:42
This one is pretty complex because it does more than one plot. Seemed like a good candidate to try the new tbgl canvas commands. Great job Petr, really neat how it works!
Stan, this can be simplified, I just wanted to work my way through it in an organized manner. I will try to make another more optimized version using the powerful eval command.

That plot for exercise 1 c on page 44 is very strange. I put the zoom feature just for that, still not sure what is happening :)

' Example 5.4 Combined with Exercise 1 on page 44
' Will use a canvas and dialog for multiple plots
' This is not the most optimal way to code this example
' I wanted to show it in a manner to make it easy to see what is happening
' There is a powerful eval command that would make this much better and tighter
' I am sure there will be opportunities to show that in other examples

' From Stan Blank's Book:
' "Python Programming in OpenGL
' "A Graphical Approach to Programming

' Converted by Kent Sarikaya
' Last modified: February 26, 2010


Uses "UI", "TBGL"

' Use constants for ID's
Begin Const
%lCanvas = %WM_USER + 1
%bClose

' Plot buttons
%b1 ' y = x^2
%b1a ' y = x^2 - 2
%b1b ' y = x^3 - 3x - 1
%b1c ' y = x^4 - 5x^3 + x^2 - 3x - 1
%b1d ' y = sin(x)
%b1e ' y = sin(3x)
%b1f ' y = sin(x/3)
%b1g ' y = cos(x)

%bzDefault
%bzFar
%bzVeryFar

%lZoom

End Const

Dim plot As String ="b1" ' Default plot
Global zoom As Long = 5

Function TBMAIN()

Global hDlg As DWord

Dialog New 0, "Function Plotter",-1,-1, 410, 480, _
%WS_POPUP Or %WS_VISIBLE Or _
%WS_CLIPCHILDREN Or %WS_CAPTION Or _
%WS_SYSMENU Or %WS_MINIMIZEBOX Or %WS_MAXIMIZEBOX Or %WS_THICKFRAME, 0 To hDlg

' The canvas is in a label control
Control Add Label, hDlg, %lCanvas, "", 5, 5, 400, 400
Control Set Color hDlg, %lCanvas, %BLACK, %WHITE
Control Set Resize hDlg, %lCanvas, 1, 1, 1, 1

' These are the buttons
Control Add Button, hDlg, %bClose, "Close", 345, 461, 60, 14
Control Set Resize hDlg, %bClose, 0, 1, 0, 1

Control Add Button, hDlg, %b1, "y=x^2", 5, 410, 60, 14
Control Set Resize hDlg, %b1, 0, 1, 0, 1

Control Add Button, hDlg, %b1a, "a) y=x^2-2", 70, 410, 60, 14
Control Set Resize hDlg, %b1a, 0, 1, 0, 1

Control Add Button, hDlg, %b1b, "b) y=x^3-3x-1", 135, 410, 60, 14
Control Set Resize hDlg, %b1b, 0, 1, 0, 1

Control Add Button, hDlg, %b1c, "c) y=x^4-5x^3+x^2-3x-1", 200, 410, 80, 14
Control Set Resize hDlg, %b1c, 0, 1, 0, 1

Control Add Button, hDlg, %b1d, "d) y=sin(x)", 5, 429, 60, 14
Control Set Resize hDlg, %b1d, 0, 1, 0, 1

Control Add Button, hDlg, %b1e, "e) y=sin(3x)", 70, 429, 60, 14
Control Set Resize hDlg, %b1e, 0, 1, 0, 1

Control Add Button, hDlg, %b1f, "f) y=sin(x/3)", 135, 429, 60, 14
Control Set Resize hDlg, %b1f, 0, 1, 0, 1

Control Add Button, hDlg, %b1g, "g) y=cos(x)", 200, 429, 60, 14
Control Set Resize hDlg, %b1g, 0, 1, 0, 1

Control Add Button, hDlg, %bzDefault, "Zoom Default", 5, 447, 60, 14
Control Set Resize hDlg, %bzDefault, 0, 1, 0, 1

Control Add Button, hDlg, %bzFar, "Zoom Far", 70, 447, 60, 14
Control Set Resize hDlg, %bzFar, 0, 1, 0, 1

Control Add Button, hDlg, %bzVeryFar, "Zoom Very Far", 135, 447, 60, 14
Control Set Resize hDlg, %bzVeryFar, 0, 1, 0, 1

Control Add Label, hDlg, %lZoom, "Zoom = "+Str$(zoom), 200, 450, 60, 14
Control Set Resize hDlg, %lZoom, 1, 1, 1, 1

Dialog Set Minsize hDlg, 320, 230
Dialog Show Modal hDlg, Call dlgCallback

End Function


CallBack Function dlgCallback()
Static hCtrl As DWord

Select Case CBMSG

Case %WM_INITDIALOG
Control Handle CBHNDL, %lCanvas To hCtrl

' Init OpenGL
TBGL_BindCanvas(hCtrl)
TBGL_RenderMatrix2D( -5, 5, -5, 5 )
' Set background from default black to white
TBGL_BackColor(255,255,255)

Case %WM_SIZE, %WM_SIZING
TBGL_UpdateCanvasProportions(hCtrl)
PlotFunc(hCtrl)


Case %WM_CLOSE
TBGL_ReleaseCanvas(hCtrl)

Case %WM_COMMAND
'Case buttons pressed
Select Case CBCTL

Case %bClose
If CBCTLMSG = %BN_CLICKED Then Dialog End CBHNDL

Case %b1
plot = "b1"
Case %b1a
plot = "b1a"
Case %b1b
plot = "b1b"
Case %b1c
plot = "b1c"
Case %b1d
plot = "b1d"
Case %b1e
plot = "b1e"
Case %b1f
plot = "b1f"
Case %b1g
plot = "b1g"

Case %bzDefault
zoom = 5
Control Set Text hDlg, %lZoom, "Zoom = "+Str$(zoom)
Case %bzFar
zoom = 50
Control Set Text hDlg, %lZoom, "Zoom = "+Str$(zoom)
Case %bzVeryFar
zoom = 150
Control Set Text hDlg, %lZoom, "Zoom = "+Str$(zoom)

End Select

End Select

PlotFunc(hCtrl)
End Function

Function PlotFunc( hCtrl As DWord )
Select Case plot
Case "b1"
PlotB1(hCtrl)
Case "b1a"
PlotB1a(hCtrl)
Case "b1b"
PlotB1b(hCtrl)
Case "b1c"
PlotB1c(hCtrl)
Case "b1d"
PlotB1d(hCtrl)
Case "b1e"
PlotB1e(hCtrl)
Case "b1f"
PlotB1f(hCtrl)
Case "b1g"
PlotB1g(hCtrl)
End Select
End Function

Function PlotB1( hCtrl As DWord )
If TBGL_CanvasBound(hCtrl) Then
Local x,y As Single
TBGL_ClearFrame
TBGL_Camera(0, 0, zoom, 0, 0, 0)
TBGL_Color(0,0,0)
TBGL_PointSize 3
For x = -zoom To zoom Step 0.01
y = x*x
TBGL_BeginPoly(%GL_POINTS)
TBGL_Vertex(x,y)
TBGL_EndPoly
Next
ShowAxis(hCtrl)
TBGL_DrawFrame
End If
End Function

Function PlotB1a( hCtrl As DWord )
If TBGL_CanvasBound(hCtrl) Then
Local x,y As Single
TBGL_ClearFrame
TBGL_Camera(0, 0, zoom, 0, 0, 0)
TBGL_Color(0,0,0)
TBGL_PointSize 3
For x = -zoom To zoom Step 0.01
y = (x^2)-2
TBGL_BeginPoly(%GL_POINTS)
TBGL_Vertex(x,y)
TBGL_EndPoly
Next
ShowAxis(hCtrl)
TBGL_DrawFrame
End If
End Function

Function PlotB1b( hCtrl As DWord )
If TBGL_CanvasBound(hCtrl) Then
Local x,y As Single
TBGL_ClearFrame
TBGL_Camera(0, 0, zoom, 0, 0, 0)
TBGL_Color(0,0,0)
TBGL_PointSize 3
For x = -zoom To zoom Step 0.01
y = ((x^3)-(3*x))-1
TBGL_BeginPoly(%GL_POINTS)
TBGL_Vertex(x,y)
TBGL_EndPoly
Next
ShowAxis(hCtrl)
TBGL_DrawFrame
End If
End Function

Function PlotB1c( hCtrl As DWord )
If TBGL_CanvasBound(hCtrl) Then
Local x,y As Single
TBGL_ClearFrame
TBGL_Camera(0, 0, zoom, 0, 0, 0)
TBGL_Color(0,0,0)
TBGL_PointSize 3
For x = -zoom To zoom Step 0.01
y = x^4 - 5*x^3 + x^2 - 3*x -1
TBGL_BeginPoly(%GL_POINTS)
TBGL_Vertex(x,y)
TBGL_EndPoly
Next
ShowAxis(hCtrl)
TBGL_DrawFrame
End If
End Function

Function PlotB1d( hCtrl As DWord )
If TBGL_CanvasBound(hCtrl) Then
Local x,y As Single
TBGL_ClearFrame
TBGL_Camera(0, 0, zoom, 0, 0, 0)
TBGL_Color(0,0,0)
TBGL_PointSize 3
For x = -zoom To zoom Step 0.01
y = Sin(x)
TBGL_BeginPoly(%GL_POINTS)
TBGL_Vertex(x,y)
TBGL_EndPoly
Next
ShowAxis(hCtrl)
TBGL_DrawFrame
End If
End Function

Function PlotB1e( hCtrl As DWord )
If TBGL_CanvasBound(hCtrl) Then
Local x,y As Single
TBGL_ClearFrame
TBGL_Camera(0, 0, zoom, 0, 0, 0)
TBGL_Color(0,0,0)
TBGL_PointSize 3
For x = -zoom To zoom Step 0.01
y = Sin(3*x)
TBGL_BeginPoly(%GL_POINTS)
TBGL_Vertex(x,y)
TBGL_EndPoly
Next
ShowAxis(hCtrl)
TBGL_DrawFrame
End If
End Function

Function PlotB1f( hCtrl As DWord )
If TBGL_CanvasBound(hCtrl) Then
Local x,y As Single
TBGL_ClearFrame
TBGL_Camera(0, 0, zoom, 0, 0, 0)
TBGL_Color(0,0,0)
TBGL_PointSize 3
For x = -zoom To zoom Step 0.01
y = Sin(x/3)
TBGL_BeginPoly(%GL_POINTS)
TBGL_Vertex(x,y)
TBGL_EndPoly
Next
ShowAxis(hCtrl)
TBGL_DrawFrame
End If
End Function

Function PlotB1g( hCtrl As DWord )
If TBGL_CanvasBound(hCtrl) Then
Local x,y As Single
TBGL_ClearFrame
TBGL_Camera(0, 0, zoom, 0, 0, 0)
TBGL_Color(0,0,0)
TBGL_PointSize 3
For x = -zoom To zoom Step 0.01
y = Cos(x)
TBGL_BeginPoly(%GL_POINTS)
TBGL_Vertex(x,y)
TBGL_EndPoly
Next
ShowAxis(hCtrl)
TBGL_DrawFrame
End If
End Function

Function ShowAxis( hCtrl As DWord )
If TBGL_CanvasBound(hCtrl) Then
TBGL_Color(255,0,0)
TBGL_BeginPoly(%GL_LINES)
TBGL_Vertex(-zoom,0)
TBGL_Vertex(zoom,0)
TBGL_EndPoly
TBGL_Color(0,255,0)
TBGL_BeginPoly(%GL_LINES)
TBGL_Vertex(0,zoom)
TBGL_Vertex(0,-zoom)
TBGL_EndPoly
End If
End Function

' This is a mixture of code ideas from section 5.2
' Starting from page 41 to 44

sblank
26-02-2010, 16:48
Outstanding job, Kent...

Exercise 1c on page 44 is a bit strange... the range of the function is huge for a small domain. I've attached a pdf of the function plot using Mathematica. You can see the domain {-5, 5} and the range is very large.

This was one of those exercises where I would have the students scratching their heads a bit... and hopefully together we could explore the plot. So it was by design, but perhaps not the best of exercises? Your plot is correct, though... and this kind of exercise would lead to discussions about methods of rendering the plot differently.

I like the zoom feature!

Cheers,

Stan




This one is pretty complex because it does more than one plot. Seemed like a good candidate to try the new tbgl canvas commands. Great job Petr, really neat how it works!
Stan, this can be simplified, I just wanted to work my way through it in an organized manner. I will try to make another more optimized version using the powerful eval command.

That plot for exercise 1 c on page 44 is very strange. I put the zoom feature just for that, still not sure what is happening :)

kryton9
26-02-2010, 20:46
Thanks Stan, I like that equation. It will be fun to keep checking further plotting programs with it. Now I have an idea of what it should look like.