📄 simple.c
字号:
//----------------------------------------------------------------------------// Simple 3D Plotting example using CVIOGL instrument driver//----------------------------------------------------------------------------#include <userint.h>#include <ansi_c.h>#include "simple.h"#include "cviogl.h"#define XPOINTS 21#define YPOINTS 21#define PI 3.1415926535897932384626433832795028841971#define RAD(x) ((x)*PI/180.0)#define SINC(x) ((x) != 0.0 ? sin(PI*(x))/(PI*(x)): 1.0)static int demoPanel;static int demoControl;static int SetControlAttributes(void); static int CreatePlot(void);static char msgBuf[256];//----------------------------------------------------------------------------// main//----------------------------------------------------------------------------int main (int argc, char *argv[]){ int error = 0; if (InitCVIRTE (0, argv, 0) == 0) /* Initialize CVI libraries */ return -1; /* out of memory */ SetSleepPolicy (VAL_SLEEP_MORE); if ((demoPanel = LoadPanel (0, "simple.uir", DEMOPANEL)) < 0) return -1; // Create OpenGL control on CVI panel demoControl = OGLConvertCtrl(demoPanel,DEMOPANEL_PICTURE); if (demoControl<0) { OGLGetErrorString (demoControl, msgBuf, 255); MessagePopup("OGLConvertCtrl Error", msgBuf); goto Error; } // Setup CVIOGL control SetControlAttributes(); CreatePlot(); DisplayPanel (demoPanel); RunUserInterface (); // Dicard CVIOGL control OGLDiscardCtrl(demoPanel,demoControl); Error : return error;}//----------------------------------------------------------------------------// SetControlAttributes//----------------------------------------------------------------------------static int SetControlAttributes(void){ int error = 0; OGLSetCtrlAttribute(demoPanel,demoControl,OGLATTR_LIGHTING_ENABLE, 1); OGLSetCtrlAttribute(demoPanel,demoControl,OGLATTR_LIGHT_SELECT, 1); OGLSetCtrlAttribute(demoPanel,demoControl,OGLATTR_LIGHT_ENABLE, 1); OGLSetCtrlAttribute(demoPanel,demoControl,OGLATTR_LIGHT_DISTANCE, 3.0); OGLSetCtrlAttribute(demoPanel,demoControl,OGLATTR_VIEW_DISTANCE,2.5); OGLSetCtrlAttribute(demoPanel,demoControl,OGLATTR_PROJECTION_TYPE,OGLVAL_PERSPECTIVE); // Setup Axis Labels OGLSetCtrlAttribute(demoPanel,demoControl,OGLATTR_XNAME_VISIBLE,1); OGLSetCtrlAttribute(demoPanel,demoControl,OGLATTR_YNAME_VISIBLE,1); OGLSetCtrlAttribute(demoPanel,demoControl,OGLATTR_ZNAME_VISIBLE,1); OGLSetCtrlAttribute(demoPanel,demoControl,OGLATTR_XNAME,"x axis"); OGLSetCtrlAttribute(demoPanel,demoControl,OGLATTR_YNAME,"y axis"); OGLSetCtrlAttribute(demoPanel,demoControl,OGLATTR_ZNAME,"z axis"); OGLSetCtrlAttribute(demoPanel,demoControl,OGLATTR_XLABEL_VISIBLE,1); OGLSetCtrlAttribute(demoPanel,demoControl,OGLATTR_YLABEL_VISIBLE,1); OGLSetCtrlAttribute(demoPanel,demoControl,OGLATTR_ZLABEL_VISIBLE,1); Error : return error;}//----------------------------------------------------------------------------// CreatePlot//----------------------------------------------------------------------------static int CreatePlot(void){ int error = 0; int plotTypeIs3D = 1; int numPlots; double radxStep; double radyStep; int plot; register int i,j; double x,y; double xStep,yStep; void * pts; double *pts3DPtr; OGLVertexD *pts2DPtr; /* Get the plottype of either 3D or 2D lines(no surface) */ GetCtrlVal(demoPanel, DEMOPANEL_PLOTTYPE, &plotTypeIs3D); xStep = 360.0/(XPOINTS-1); yStep = 360.0/(YPOINTS-1); radxStep = RAD(xStep); radyStep = RAD(yStep); // Malloc data for plot if (plotTypeIs3D) { pts = malloc((XPOINTS)*(YPOINTS)*sizeof(double)); if (!pts) return -1; else pts3DPtr = (double *)pts; } else { pts = malloc((XPOINTS)*(YPOINTS)*sizeof(OGLVertexD)); if (!pts) return -1; else pts2DPtr = (OGLVertexD *)pts; } // Generate plot data for(j=0,y=-PI;j<YPOINTS;j++,y+=radyStep) { for(i=0,x=-PI;i<XPOINTS;i++,x+=radxStep) if (plotTypeIs3D) { *pts3DPtr = exp(-(x+y)/(2*PI))*sin(x*x+y*y); pts3DPtr++; } else { pts2DPtr->x = x; pts2DPtr->y = y; pts2DPtr->z = exp(-(x+y)/(2*PI))*sin(x*x+y*y); pts2DPtr++; } } // Setup control OGLSetCtrlAttribute (demoPanel, demoControl,OGLATTR_PLOTAREA_ZSTART, 0.0); OGLSetCtrlAttribute (demoPanel, demoControl,OGLATTR_PLOTAREA_ZSIZE, 0.6); OGLSetCtrlAttribute (demoPanel, demoControl,OGLATTR_VIEW_AUTO_DISTANCE, 0); OGLSetCtrlAttribute (demoPanel, demoControl,OGLATTR_VIEW_DISTANCE, 2.5); OGLGetCtrlAttribute (demoPanel, demoControl,OGLATTR_NUM_PLOTHANDLES,&numPlots); // Delete any existing plots for (i=0;i<numPlots;i++) { OGLGetCtrlAttribute(demoPanel,demoControl, OGLATTR_FIRST_PLOTHANDLE, &plot); OGLDeletePlot(demoPanel,demoControl,plot,0); } // Give plot data to control if (plotTypeIs3D) { pts3DPtr = pts; plot = OGLPlot3DUniform (demoPanel, demoControl, pts3DPtr, XPOINTS, YPOINTS, OGLVAL_DOUBLE, 2*PI/(XPOINTS-1), -PI, 2*PI/(YPOINTS-1), -PI); // Setup plot attributes OGLSetPlotAttribute(demoPanel,demoControl,plot,OGLATTR_SURFACE_STYLE,OGLVAL_SMOOTH); OGLSetPlotAttribute(demoPanel,demoControl,plot,OGLATTR_SURFACE_COLOR,OGLVAL_RED); OGLSetPlotAttribute(demoPanel,demoControl,plot,OGLATTR_SURFACE_SPECULAR_FACTOR,1.0); OGLSetPlotAttribute(demoPanel,demoControl,plot,OGLATTR_SURFACE_SHININESS,50); OGLSetPlotAttribute(demoPanel,demoControl,plot,OGLATTR_WIRE_STYLE,OGLVAL_SOLID); OGLSetPlotAttribute(demoPanel,demoControl,plot,OGLATTR_WIRE_COLOR,OGLVAL_RED); } else { for (i=0;i<XPOINTS;i++) { pts2DPtr = pts; plot = OGLPlot3DScatter (demoPanel, demoControl, &pts2DPtr[i*(XPOINTS)], XPOINTS, 1, OGLVAL_DOUBLE); // Setup plot attributes OGLSetPlotAttribute(demoPanel,demoControl,plot,OGLATTR_SURFACE_STYLE,OGLVAL_SMOOTH); OGLSetPlotAttribute(demoPanel,demoControl,plot,OGLATTR_SURFACE_COLOR,OGLVAL_RED); OGLSetPlotAttribute(demoPanel,demoControl,plot,OGLATTR_SURFACE_SPECULAR_FACTOR,1.0); OGLSetPlotAttribute(demoPanel,demoControl,plot,OGLATTR_SURFACE_SHININESS,50); OGLSetPlotAttribute(demoPanel,demoControl,plot,OGLATTR_WIRE_STYLE,OGLVAL_SOLID); OGLSetPlotAttribute(demoPanel,demoControl,plot,OGLATTR_WIRE_COLOR,OGLVAL_RED); } } // Display plot OGLRefreshGraph(demoPanel, demoControl); // free plot data memory because control copies it free(pts);Error : return error;} //----------------------------------------------------------------------------// properties//----------------------------------------------------------------------------int CVICALLBACK properties (int panel, int control, int event, void *callbackData, int eventData1, int eventData2){ switch (event) { case EVENT_COMMIT: OGLPropertiesPopup(demoPanel,demoControl); break; } return 0;}//----------------------------------------------------------------------------// shutdown//----------------------------------------------------------------------------int CVICALLBACK shutdown (int panel, int control, int event, void *callbackData, int eventData1, int eventData2){ switch (event) { case EVENT_COMMIT: QuitUserInterface (0); break; } return 0;}//----------------------------------------------------------------------------// print//----------------------------------------------------------------------------int CVICALLBACK print (int panel, int control, int event, void *callbackData, int eventData1, int eventData2){ int error = OGLNoError; switch (event) { case EVENT_COMMIT: SetWaitCursor (1); OGLCopyScaledCtrlBitmap (demoPanel, demoControl, 0, -1, -1, -1, -1); PrintPanel (demoPanel, "", 1, VAL_FULL_PANEL, 1); SetWaitCursor (0); break; }Error : if (error != OGLNoError) { char msgBuf[256]; OGLGetErrorString (error, msgBuf, 255); MessagePopup ("OGL Error", msgBuf); } return error;}//----------------------------------------------------------------------------// DemoPanelCallback - Since CVI does not know about CVIOGL control, we must// manually resize the CVIOGL control whenever the picture control is resized.//----------------------------------------------------------------------------int CVICALLBACK DemoPanelCallback (int panel, int event, void *callbackData, int eventData1, int eventData2){ int width, height, top, left; switch (event) { case EVENT_PANEL_SIZE: GetCtrlAttribute(demoPanel, DEMOPANEL_PICTURE, ATTR_TOP, &top); GetCtrlAttribute(demoPanel, DEMOPANEL_PICTURE, ATTR_LEFT, &left); GetCtrlAttribute(demoPanel, DEMOPANEL_PICTURE, ATTR_WIDTH, &width); GetCtrlAttribute(demoPanel, DEMOPANEL_PICTURE, ATTR_HEIGHT, &height); OGLSetCtrlAttribute (demoPanel, demoControl, OGLATTR_TOP, top); OGLSetCtrlAttribute (demoPanel, demoControl, OGLATTR_LEFT, left); OGLSetCtrlAttribute (demoPanel, demoControl, OGLATTR_WIDTH, width); OGLSetCtrlAttribute (demoPanel, demoControl, OGLATTR_HEIGHT, height); OGLRefreshGraph(demoPanel,demoControl); break; } return 0;}//----------------------------------------------------------------------------// ChangePlotType//----------------------------------------------------------------------------int CVICALLBACK ChangePlotType (int panel, int control, int event, void *callbackData, int eventData1, int eventData2){ switch (event) { case EVENT_COMMIT: CreatePlot(); break; } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -