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)
{
}
};
}