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
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