Example showing Line-drawn surface and filled contour-map using GINOSURF

!
#pragma once
namespace surfex2
{
	using namespace System;
	using namespace System::ComponentModel;
	using namespace System::Collections;
	using namespace System::Windows::Forms;
	using namespace System::Data;
	using namespace System::Drawing;
	using namespace GinoGraphics;
	///  
	/// Summary for Form1
	///
	/// WARNING: If you change the name of this class, you will need to change the 
	///          'Resource File Name' property for the managed resource compiler tool 
	///          associated with all .resx files this class depends on.  Otherwise,
	///          the designers will not be able to interact properly with localized
	///          resources associated with this form.
	/// 
	public __gc class Form1 : public System::Windows::Forms::Form
	{	
	public:
		Form1(void)
		{
			InitializeComponent();
		}
  
	protected:
		void Dispose(Boolean disposing)
		{
			if (disposing && components)
			{
				components->Dispose();
			}
			__super::Dispose(disposing);
		}
	private: System::Windows::Forms::PictureBox *  pictureBox1;
	private:
		/// 
		/// Required designer variable.
		/// 
		System::ComponentModel::Container * components;
		/// 
		/// Required method for Designer support - do not modify
		/// the contents of this method with the code editor.
		/// 
		void InitializeComponent(void)
		{
			this->pictureBox1 = new System::Windows::Forms::PictureBox();
			this->SuspendLayout();
			// 
			// pictureBox1
			// 
			this->pictureBox1->Dock = System::Windows::Forms::DockStyle::Fill;
			this->pictureBox1->Location = System::Drawing::Point(0, 0);
			this->pictureBox1->Name = S"pictureBox1";
			this->pictureBox1->Size = System::Drawing::Size(632, 597);
			this->pictureBox1->TabIndex = 0;
			this->pictureBox1->TabStop = false;
			this->pictureBox1->Paint += new System::Windows::Forms::PaintEventHandler(this, pictureBox1_Paint);
			// 
			// Form1
			// 
			this->AutoScaleBaseSize = System::Drawing::Size(5, 13);
			this->ClientSize = System::Drawing::Size(632, 597);
			this->Controls->Add(this->pictureBox1);
			this->Name = S"Form1";
			this->Text = S"Form1";
			this->ResumeLayout(false);
		}	
	private: System::Void pictureBox1_Paint(System::Object *  sender, System::Windows::Forms::PaintEventArgs *  e)
			 {
				 #define NUMX 41
#define NUMY 51
#define NCONT 10
#define MAXPOINTS 200
//float zfunc (float x, float y);
/*  Declare variables */
GWORKSPACE	*work = new GWORKSPACE();
GDIM      *paper;
GDEVSTATE *device_state;
GLIMIT3   *data_3D = new GLIMIT3();
GLIMIT	  *picture2D = new GLIMIT(0.0,1000.0,0.0,750.0);
GLIMIT3   *picture3D = new GLIMIT3(0.0,1000.0,0.0,750.0,-5000.0,5000.0);
GLIMIT    *viewport = new GLIMIT(0.0,1.0,0.0,1.0);
GLIMIT	  *window = new GLIMIT(30.0,970.0,70.0,700.0);
GLIMIT	  *data_limit = new GLIMIT(200.0,500.0,100.0,340.0);
GLIMIT	  *frame1 = new GLIMIT(10.0,990.0,50.0,740.0);
GLIMIT	  *frame2 = new GLIMIT(15.0,985.0,55.0,735.0);
GFILL	  *index1[] = new GFILL*[NCONT+1];
Int32	  index2[] = new Int32[NCONT+1];
GPOINT    *profile[] = new GPOINT*[MAXPOINTS];
GSURF3D   *state = new GSURF3D(Switch::GON,Switch::GOFF);
GPRJAXI   *style = new GPRJAXI(SurfaceAxesStyle::GAXIS,SurfaceAxesStyle::GNONE,SurfaceAxesStyle::GAXIS,SurfaceAxesStyle::GNONE,SurfaceAxesStyle::GAXISANDGRID,SurfaceAxesStyle::GAXISANDGRID);
GPRJAXI	  *supress = new GPRJAXI(SurfaceAxesStyle::GNONE,SurfaceAxesStyle::GNONE,SurfaceAxesStyle::GNONE,SurfaceAxesStyle::GNONE,SurfaceAxesStyle::GNONE,SurfaceAxesStyle::GNONE);
GRGBSTY   *def_col;
Switch    key;
Double	gridz[,] = new Double[NUMX,NUMY];
Int32 ip,ndc,ndt,col;
      int NUL=0;
	  IntPtr hdc;
      int       i,j,npts;
      float     xdata,ydata,xstep,ystep,
                zbase,zlow,zhigh,
		radius = 2001.0,
		theta = 8.0,
		phi = 155.0;
/*  Initialise variables */
      zbase=0.0;
      zlow = 30.0;
      zhigh = 120.0;
      data_3D->xmin=data_limit->xmin;
      data_3D->xmax=data_limit->xmax;
      data_3D->ymin=data_limit->ymin;
      data_3D->ymax=data_limit->ymax;
      data_3D->zmin=zbase;
      data_3D->zmax=zhigh;
      npts=MAXPOINTS;
/*  Define key index array */
      for (i=0; i< NCONT+1; i++) {
         index1[i] = new GFILL(FillStyle::GSOLID, (LineStyle) (i+3));
         index2[i] = i+3;
      }
/*  Initialize GINO-C */
      Gino::OpenGino();
/* Nominate the device */
	  hdc = e->Graphics->GetHdc();
	  Gino::Mwinao(NUL,(int)hdc);
	  Gino::EnqDrawingLimits(&paper,&ip);
      viewport->xmax=paper->xpap;
      viewport->ymax=paper->ypap;
/* Check for 3D device */
      Gino::EnqDeviceState(&device_state);
      if(device_state->dddim == 2) 
         Gino::SetViewport2D(picture2D, viewport);
      else
         Gino::SetViewport3D(picture3D, viewport);
      Gino::NewDrawing();
      Gino::SetCharSize(8.5,8.5);
      Gino::EnqColourInfo(&ndc,&ndt);
      Gino::EnqLineColour(&col);
/*  Define colour table */
      Gino::EnqRGB(col,&def_col);
      Gino::DefineRGB(1,def_col->red,def_col->green,def_col->blue);
      Gino::DefineRGB(2,0.0,1.0,1.0);
      Gino::DefineRGB(3,0.0,0.0,1.0);
      Gino::DefineRGB(4,0.0,0.2,1.0);
      Gino::DefineRGB(5,0.0,0.4,1.0);
      Gino::DefineRGB(6,0.0,0.6,1.0);
      Gino::DefineRGB(7,0.0,0.8,1.0);
      Gino::DefineRGB(8,0.0,1.0,1.0);
      Gino::DefineRGB(9,0.0,1.0,0.8);
      Gino::DefineRGB(10,0.0,1.0,0.6);
      Gino::DefineRGB(11,0.0,1.0,0.4);
      Gino::DefineRGB(12,0.0,1.0,0.2);
      Gino::DefineRGB(13,0.0,1.0,0.0);
/*  Initialise surface drawing */
      Surf::OpenSurf();
      if(device_state->dddim == 3) Surf::SetSurf3DState(state);
      Gino::SetWindow2D(window);
      Surf::SetHeightRatio(0.7);
      Surf::SetSurfaceBaseType(SurfaceBaseType::GBOTHSURFACES);
      Surf::SetSurfaceGridMode(SurfAxis::GXAXIS);
      Surf::SetSurfaceLineStyles(1,1,1);
      Surf::SetContourMapLineStyles(1,1,1,0);
      Surf::SetContourDrawingSwitch(Switch::GON);
/*  Generate grid from function */
      xstep = (data_limit->xmax-data_limit->xmin)/NUMX;
      ystep = (data_limit->ymax-data_limit->ymin)/NUMY;
      for (i=0,xdata=data_limit->xmin; i< NUMX; i++,xdata=xdata+xstep)
         for (j=0,ydata=data_limit->ymin; j< NUMY; j++,ydata=ydata+ystep)
            gridz[i,j] = zfunc(xdata,ydata);
/*  Initialise workspace */
      Surf::InitializeWorkspace(WorkspaceOperation::GINITIALIZE,GridType::GGRIDDED,4*NUMX*NUMY+200,&work);
/*  Specify perspetive view */
      Surf::SetContourLimits(zlow,zhigh);
      Surf::SetSurfaceLevelLimits(zlow,zhigh);
      Surf::SetSurfaceAxesIntervals(0.0,0.0,5.0);
      Surf::SetPerspProjection(data_3D,(double __gc *)&radius,theta,phi);
/*  Set level on contour and display */
      Surf::SetContourMapHeight(Switch::GON,zbase);
      if(ndt > 1) {
         key = Switch::GON;
         Surf::FillGriddedContourMap(data_limit,NUMX,NUMY,gridz,
                   NCONT,ContourSwitch::GSTRAIGHT,index1,key,&work);
      } else {
         key = Switch::GOFF;
         Surf::DrawGriddedContourMap(data_limit,NUMX,NUMY,gridz,
                   NCONT,ContourSwitch::GSTRAIGHT,&work);
      }
/*  Add projected surface, surface profile and annotate axes */
      Surf::SetSurfaceAxesStyle(style,supress);
      Surf::DrawLineStyleSurface(data_limit,NUMX,NUMY, gridz,
                     (double __gc *)&radius, theta, phi, NCONT, index2, key, &work);
      Gino::SetLineColour(GBLACK);
      if(device_state->dddim == 2) Surf::ReturnSurfaceProfile((int __gc *)&npts,&profile,Visibility::GVISIBLE,&work);
      Surf::DrawSurfaceAxes(&work);
/*  Free up workspace and close down GINOSURF */
      Surf::FreeWorkspace(&work);
      Surf::CloseSurf();
/*  Draw frame and title */
      Gino::SetWindowMode(WindowingSwitch::GON2D);
      Gino::SetLineColour(Colour::GRED);
      Gino::SetCharSize(15.0,15.0);
      Gino::FillRect(FillStyle::GHOLLOW,LineStyle::GCURRENT,frame1);
      Gino::FillRect(FillStyle::GHOLLOW,LineStyle::GCURRENT,frame2);
      Gino::MoveTo2D(305.0,20.0);
      Gino::DisplayStr("GINOSURF Example Program 2");
      Gino::SetStrJustify(Justification::GCENTRE);
      Gino::MoveTo2D(500.0,700.0);
      Gino::DisplayStr("Projected Surface and Contour Map of Function");
/*  Close down the device and GINO */
      Gino::SuspendDevice();
      Gino::CloseGino();
      e->Graphics->ReleaseHdc(hdc);
/*  Close Program */
			 }
float zfunc (float x, float y)
{
	float z;
      z = 22.0*(Math::Cos((x-200.0)/300.0-1)*Math::Cos(y*0.05)+Math::Cos((x-140.0)
                *0.024)*Math::Sin(3.5-y/90.0)+3.1);
      return z;
}
	private: System::Void Form1_Resize(System::Object *  sender, System::EventArgs *  e)
			 {
			 }
};
}