123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837 |
- using System;
- using System.ComponentModel;
- using System.Windows.Forms;
- using System.Diagnostics;
- using System.Runtime.InteropServices;
- using Tao.OpenGl;
- using Tao.Platform.Windows;
- using OpenCvSharp;
- using System.Collections.Generic;
- using System.Drawing;
- namespace PaintDotNet.Instrument
- {
- public partial class RegularTetrahedron3D : PdnBaseForm
- {
- private GroupBox groupBox1;
- //以下是所有接口变量
- public static int[] m_aiSquareRGB = new int[3] { 255, 0, 0 };//正方面颜色
- public static int[] m_aiTriangleRGB = new int[3] { 255, 0, 50 };//三角面颜色
- public static int[] m_aiEdgeRGB = new int[3] { 0, 0, 0 };//棱的颜色
- //public static double m_dEdgeLength = 100.0;//正十四面体的棱长
- public static double m_dScale = 1.0;//实际显示时的放大比例
- /*需要最大棱长的原因是:要建立一个不变的视场,保证每次显示时观察点远近方向都一样,
- 这样才能体现不同棱长十四面体的区别,也可设置为一个比较大的经验值。*/
- public static double m_dMaxLength = 200.0;//可能存在的最大棱长
- //以下是内部参数
- private static double m_dHalfCubeLength = 100.0;
- private static float[] m_afRealSRGB = new float[3] { 1.0f, 0, 0 };
- private static float[] m_afRealTRGB = new float[3] { 1.0f, 0, 0.5f };
- private static float[] m_afRealERGB = new float[3] { 0, 0, 0 };
- // --- Fields ---
- private static IntPtr hDC; // Private GDI Device Context
- private static IntPtr hRC; // Permanent Rendering Context
- private static RegularTetrahedron3D form; // Our Current Windows Form
- private static bool done = false; // Bool Variable To Exit Main Loop
- int m_iMusMod = 0;// 1;//0;
- public System.Windows.Forms.PictureBox pictureBox1;
- int m_iMusDown = 1;//##0;
- int m_iLastmouseX, m_iLastmouseY;
- int m_iLastMusDown = 0;
- float[] m_fR_xyz = new float[3] { 10.0F, 0.0F, 0.0F };
- float[] m_fT_xyz = new float[3] { 0.0F, 0.0F, 0.0F };
- public static double m1_dEdgeLength = 100.0;//正十四面体的棱长
- //private AppWorkspace appWorkspace;
- /// <summary>
- /// 三维数据
- /// </summary>
- private Base.SettingModel.ThreeDataDemoModel threeDataDemo;
- ////new platform
- //private System.Windows.Forms.PictureBox pictureBox1;
- //int m_iMusDown = 0;
- //zzz
- public static/* const*/ int LINE_PNTS = 100;
- ////Glfw.GLFWkeyfun m_funKeyCallBak;
- ////Glfw.GLFWmousebuttonfun m_funMsBtnCallBak;
- ////Glfw.GLFWmouseposfun m_funMsPosCallBak;
- //int m_iMusMod = 1;//0;
- //int m_iLastmouseX, m_iLastmouseY;
- //int m_iLastMusDown = 0;
- //float[] m_fR_xyz = new float[3] { 0.0F, 0.0F, 0.0F };
- //float[] m_fT_xyz = new float[3] { 0.0F, 0.0F, 0.0F };
- bool m_bOverTurn = false;
- float[] m_afPonitA = new float[2] { 1.0F, 1.0F };
- float[] m_afPonitB = new float[2] { 1.0F, 1.0F };
- float[] m_afLineStep = new float[2] { 0.0F, 0.0F };
- float[,] m_afLineXY = new float[/*LINE_PNTS - 2*/98, 2];
- double[] m_adLineZV = new double[/*LINE_PNTS*/100];
- double[] m_adLineOverTurnZV = new double[/*LINE_PNTS*/100];
- //SRLinesForm m_fmLine;
- internal RegularTetrahedron3D(double m0_dEdgeLength)
- {
- m1_dEdgeLength = m0_dEdgeLength;
- InitializeComponent();
- InitializeLanguageText();
- m_dHalfCubeLength = m1_dEdgeLength * m_dScale * 0.7071/*sqrt(1/2)*/;
- m_afRealSRGB[0] = (float)(Math.Min(Math.Max(m_aiSquareRGB[0] / 255.0, 0.0), 1.0));
- m_afRealSRGB[1] = (float)(Math.Min(Math.Max(m_aiSquareRGB[1] / 255.0, 0.0), 1.0));
- m_afRealSRGB[2] = (float)(Math.Min(Math.Max(m_aiSquareRGB[2] / 255.0, 0.0), 1.0));
- m_afRealTRGB[0] = (float)(Math.Min(Math.Max(m_aiTriangleRGB[0] / 255.0, 0.0), 1.0));
- m_afRealTRGB[1] = (float)(Math.Min(Math.Max(m_aiTriangleRGB[1] / 255.0, 0.0), 1.0));
- m_afRealTRGB[2] = (float)(Math.Min(Math.Max(m_aiTriangleRGB[2] / 255.0, 0.0), 1.0));
- m_afRealERGB[0] = (float)(Math.Min(Math.Max(m_aiEdgeRGB[0] / 255.0, 0.0), 1.0));
- m_afRealERGB[1] = (float)(Math.Min(Math.Max(m_aiEdgeRGB[1] / 255.0, 0.0), 1.0));
- m_afRealERGB[2] = (float)(Math.Min(Math.Max(m_aiEdgeRGB[2] / 255.0, 0.0), 1.0));
- this.CreateParams.ClassStyle = this.CreateParams.ClassStyle | // Redraw On Size, And Own DC For Window.
- User.CS_HREDRAW | User.CS_VREDRAW | User.CS_OWNDC;
- this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); // No Need To Erase Form Background
- this.SetStyle(ControlStyles.DoubleBuffer, true); // Buffer Control
- //zzz this.SetStyle(ControlStyles.Opaque, true); // No Need To Draw Form Background
- this.SetStyle(ControlStyles.ResizeRedraw, true); // Redraw On Resize
- this.SetStyle(ControlStyles.UserPaint, true); // We'll Handle Painting Ourselves
- //this.Activated += new EventHandler(this.Form_Activated); // On Activate Event Call Form_Activated
- this.Closing += new CancelEventHandler(this.Form_Closing); // On Closing Event Call Form_Closing
- //this.Deactivate += new EventHandler(this.Form_Deactivate); // On Deactivate Event Call Form_Deactivate
- //this.KeyUp += new KeyEventHandler(this.Form_KeyUp); // On KeyUp Event Call Form_KeyUp
- this.Resize += new EventHandler(this.Form_Resize);
- //this.Close();
- //ReadPar();
- }
- private void InitializeLanguageText()
- {
- this.groupBox1.Text = "";// "三维图像";
- this.Text = PdnResources.GetString("Menu.Tools.SurfacePlot.Text");
- }
- /// <summary>
- /// 初始化基础控件
- /// </summary>
- public void InitializeComponent()
- {
- this.groupBox1 = new System.Windows.Forms.GroupBox();
- this.SuspendLayout();
- //
- // groupBox1
- //
- this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
- | System.Windows.Forms.AnchorStyles.Left)));
- this.groupBox1.Location = new System.Drawing.Point(20, 20);
- this.groupBox1.Margin = new System.Windows.Forms.Padding(4);
- this.groupBox1.Name = "groupBox1";
- this.groupBox1.Padding = new System.Windows.Forms.Padding(4);
- this.groupBox1.Size = new System.Drawing.Size(588, 424);
- this.groupBox1.TabIndex = 1;
- this.groupBox1.TabStop = false;
- //
- // RegularTetrahedron3D
- //
- this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(632, 465);
- this.Controls.Add(this.groupBox1);
- this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
- this.Margin = new System.Windows.Forms.Padding(4);
- this.MaximizeBox = false;
- this.MaximumSize = new System.Drawing.Size(648, 504);
- this.MinimizeBox = false;
- this.MinimumSize = new System.Drawing.Size(648, 504);
- this.Name = "RegularTetrahedron3D";
- this.Text = "RegularTetrahedron3D";
- this.Load += new System.EventHandler(this.RegularTetrahedron3D_Load);
- this.Controls.SetChildIndex(this.groupBox1, 0);
- this.ResumeLayout(false);
- }
- private static void PictureBox1_Paint(object sender, PaintEventArgs e)
- {
- //Application.DoEvents(); // Process Events
- //// Draw The Scene. Watch For ESC Key And Quit Messages From DrawGLScene()
- //if ((active && (form != null) && !DrawGLScene()) /*|| keys[(int) Keys.Escape]*/)
- //{ // Active? Was There A Quit Received?
- // done = true; // ESC Or DrawGLScene Signalled A Quit
- //}
- //else
- //{ // Not Time To Quit, Update Screen
- // Gdi.SwapBuffers(hDC); // Swap Buffers (Double Buffering)
- //}
- }
- internal static int GetStatus()
- {
- if (form != null)
- { // Do We Have A Windows Form?
- //form.Hide(); // Hide The Window
- //form.Close(); // Close The Form
- //form = null; // Set form To Null
- return 1;
- }
- return -1;
- }
- /// <summary>
- /// 更新正十四面体的棱长
- /// </summary>
- /// <param name="m0_dEdgeLength"></param>
- internal static void UpdateRun(double m0_dEdgeLength)
- {
- m1_dEdgeLength = m0_dEdgeLength;
- m_dHalfCubeLength = m1_dEdgeLength * m_dScale * 0.7071/*sqrt(1/2)*/;
- //m_afRealSRGB[0] = (float)(Math.Min(Math.Max(m_aiSquareRGB[0] / 255.0, 0.0), 1.0));
- //m_afRealSRGB[1] = (float)(Math.Min(Math.Max(m_aiSquareRGB[1] / 255.0, 0.0), 1.0));
- //m_afRealSRGB[2] = (float)(Math.Min(Math.Max(m_aiSquareRGB[2] / 255.0, 0.0), 1.0));
- //m_afRealTRGB[0] = (float)(Math.Min(Math.Max(m_aiTriangleRGB[0] / 255.0, 0.0), 1.0));
- //m_afRealTRGB[1] = (float)(Math.Min(Math.Max(m_aiTriangleRGB[1] / 255.0, 0.0), 1.0));
- //m_afRealTRGB[2] = (float)(Math.Min(Math.Max(m_aiTriangleRGB[2] / 255.0, 0.0), 1.0));
- //m_afRealERGB[0] = (float)(Math.Min(Math.Max(m_aiEdgeRGB[0] / 255.0, 0.0), 1.0));
- //m_afRealERGB[1] = (float)(Math.Min(Math.Max(m_aiEdgeRGB[1] / 255.0, 0.0), 1.0));
- //m_afRealERGB[2] = (float)(Math.Min(Math.Max(m_aiEdgeRGB[2] / 255.0, 0.0), 1.0));
- }
- internal static void Run(double m0_dEdgeLength) {
- done = false;
- // Create Our OpenGL Window //# 640, 480, 16
- if (!CreateGLWindow(m0_dEdgeLength, "3D效果"/*PdnResources.GetString("Menu.Tools.SurfacePlot.Text")*/, 990, 690, 16)) {
- return; // Quit If Window Was Not Created
- }
- while (!done)
- { // Loop That Runs While done = false
- Application.DoEvents(); // Process Events
- // Draw The Scene. Watch For ESC Key And Quit Messages From DrawGLScene()
- if ((/* //# active && */(form != null) && !DrawGLScene()) /*|| keys[(int) Keys.Escape]*/)
- { // Active? Was There A Quit Received?
- done = true; // ESC Or DrawGLScene Signalled A Quit
- }
- else
- { // Not Time To Quit, Update Screen
- Gdi.SwapBuffers(hDC); // Swap Buffers (Double Buffering)
- }
- /*
- if(keys[(int) Keys.F1]) { // Is F1 Being Pressed?
- keys[(int) Keys.F1] = false; // If So Make Key false
- KillGLWindow(); // Kill Our Current Window
- // Recreate Our OpenGL Window
- if(!CreateGLWindow("三维面绘制", 640, 480, 16)) {
- return; // Quit If Window Was Not Created
- }
- done = false; // We're Not Done Yet
- }
- */
- }
- // Shutdown
- KillGLWindow(); // Kill The Window
- return; // Exit The Program
- }
- private static bool CreateGLWindow(double m0_dEdgeLength, string title, int width, int height, int bits)
- {
- int pixelFormat; // Holds The Results After Searching For A Match
- form = null; // Null The Form
- GC.Collect(); // Request A Collection
- // This Forces A Swap
- Kernel.SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
- form = new RegularTetrahedron3D(m0_dEdgeLength); // Create The Window
- form.FormBorderStyle = FormBorderStyle.Sizable; // Sizable
- Cursor.Show(); // Show Mouse Pointer
- form.Width = width; // Set Window Width
- form.Height = height; // Set Window Height
- form.Text = title; // Set Window Title
- Gdi.PIXELFORMATDESCRIPTOR pfd = new Gdi.PIXELFORMATDESCRIPTOR(); // pfd Tells Windows How We Want Things To Be
- pfd.nSize = (short) Marshal.SizeOf(pfd); // Size Of This Pixel Format Descriptor
- pfd.nVersion = 1; // Version Number
- pfd.dwFlags = Gdi.PFD_DRAW_TO_WINDOW | // Format Must Support Window
- Gdi.PFD_SUPPORT_OPENGL | // Format Must Support OpenGL
- Gdi.PFD_DOUBLEBUFFER; // Format Must Support Double Buffering
- pfd.iPixelType = (byte) Gdi.PFD_TYPE_RGBA; // Request An RGBA Format
- pfd.cColorBits = (byte) bits; // Select Our Color Depth
- pfd.cRedBits = 0; // Color Bits Ignored
- pfd.cRedShift = 0;
- pfd.cGreenBits = 0;
- pfd.cGreenShift = 0;
- pfd.cBlueBits = 0;
- pfd.cBlueShift = 0;
- pfd.cAlphaBits = 0; // No Alpha Buffer
- pfd.cAlphaShift = 0; // Shift Bit Ignored
- pfd.cAccumBits = 0; // No Accumulation Buffer
- pfd.cAccumRedBits = 0; // Accumulation Bits Ignored
- pfd.cAccumGreenBits = 0;
- pfd.cAccumBlueBits = 0;
- pfd.cAccumAlphaBits = 0;
- pfd.cDepthBits = 16; // 16Bit Z-Buffer (Depth Buffer)
- pfd.cStencilBits = 0; // No Stencil Buffer
- pfd.cAuxBuffers = 0; // No Auxiliary Buffer
- pfd.iLayerType = (byte) Gdi.PFD_MAIN_PLANE; // Main Drawing Layer
- pfd.bReserved = 0; // Reserved
- pfd.dwLayerMask = 0; // Layer Masks Ignored
- pfd.dwVisibleMask = 0;
- pfd.dwDamageMask = 0;
- //hDC = User.GetDC(form.Handle); // Attempt To Get A Device Context
- form.pictureBox1 = new PictureBox();
- ((System.ComponentModel.ISupportInitialize)(form.pictureBox1)).BeginInit();
- //form.pictureBox1.Location = new System.Drawing.Point(22, 40);
- //form.pictureBox1.Location = new System.Drawing.Point(20, 180);
- form.pictureBox1.Location = new System.Drawing.Point(15, 18);
- form.pictureBox1.Name = "pictureBox1";
- form.pictureBox1.Size = new System.Drawing.Size(560, 400);
- //# form.pictureBox1.Size = new System.Drawing.Size(1272, 651);
- form.pictureBox1.TabIndex = 0;
- form.pictureBox1.TabStop = false;
- /*form*/form.groupBox1.Controls.Add(form.pictureBox1);
- ((System.ComponentModel.ISupportInitialize)(form.pictureBox1)).EndInit();
- form.pictureBox1.Paint += PictureBox1_Paint;
- form.pictureBox1.MouseMove += new MouseEventHandler(form.pictureBox1_MouseMove);
- form.pictureBox1.MouseDown += new MouseEventHandler(form.pictureBox1_MouseDown);
- form.pictureBox1.MouseUp += new MouseEventHandler(form.pictureBox1_MouseUp);
- form.pictureBox1.MouseLeave += new EventHandler(form.pictureBox1_MouseLeave);
- hDC = User.GetDC(form.pictureBox1.Handle);
- if(hDC == IntPtr.Zero) { // Did We Get A Device Context?
- KillGLWindow(); // Reset The Display
- MessageBox.Show("Can't Create A GL Device Context.", "ERROR",
- MessageBoxButtons.OK, MessageBoxIcon.Error);
- return false;
- }
- pixelFormat = Gdi.ChoosePixelFormat(hDC, ref pfd); // Attempt To Find An Appropriate Pixel Format
- if(pixelFormat == 0) { // Did Windows Find A Matching Pixel Format?
- KillGLWindow(); // Reset The Display
- MessageBox.Show("Can't Find A Suitable PixelFormat.", "ERROR",
- MessageBoxButtons.OK, MessageBoxIcon.Error);
- return false;
- }
- if(!Gdi.SetPixelFormat(hDC, pixelFormat, ref pfd)) { // Are We Able To Set The Pixel Format?
- KillGLWindow(); // Reset The Display
- MessageBox.Show("Can't Set The PixelFormat.", "ERROR",
- MessageBoxButtons.OK, MessageBoxIcon.Error);
- return false;
- }
- hRC = Wgl.wglCreateContext(hDC); // Attempt To Get The Rendering Context
- if(hRC == IntPtr.Zero) { // Are We Able To Get A Rendering Context?
- KillGLWindow(); // Reset The Display
- MessageBox.Show("Can't Create A GL Rendering Context.", "ERROR",
- MessageBoxButtons.OK, MessageBoxIcon.Error);
- return false;
- }
- if(!Wgl.wglMakeCurrent(hDC, hRC)) { // Try To Activate The Rendering Context
- KillGLWindow(); // Reset The Display
- MessageBox.Show("Can't Activate The GL Rendering Context.", "ERROR",
- MessageBoxButtons.OK, MessageBoxIcon.Error);
- return false;
- }
- form.Show(); // Show The Window
- //zzz form.TopMost = true; // Topmost Window
- form.Focus(); // Focus The Window
- //# form.BackColor = Color.Gray;
- //# //# form.WindowState = FormWindowState.Maximized;
- ReSizeGLScene(width, height); // Set Up Our Perspective GL Screen
- if (!InitGL())
- { // Initialize Our Newly Created GL Window
- KillGLWindow(); // Reset The Display
- MessageBox.Show("Initialization Failed.", "ERROR",
- MessageBoxButtons.OK, MessageBoxIcon.Error);
- return false;
- }
-
- return true; // Success
- }
- private static bool DrawGLScene()
- {
- //new platform
- iniView();
- Gl.glTranslatef(0, 0, 0);
- myRotate();
- ////错了 Gl.glTranslatef(m_fT_xyz[0],m_fT_xyz[1],0);
- //for (int i = 0; i < form.m_iWidth - 1; i++)
- //{
- // Gl.glBegin(Gl.GL_TRIANGLE_STRIP);
- // for (int j = 0; j < form.m_iHeight; j++)
- // {
- // DrowOnePnt(i, j);
- // DrowOnePnt(i + 1, j);
- // }
- // Gl.glEnd();
- //}
- ////if ((form.m_iMusMod >= 5) && (form.m_iMusMod <= 7) || true)
- ////{
- //// Gl.glBegin(Gl.GL_QUADS);
- //// Gl.glColor3f(1.0F, 1.0F, 0.0F);
- //// Gl.glVertex3d(form.m_afPonitA[0] - 10 - form.m_iWidth / 2.0, form.m_afPonitA[1] - 10 - form.m_iHeight / 2.0, 1.0 + form.m_adThisLineZV[0] - (form.m_dMaxZV + form.m_dMinZV) / 2.0);
- //// Gl.glVertex3d(form.m_afPonitA[0] + 10 - form.m_iWidth / 2.0, form.m_afPonitA[1] - 10 - form.m_iHeight / 2.0, 1.0 + form.m_adThisLineZV[0] - (form.m_dMaxZV + form.m_dMinZV) / 2.0);
- //// Gl.glVertex3d(form.m_afPonitA[0] + 10 - form.m_iWidth / 2.0, form.m_afPonitA[1] + 10 - form.m_iHeight / 2.0, 1.0 + form.m_adThisLineZV[0] - (form.m_dMaxZV + form.m_dMinZV) / 2.0);
- //// Gl.glVertex3d(form.m_afPonitA[0] - 10 - form.m_iWidth / 2.0, form.m_afPonitA[1] + 10 - form.m_iHeight / 2.0, 1.0 + form.m_adThisLineZV[0] - (form.m_dMaxZV + form.m_dMinZV) / 2.0);
- //// Gl.glEnd();
- //// Gl.glBegin(Gl.GL_LINE_STRIP);
- //// Gl.glColor3f(0.0F, 1.0F, 0.0F);
- //// Gl.glVertex3d(form.m_afPonitA[0] - form.m_iWidth / 2.0, form.m_afPonitA[1] - form.m_iHeight / 2.0, 1.0 + form.m_adThisLineZV[0] - (form.m_dMaxZV + form.m_dMinZV) / 2.0);
- //// for (int i = 0; i < (LINE_PNTS - 2); i++)
- //// {
- //// Gl.glVertex3d(form.m_afLineXY[i, 0] - form.m_iWidth / 2.0, form.m_afLineXY[i, 1] - form.m_iHeight / 2.0, 1.0 + /*form.m_adThisZV[(int)form.m_afLineXY[i, 0], (int)form.m_afLineXY[i, 1]]*/form.m_adThisLineZV[i + 1] - (form.m_dMaxZV + form.m_dMinZV) / 2.0);
- //// }
- //// Gl.glVertex3d(form.m_afPonitB[0] - form.m_iWidth / 2.0, form.m_afPonitB[1] - form.m_iHeight / 2.0, 1.0 + form.m_adThisLineZV[LINE_PNTS - 1] - (form.m_dMaxZV + form.m_dMinZV) / 2.0);
- //// Gl.glEnd();
- //// Gl.glBegin(Gl.GL_QUADS);
- //// Gl.glColor3f(0.0F, 1.0F, 01.0F);
- //// Gl.glVertex3d(form.m_afPonitB[0] - 10 - form.m_iWidth / 2.0, form.m_afPonitB[1] - 10 - form.m_iHeight / 2.0, 1.0 + form.m_adThisLineZV[LINE_PNTS - 1] - (form.m_dMaxZV + form.m_dMinZV) / 2.0);
- //// Gl.glVertex3d(form.m_afPonitB[0] + 10 - form.m_iWidth / 2.0, form.m_afPonitB[1] - 10 - form.m_iHeight / 2.0, 1.0 + form.m_adThisLineZV[LINE_PNTS - 1] - (form.m_dMaxZV + form.m_dMinZV) / 2.0);
- //// Gl.glVertex3d(form.m_afPonitB[0] + 10 - form.m_iWidth / 2.0, form.m_afPonitB[1] + 10 - form.m_iHeight / 2.0, 1.0 + form.m_adThisLineZV[LINE_PNTS - 1] - (form.m_dMaxZV + form.m_dMinZV) / 2.0);
- //// Gl.glVertex3d(form.m_afPonitB[0] - 10 - form.m_iWidth / 2.0, form.m_afPonitB[1] + 10 - form.m_iHeight / 2.0, 1.0 + form.m_adThisLineZV[LINE_PNTS - 1] - (form.m_dMaxZV + form.m_dMinZV) / 2.0);
- //// Gl.glEnd();
- ////}
- ///
- Gl.glBegin(Gl.GL_QUADS);
- Gl.glColor3f(m_afRealSRGB[0], m_afRealSRGB[1], m_afRealSRGB[2]);
- Gl.glVertex3d(m_dHalfCubeLength, 0, m_dHalfCubeLength);
- Gl.glVertex3d(0, m_dHalfCubeLength, m_dHalfCubeLength);
- Gl.glVertex3d(-m_dHalfCubeLength, 0, m_dHalfCubeLength);
- Gl.glVertex3d(0, -m_dHalfCubeLength, m_dHalfCubeLength);
- Gl.glVertex3d(m_dHalfCubeLength, 0, -m_dHalfCubeLength);
- Gl.glVertex3d(0, m_dHalfCubeLength, -m_dHalfCubeLength);
- Gl.glVertex3d(-m_dHalfCubeLength, 0, -m_dHalfCubeLength);
- Gl.glVertex3d(0, -m_dHalfCubeLength, -m_dHalfCubeLength);
- Gl.glVertex3d(m_dHalfCubeLength, 0, m_dHalfCubeLength);
- Gl.glVertex3d(m_dHalfCubeLength, m_dHalfCubeLength, 0);
- Gl.glVertex3d(m_dHalfCubeLength, 0, -m_dHalfCubeLength);
- Gl.glVertex3d(m_dHalfCubeLength, -m_dHalfCubeLength, 0);
- Gl.glVertex3d(-m_dHalfCubeLength, 0, m_dHalfCubeLength);
- Gl.glVertex3d(-m_dHalfCubeLength, m_dHalfCubeLength, 0);
- Gl.glVertex3d(-m_dHalfCubeLength, 0, -m_dHalfCubeLength);
- Gl.glVertex3d(-m_dHalfCubeLength, -m_dHalfCubeLength, 0);
- Gl.glVertex3d(0, m_dHalfCubeLength, m_dHalfCubeLength);
- Gl.glVertex3d(m_dHalfCubeLength, m_dHalfCubeLength, 0);
- Gl.glVertex3d(0, m_dHalfCubeLength, -m_dHalfCubeLength);
- Gl.glVertex3d(-m_dHalfCubeLength, m_dHalfCubeLength, 0);
- Gl.glVertex3d(0, -m_dHalfCubeLength, m_dHalfCubeLength);
- Gl.glVertex3d(m_dHalfCubeLength, -m_dHalfCubeLength, 0);
- Gl.glVertex3d(0, -m_dHalfCubeLength, -m_dHalfCubeLength);
- Gl.glVertex3d(-m_dHalfCubeLength, -m_dHalfCubeLength, 0);
- Gl.glEnd();
- Gl.glBegin(Gl.GL_TRIANGLES);
- Gl.glColor3f(m_afRealTRGB[0], m_afRealTRGB[1], m_afRealTRGB[2]);
- Gl.glVertex3d(m_dHalfCubeLength, 0, m_dHalfCubeLength);
- Gl.glVertex3d(m_dHalfCubeLength, m_dHalfCubeLength, 0);
- Gl.glVertex3d(0, m_dHalfCubeLength, m_dHalfCubeLength);
- Gl.glVertex3d(-m_dHalfCubeLength, 0, -m_dHalfCubeLength);
- Gl.glVertex3d(-m_dHalfCubeLength, -m_dHalfCubeLength, 0);
- Gl.glVertex3d(0, -m_dHalfCubeLength, -m_dHalfCubeLength);
- Gl.glVertex3d(0, m_dHalfCubeLength, m_dHalfCubeLength);
- Gl.glVertex3d(-m_dHalfCubeLength, m_dHalfCubeLength, 0);
- Gl.glVertex3d(-m_dHalfCubeLength, 0, m_dHalfCubeLength);
- Gl.glVertex3d(0, -m_dHalfCubeLength, -m_dHalfCubeLength);
- Gl.glVertex3d(m_dHalfCubeLength, -m_dHalfCubeLength, 0);
- Gl.glVertex3d(m_dHalfCubeLength, 0, -m_dHalfCubeLength);
- Gl.glVertex3d(-m_dHalfCubeLength, 0, m_dHalfCubeLength);
- Gl.glVertex3d(-m_dHalfCubeLength, -m_dHalfCubeLength, 0);
- Gl.glVertex3d(0, -m_dHalfCubeLength, m_dHalfCubeLength);
- Gl.glVertex3d(m_dHalfCubeLength, 0, -m_dHalfCubeLength);
- Gl.glVertex3d(m_dHalfCubeLength, m_dHalfCubeLength, 0);
- Gl.glVertex3d(0, m_dHalfCubeLength, -m_dHalfCubeLength);
- Gl.glVertex3d(0, -m_dHalfCubeLength, m_dHalfCubeLength);
- Gl.glVertex3d(m_dHalfCubeLength, -m_dHalfCubeLength, 0);
- Gl.glVertex3d(m_dHalfCubeLength, 0, m_dHalfCubeLength);
- Gl.glVertex3d(0, m_dHalfCubeLength, -m_dHalfCubeLength);
- Gl.glVertex3d(-m_dHalfCubeLength, m_dHalfCubeLength, 0);
- Gl.glVertex3d(-m_dHalfCubeLength, 0, -m_dHalfCubeLength);
- Gl.glEnd();
- Gl.glLineWidth(2);
- Gl.glColor3f(m_afRealERGB[0], m_afRealERGB[1], m_afRealERGB[2]);
- Gl.glBegin(Gl.GL_LINE_STRIP);
- Gl.glVertex3d(m_dHalfCubeLength, 0, m_dHalfCubeLength);
- Gl.glVertex3d(0, m_dHalfCubeLength, m_dHalfCubeLength);
- Gl.glVertex3d(-m_dHalfCubeLength, 0, m_dHalfCubeLength);
- Gl.glVertex3d(0, -m_dHalfCubeLength, m_dHalfCubeLength);
- Gl.glVertex3d(m_dHalfCubeLength, 0, m_dHalfCubeLength);
- Gl.glEnd();
- Gl.glBegin(Gl.GL_LINE_STRIP);
- Gl.glVertex3d(m_dHalfCubeLength, 0, -m_dHalfCubeLength);
- Gl.glVertex3d(0, m_dHalfCubeLength, -m_dHalfCubeLength);
- Gl.glVertex3d(-m_dHalfCubeLength, 0, -m_dHalfCubeLength);
- Gl.glVertex3d(0, -m_dHalfCubeLength, -m_dHalfCubeLength);
- Gl.glVertex3d(m_dHalfCubeLength, 0, -m_dHalfCubeLength);
- Gl.glEnd();
- Gl.glBegin(Gl.GL_LINE_STRIP);
- Gl.glVertex3d(m_dHalfCubeLength, 0, m_dHalfCubeLength);
- Gl.glVertex3d(m_dHalfCubeLength, m_dHalfCubeLength, 0);
- Gl.glVertex3d(m_dHalfCubeLength, 0, -m_dHalfCubeLength);
- Gl.glVertex3d(m_dHalfCubeLength, -m_dHalfCubeLength, 0);
- Gl.glVertex3d(m_dHalfCubeLength, 0, m_dHalfCubeLength);
- Gl.glEnd();
- Gl.glBegin(Gl.GL_LINE_STRIP);
- Gl.glVertex3d(-m_dHalfCubeLength, 0, m_dHalfCubeLength);
- Gl.glVertex3d(-m_dHalfCubeLength, m_dHalfCubeLength, 0);
- Gl.glVertex3d(-m_dHalfCubeLength, 0, -m_dHalfCubeLength);
- Gl.glVertex3d(-m_dHalfCubeLength, -m_dHalfCubeLength, 0);
- Gl.glVertex3d(-m_dHalfCubeLength, 0, m_dHalfCubeLength);
- Gl.glEnd();
- Gl.glBegin(Gl.GL_LINE_STRIP);
- Gl.glVertex3d(0, m_dHalfCubeLength, m_dHalfCubeLength);
- Gl.glVertex3d(m_dHalfCubeLength, m_dHalfCubeLength, 0);
- Gl.glVertex3d(0, m_dHalfCubeLength, -m_dHalfCubeLength);
- Gl.glVertex3d(-m_dHalfCubeLength, m_dHalfCubeLength, 0);
- Gl.glVertex3d(0, m_dHalfCubeLength, m_dHalfCubeLength);
- Gl.glEnd();
- Gl.glBegin(Gl.GL_LINE_STRIP);
- Gl.glVertex3d(0, -m_dHalfCubeLength, m_dHalfCubeLength);
- Gl.glVertex3d(m_dHalfCubeLength, -m_dHalfCubeLength, 0);
- Gl.glVertex3d(0, -m_dHalfCubeLength, -m_dHalfCubeLength);
- Gl.glVertex3d(-m_dHalfCubeLength, -m_dHalfCubeLength, 0);
- Gl.glVertex3d(0, -m_dHalfCubeLength, m_dHalfCubeLength);
- Gl.glEnd();
- Gl.glBegin(Gl.GL_LINE_STRIP);
- Gl.glVertex3d(m_dHalfCubeLength, 0, m_dHalfCubeLength);
- Gl.glVertex3d(m_dHalfCubeLength, m_dHalfCubeLength, 0);
- Gl.glVertex3d(0, m_dHalfCubeLength, m_dHalfCubeLength);
- Gl.glVertex3d(m_dHalfCubeLength, 0, m_dHalfCubeLength);
- Gl.glEnd();
- Gl.glBegin(Gl.GL_LINE_STRIP);
- Gl.glVertex3d(-m_dHalfCubeLength, 0, -m_dHalfCubeLength);
- Gl.glVertex3d(-m_dHalfCubeLength, -m_dHalfCubeLength, 0);
- Gl.glVertex3d(0, -m_dHalfCubeLength, -m_dHalfCubeLength);
- Gl.glVertex3d(-m_dHalfCubeLength, 0, -m_dHalfCubeLength);
- Gl.glEnd();
- Gl.glBegin(Gl.GL_LINE_STRIP);
- Gl.glVertex3d(0, m_dHalfCubeLength, m_dHalfCubeLength);
- Gl.glVertex3d(-m_dHalfCubeLength, m_dHalfCubeLength, 0);
- Gl.glVertex3d(-m_dHalfCubeLength, 0, m_dHalfCubeLength);
- Gl.glVertex3d(0, m_dHalfCubeLength, m_dHalfCubeLength);
- Gl.glEnd();
- Gl.glBegin(Gl.GL_LINE_STRIP);
- Gl.glVertex3d(0, -m_dHalfCubeLength, -m_dHalfCubeLength);
- Gl.glVertex3d(m_dHalfCubeLength, -m_dHalfCubeLength, 0);
- Gl.glVertex3d(m_dHalfCubeLength, 0, -m_dHalfCubeLength);
- Gl.glVertex3d(0, -m_dHalfCubeLength, -m_dHalfCubeLength);
- Gl.glEnd();
- Gl.glBegin(Gl.GL_LINE_STRIP);
- Gl.glVertex3d(-m_dHalfCubeLength, 0, m_dHalfCubeLength);
- Gl.glVertex3d(-m_dHalfCubeLength, -m_dHalfCubeLength, 0);
- Gl.glVertex3d(0, -m_dHalfCubeLength, m_dHalfCubeLength);
- Gl.glVertex3d(-m_dHalfCubeLength, 0, m_dHalfCubeLength);
- Gl.glEnd();
- Gl.glBegin(Gl.GL_LINE_STRIP);
- Gl.glVertex3d(m_dHalfCubeLength, 0, -m_dHalfCubeLength);
- Gl.glVertex3d(m_dHalfCubeLength, m_dHalfCubeLength, 0);
- Gl.glVertex3d(0, m_dHalfCubeLength, -m_dHalfCubeLength);
- Gl.glVertex3d(m_dHalfCubeLength, 0, -m_dHalfCubeLength);
- Gl.glEnd();
- Gl.glBegin(Gl.GL_LINE_STRIP);
- Gl.glVertex3d(0, -m_dHalfCubeLength, m_dHalfCubeLength);
- Gl.glVertex3d(m_dHalfCubeLength, -m_dHalfCubeLength, 0);
- Gl.glVertex3d(m_dHalfCubeLength, 0, m_dHalfCubeLength);
- Gl.glVertex3d(0, -m_dHalfCubeLength, m_dHalfCubeLength);
- Gl.glEnd();
- Gl.glBegin(Gl.GL_LINE_STRIP);
- Gl.glVertex3d(0, m_dHalfCubeLength, -m_dHalfCubeLength);
- Gl.glVertex3d(-m_dHalfCubeLength, m_dHalfCubeLength, 0);
- Gl.glVertex3d(-m_dHalfCubeLength, 0, -m_dHalfCubeLength);
- Gl.glVertex3d(0, m_dHalfCubeLength, -m_dHalfCubeLength);
- Gl.glEnd();
- Gl.glLoadIdentity();
- return true;
- }
- private static void myRotate()
- {
- int[,] vec = new int[3, 3] { { 1, 0, 0 }, { 0, 1, 0 }, { 0, 0, 1 } };
- for (int i = 0; i <= 2; i++)
- {
- Gl.glRotatef(form.m_fR_xyz[i], vec[i, 0], vec[i, 1], vec[i, 2]);
- }
- }
- private static bool InitGL()
- {
- ////Gl.glShadeModel(Gl.GL_SMOOTH); // Enable Smooth Shading
- ////Gl.glClearColor(0, 0, 0, 0.5f); // Black Background
- ////Gl.glClearDepth(1); // Depth Buffer Setup
- //Gl.glEnable(Gl.GL_DEPTH_TEST); //# // Enables Depth Testing
- ////Gl.glDepthFunc(Gl.GL_LEQUAL); // The Type Of Depth Testing To Do
- ////Gl.glHint(Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST); // Really Nice Perspective Calculations
- // 设置视口 viewport
- Gl.glViewport(0, 0, form.pictureBox1.Width, form.pictureBox1.Height);
- //启用阴影平滑
- Gl.glShadeModel(Gl.GL_SMOOTH);
- //启用反走样
- Gl.glHint(Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST);
- //21.01.25 启动深度测试
- Gl.glEnable(Gl.GL_DEPTH_TEST);
- // 设置投影模式 projection matrix
- Gl.glMatrixMode(Gl.GL_PROJECTION);
- Gl.glLoadIdentity();
- iniView();
-
- return true;
- }
- public static void iniView(bool clearColor = true)
- {
- //// 重置黑色背景
- //if (clearColor)
- //{
- // Gl.glClearColor((float)(0 / 255.0), (float)(0 / 255.0), (float)(0 / 255.0), (float)(255 / 255.0));
- // Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
- //}
- //else
- // return;
- // 重置黑色背景
- Gl.glClearColor(0, 0, 0, 0);
- //21.01.25 启动深度测试 Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
- Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
- //form.m_fT_xyz[2] = (float)Math.Max(form.m_dMaxZV, Math.Abs(form.m_dMinZV));
- //form.m_fT_xyz[2] = (float)(-1.0 * Math.Max(Math.Max(form.m_iWidth * 0.98, form.m_iHeight * 0.98), form.m_fT_xyz[2]));
- //////form.m_fT_xyz[2] = (float)(1.2 * form.m_fT_xyz[2]);
- //////Glu.gluPerspective(85, form.pictureBox1.Width / (double)form.pictureBox1.Height, 1, -4.0/*-2.0*/ * form.m_fT_xyz[2]);//距离裁减
- ////Gl.glOrtho(0, form.pictureBox1.Width, form.pictureBox1.Height, 0, 1, -4.0/*-2.0*/ * form.m_fT_xyz[2]);
- //double size1 = form.m_iHeight / 1.0;
- //Gl.glOrtho(-size1 * form.pictureBox1.Width / (double)form.pictureBox1.Height, size1 * form.pictureBox1.Width / (double)form.pictureBox1.Height, -size1, size1, 2.4 * form.m_fT_xyz[2], -2.4 * form.m_fT_xyz[2]);
- //// 选择模型观察矩阵 modelview matrix
- //Gl.glMatrixMode(Gl.GL_MODELVIEW);
- ////重置模型观察矩阵
- //Gl.glLoadIdentity();
- //Glu.gluLookAt(-1.0 * form.m_fT_xyz[0], -1.0 * form.m_fT_xyz[1], -1.0/*-1.0*/ * form.m_fT_xyz[2], // 眼睛位置
- // -1.0 * form.m_fT_xyz[0], -1.0 * form.m_fT_xyz[1], 0, // 观察点
- // 0, 1, 0);
- //###
- form.m_fT_xyz[2] = (float)(m_dMaxLength * 1.225/*sqrt(3/2)*/ * m_dScale);
- Glu.gluPerspective(65, form.pictureBox1.Width / (double)form.pictureBox1.Height, 1, -2.0 * form.m_fT_xyz[2]);//距离裁减
- // 选择模型观察矩阵 modelview matrix
- Gl.glMatrixMode(Gl.GL_MODELVIEW);
- //重置模型观察矩阵
- Gl.glLoadIdentity();
- Glu.gluLookAt(-1.0 * form.m_fT_xyz[0], -1.0 * form.m_fT_xyz[1], -1.0 * form.m_fT_xyz[2], // 眼睛位置
- -1.0 * form.m_fT_xyz[0], -1.0 * form.m_fT_xyz[1], 0, // 观察点
- 0, 1, 0);
- }
- private static void KillGLWindow() {
- if(hRC != IntPtr.Zero) { // Do We Have A Rendering Context?
- if(!Wgl.wglMakeCurrent(IntPtr.Zero, IntPtr.Zero)) { // Are We Able To Release The DC and RC Contexts?
- MessageBox.Show("Release Of DC And RC Failed.", "SHUTDOWN ERROR",
- MessageBoxButtons.OK, MessageBoxIcon.Error);
- }
- if(!Wgl.wglDeleteContext(hRC)) { // Are We Able To Delete The RC?
- MessageBox.Show("Release Rendering Context Failed.", "SHUTDOWN ERROR",
- MessageBoxButtons.OK, MessageBoxIcon.Error);
- }
- hRC = IntPtr.Zero; // Set RC To Null
- }
- if(hDC != IntPtr.Zero) { // Do We Have A Device Context?
- if(form != null && !form.IsDisposed) { // Do We Have A Window?
- if(form.Handle != IntPtr.Zero) { // Do We Have A Window Handle?
- if(!User.ReleaseDC(form.Handle, hDC)) { // Are We Able To Release The DC?
- MessageBox.Show("Release Device Context Failed.", "SHUTDOWN ERROR",
- MessageBoxButtons.OK, MessageBoxIcon.Error);
- }
- }
- }
- hDC = IntPtr.Zero; // Set DC To Null
- }
- if(form != null) { // Do We Have A Windows Form?
- form.Hide(); // Hide The Window
- form.Close(); // Close The Form
- form = null; // Set form To Null
- }
- }
- //#
- private static void ReSizeGLScene(int width, int height) {
- if(height == 0) { // Prevent A Divide By Zero...
- height = 1; // By Making Height Equal To One
- }
- Gl.glViewport(0, 0, width, height); // Reset The Current Viewport
- Gl.glMatrixMode(Gl.GL_PROJECTION); // Select The Projection Matrix
- Gl.glLoadIdentity(); // Reset The Projection Matrix
- Glu.gluPerspective(45, width / (double) height, 0.1, 100); // Calculate The Aspect Ratio Of The Window
- Gl.glMatrixMode(Gl.GL_MODELVIEW); // Select The Modelview Matrix
- Gl.glLoadIdentity(); // Reset The Modelview Matrix
- }
- private void Form_Closing(object sender, CancelEventArgs e)
- {
- done = true; // Send A Quit Message
- }
- //zzz
- public int m_iYVCount = 10;
- public double m_dYVMax = 51;
- public double m_dYVMin = -51;
- public int m_iYPixelMax = 350;
- public int m_iYPixelMin = 40;
- public int m_iXPixelMax = 1100;
- public int m_iXPixelMin = 60;
- /*
- private void Form_KeyUp(object sender, KeyEventArgs e) {
- keys[e.KeyValue] = false; // Key Has Been Released, Mark It As false
- }
- */
- private void Form_Resize(object sender, EventArgs e)
- {
- ReSizeGLScene(form.Width, form.Height); // Resize The OpenGL Window
- }
- private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
- {
- if ((m_iMusMod <= 0) || (m_iMusMod >= 3/* //# 7*/))
- {
- return;
- }
- //int iBtnDwn = Glfw.glfwGetMouseButton(Glfw.GLFW_MOUSE_BUTTON_LEFT);
- if (0 == m_iMusDown)
- {
- m_iLastMusDown = 0;
- return;
- }
- else if (0 == m_iLastMusDown)
- {
- m_iLastMusDown = 1;
- m_iLastmouseX = e.X;
- m_iLastmouseY = e.Y;
- return;
- }
- float fXChange = e.X - m_iLastmouseX;
- float fYChange = e.Y - m_iLastmouseY;
- m_fR_xyz[0] = AngleNormalization(m_fR_xyz[0]);
- m_fR_xyz[1] = AngleNormalization(m_fR_xyz[1]);
- if (1 == m_iMusMod)
- {
- if ((m_fR_xyz[0] > 90.0) && (m_fR_xyz[0] < 270.0))//先绕X轴转完了
- {
- fXChange *= -1.0F;
- }
- m_fR_xyz[0] -= fYChange;//21.01.25
- m_fR_xyz[1] += fXChange;
- //m_fR_xyz[2] = 0.0F;
- }
- else if (2 == m_iMusMod)
- {
- m_fT_xyz[0] += fXChange * 0.91F;
- m_fT_xyz[1] += fYChange * -0.91F;
- }
- m_iLastmouseX = e.X;
- m_iLastmouseY = e.Y;
- }
- private float AngleNormalization(float fOldAngle)
- {
- float fNewAngle = fOldAngle % 360.0F;
- if (fNewAngle < 0)
- {
- fNewAngle += 360.0F;
- }
- return fNewAngle;
- }
- private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
- {
- if (e.Button == MouseButtons.Left)
- {
- m_iMusDown = 1;
- }
- }
- private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
- {
- if (e.Button == MouseButtons.Left)
- {
- m_iMusDown = 0;
- }
- }
- private void RegularTetrahedron3D_Load(object sender, EventArgs e)
- {
- m_iMusMod = 1;
- ReSizeGLScene(form.Width, form.Height); // Resize The OpenGL Window
- }
- private void pictureBox1_MouseLeave(object sender, EventArgs e)
- {
- m_iMusDown = 0;
- }
- }
- }
|