📄 chart.bas
字号:
'/////////////
quadObj = gluNewQuadric()
CALL glBlendFunc(%GL_SRC_ALPHA, %GL_ONE_MINUS_SRC_ALPHA)
CALL glEnable(%GL_BLEND)
CALL glEnable(%GL_LINE_SMOOTH)
CALL gluQuadricNormals(quadObj, %GLU_SMOOTH)
'/////////////
DIM LightDiffuse(3) AS SINGLE: ARRAY ASSIGN LightDiffuse() = 1.0, 1.0, 1.0, 1.0
DIM LightAmbient(3) AS SINGLE: ARRAY ASSIGN LightAmbient() = 0.5, 0.5, 0.5, 1.0
DIM LightPosition(3) AS SINGLE: ARRAY ASSIGN LightPosition() = -50.0, 50.0, 100.0, 1.0
CALL glLightfv(%GL_LIGHT1, %GL_DIFFUSE, LightDiffuse(0)) ' Setup The Diffuse Light
CALL glLightfv(%GL_LIGHT1, %GL_AMBIENT, LightAmbient(0)) ' Setup The Ambient Light
CALL glLightfv(%GL_LIGHT1, %GL_POSITION, LightPosition(0)) ' Position The Light
CALL glEnable(%GL_LIGHT1) ' Enable Light ONE
CALL glEnable(%GL_LIGHTING) ' Enable Lighting
CALL glEnable(%GL_COLOR_MATERIAL) ' Enable Coloring Of Material
CALL glColorMaterial(%GL_FRONT, %GL_AMBIENT_AND_DIFFUSE)
chart.listIndex = 1
CALL glGenLists(1)
CALL Axis(15.0, 9.0, 11.0)
DIM thisChartItem(1 TO chart.chartnumber * chart.chartseries) AS LONG, Value AS SINGLE
DIM ChartColor(1 TO chart.chartnumber) AS LONG
'LOCAL dSlice AS DOUBLE, dShift AS DOUBLE
'dSlice = Pi / chart.chartseries
k = 0
FOR i = 1 TO chart.chartnumber
SELECT CASE LONG i
CASE 1: ChartColor(i) = ZD_ColorARGB(255, RGB(255, 255, 255))
CASE 2: ChartColor(i) = ZD_ColorARGB(220, RGB(0, 255, 0))
CASE 3: ChartColor(i) = ZD_ColorARGB(200, RGB(0, 0, 255))
CASE 4: ChartColor(i) = ZD_ColorARGB(192, RGB(255, 0, 0))
END SELECT
'dShift = i * PiDiv4
FOR j = 1 TO chart.chartseries 'value.length
'BarValue(i, j) = 8.0 * ABS(SIN( dSlice * j - dShift))
Value = rnd(1,8)'8.0 * ABS(SIN( dSlice * j - dShift))
INCR k: thisChartItem(k) = chart.ListIndex + k
CALL glNewList(thisChartItem(k), %GL_COMPILE)
CALL glRotatef(-90.0, 1.0, 0.0, 0.0)
CALL glBindTexture(%GL_TEXTURE_2D, i)
CALL gluQuadricNormals(quadObj, %GLU_SMOOTH) ' Create Smooth Normals
CALL gluQuadricTexture(quadObj, 1) ' Create Texture Coords
CALL gluCylinder(quadObj, chart.radius, chart.radius, Value, 32, 1)
CALL glBindTexture(%GL_TEXTURE_2D, 6)
'CALL gluCylinder(quadObj, chart.radius, chart.radius, Value, 32, 1)
CALL gluDisk(quadObj, 0.0, chart.radius, 32, 32)
CALL glTranslatef(0.0, 0.0, Value)
CALL gluDisk(quadObj, 0.0, chart.radius, 32, 32)
CALL glTranslatef(0.0, 0.0, -Value)
CALL glRotatef(90.0, 1.0, 0.0, 0.0)'
CALL glEndList()
NEXT
NEXT
END SUB
DECLARE SUB glTexCoord2f LIB "opengl32.dll" ALIAS "glTexCoord2f" (BYVAL s AS SINGLE, BYVAL t AS SINGLE)
SUB Axis(BYVAL x AS SINGLE, BYVAL y AS SINGLE, BYVAL z AS SINGLE)
LOCAL a AS LONG
DIM COLOR1(3) AS SINGLE: ARRAY ASSIGN COLOR1() = 0.6, 0.6, 0.6, 0.3
DIM COLOR2(3) AS SINGLE: ARRAY ASSIGN COLOR2() = 1.0, 1.0, 1.0, 1.0
DIM COLOR3(3) AS SINGLE: ARRAY ASSIGN COLOR3() = 0.6, 0.0, 0.0, 1.0
CALL glNewList(chart.listIndex, %GL_COMPILE)
CALL glBegin(%GL_QUADS)
CALL glColor4fv(COLOR1(0))
'CALL glTexCoord2f(0.0, 0.0):
CALL glVertex3f(0.0, y, z)
'CALL glTexCoord2f(1.0, 0.0):
CALL glVertex3f(0.0, -1.0, z)
'CALL glTexCoord2f(1.0, 1.0):
CALL glVertex3f(0.0, -1.0, -1.0)
'CALL glTexCoord2f(0.0, 1.0):
CALL glVertex3f(0.0, y, -1.0)
CALL glVertex3f(-1.0, y, 0.0)
CALL glVertex3f(-1.0, -1.0, 0.0)
CALL glVertex3f(x, -1.0, 0.0)
CALL glVertex3f(x, y, 0.0)
CALL glEnd()
CALL glColor4fv(COLOR2(0))
FOR a = 1 TO y - 1
CALL glBegin(%GL_LINE_STRIP)
CALL glVertex3f(0.1, CSNG(a), z)
CALL glVertex3f(0.1, CSNG(a), 0.1)
CALL glVertex3f(x, CSNG(a), 0.1)
CALL glEnd()
NEXT
CALL glColor4fv(COLOR3(0))
CALL glBegin(%GL_LINE_STRIP)
CALL glVertex3f(0.1, 0.0, z)
CALL glVertex3f(0.1, 0.0, 0.1)
CALL glVertex3f(x, 0.0, 0.1)
CALL glEnd()
CALL glBegin(%GL_LINES)
CALL glVertex3f(0.1, -1.0, 0.1)
CALL glVertex3f(0.1, y, 0.1)
CALL glEnd()
CALL glEndList()
END SUB
SUB DrawTheScene(UseFont AS ZGLFONT)
LOCAL k AS LONG, i AS LONG, j AS LONG
STATIC TextColor AS LONG
CALL glClear(%GL_COLOR_BUFFER_BIT OR %GL_DEPTH_BUFFER_BIT)
CALL glLoadIdentity()
' Draw background image -----------------------------------------
CALL glBindTexture(%GL_TEXTURE_2D, 5)
CALL glBegin(%GL_QUADS)
CALL glTexCoord2f(0.0, 0.0): CALL glVertex3f(-25,-25,-60.0) ' Bottom Left Of The Texture And Quad
CALL glTexCoord2f(1.0, 0.0): CALL glVertex3f( 25,-25,-60.0) ' Bottom Right Of The Texture And Quad
CALL glTexCoord2f(1.0, 1.0): CALL glVertex3f( 25, 25,-60.0) ' Top Right Of The Texture And Quad
CALL glTexCoord2f(0.0, 1.0): CALL glVertex3f(-25, 25,-60.0) ' Top Left Of The Texture And Quad
CALL glEnd()
' ----------------------------------------------------------------
CALL glTranslatef(chart.xoff, chart.yoff, chart.zoff)
CALL glRotatef(chart.xrot, 1.0, 0.0, 0.0)
CALL glRotatef(chart.yrot, 0.0, 1.0, 0.0)
' Draw the XYZ grid
CALL glLineWidth(1.0)
CALL glCallList(chart.ListIndex)
k = 0
CALL glTranslatef(chart.radius + 0.5, 0.0, chart.radius + 0.5)
FOR i = 1 TO chart.chartnumber
' Set color for the chart serie
CALL ZI_glColor4f(ChartColor(i))
FOR j = 1 TO chart.chartseries
' Draw the matching chart item
INCR k: CALL glCallList(thisChartItem(k))
CALL glTranslatef(2.0 * chart.radius, 0.0, 0.0)
NEXT
CALL glTranslatef(-2.0 * chart.radius * chart.chartseries, 0.0, 2.0 * chart.radius + 0.5)
NEXT
IF TextColor = 0 THEN TextColor = ZD_ColorARGB(255, RGB(128,0,0))
CALL ZI_DrawGLText(glWnd, UseFont, 10, 10 + UseFont.fontHeight * 0, ("Zoom " + STR$(ZI_GetGLzoom(glWnd))), TextColor)
CALL ZI_UpdateGLWindow(glWnd)
END SUB
FUNCTION WndProc(BYVAL hWin AS LONG, BYVAL Msg AS LONG, BYVAL wParam AS LONG, BYVAL lParam AS LONG) EXPORT AS LONG
LOCAL ps AS PAINTSTRUCT, lp AS POINTAPI, ZoomIs AS LONG, UseFont AS ZGLFONT
STATIC wasX&, wasY&
SELECT CASE Msg&
CASE %WM_ACTIVATE ' Watch For Window Activate Message
IF HIWRD(wParam) = 0 THEN ' Check Minimization State
Active = 1 ' Program Is Active
ELSE ' Otherwise
Active = 0 ' Program Is No Longer Active
END IF
CASE %WM_SIZE
CALL ZI_ResizeGLWindow(glWnd)
CALL GlobalFont(UseFont, 0): CALL DrawTheScene(UseFont)
CASE %WM_COMMAND
wP& = LOWRD(wParam&)
SELECT CASE LONG wP&
CASE %ID_RESET
CALL InitGraph()
CALL ZI_SetGLzoom(glWnd, 0): CALL ZI_ResizeGLWindow(glWnd)
CALL GlobalFont(UseFont, 0): CALL DrawTheScene(UseFont)
END SELECT
IF GetFocus <> hWin THEN CALL SetFocus(hWin)
CASE %WM_KEYDOWN
SELECT CASE LONG wParam
CASE %VK_LEFT
IF ZI_IsCtrlKeyPressed THEN
chart.yrot = chart.yrot - 0.5
ELSE
chart.xoff = chart.xoff - 0.05
END IF
CASE %VK_RIGHT
IF ZI_IsCtrlKeyPressed THEN
chart.yrot = chart.yrot + 0.5
ELSE
chart.xoff = chart.xoff + 0.05
END IF
CASE %VK_UP
IF ZI_IsCtrlKeyPressed THEN
chart.xrot = chart.xrot - 0.5
ELSE
chart.yoff = chart.yoff + 0.05
END IF
CASE %VK_DOWN
IF ZI_IsCtrlKeyPressed THEN
chart.xrot = chart.xrot + 0.5
ELSE
chart.yoff = chart.yoff - 0.05
END IF
CASE %VK_PGUP
chart.zoff = chart.zoff + 0.05
CASE %VK_PGDN
chart.zoff = chart.zoff - 0.05
END SELECT
FUNCTION = 0: EXIT FUNCTION
CASE %WM_PAINT
CALL GradientPaint(hWin&, RGB(228,227,227), RGB(168,167,191))
FUNCTION = 0: EXIT FUNCTION
CASE %WM_DESTROY
CALL PostQuitMessage(0)
FUNCTION = 0: EXIT FUNCTION
END SELECT
FUNCTION = DefWindowProc(hWin&, Msg&, wParam&, lParam&)
END FUNCTION
SUB GradientPaint(BYVAL hWin&, BYVAL TopRGB&, BYVAL BottomRGB&)
LOCAL ps AS PAINTSTRUCT
LOCAL rc AS RECT
' Tile the background
CALL GetClientRect (hWin&, rc)
hDC& = BeginPaint(hWin&, ps)
CALL ZI_GradientPaintDC(hDC&, 0, 0, rc.nRight, rc.nBottom, TopRGB&, BottomRGB&)
CALL EndPaint(hWin&, ps)
END SUB
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -